하드디스크 쓰기를 구현해보도록 하자.
#function.h - HDDwrite()
void HDDwrite(unsigned int sector, char* buffer)
{
unsigned char LBA_a = sector & 0xFF;
unsigned char LBA_b = (sector >> 8) & 0xFF;
unsigned char LBA_c = (sector >> 16) & 0xFF;
unsigned char LBA_d = ((sector >> 24) & 0x0F) | 0xE0;
__asm__ __volatile__
(
"mov al, 0;"
"mov dx, 0x3F6;"
"out dx, al;"
);
while (HDD_BSY() == 1);
__asm__ __volatile__
(
"mov al, %0;"
"mov dx, 0x1F6;"
"out dx, al;"::"r"(LBA_d)
);
__asm__ __volatile__
(
"mov al, 0x01;"
"mov dx,0x1F2;"
"out dx, al;"
);
__asm__ __volatile__
(
"mov al, %0;"
"mov dx,0x1F3;"
"out dx, al;" ::"r"(LBA_a)
);
__asm__ __volatile__
(
"mov al, %0;"
"mov dx,0x1F4;"
"out dx, al;" ::"r"(LBA_b)
);
__asm__ __volatile__
(
"mov al, %0;"
"mov dx,0x1F5;"
"out dx, al;" ::"r"(LBA_c)
);
while ((HDD_BSY() == 1) || (HDD_DRDY() == 0));
// 0x30 : write
__asm__ __volatile__
(
"mov al, 0x30;"
"mov dx,0x1F7;"
"out dx, al;"
);
if (HDD_ERR() == 1)
{
kprintf("Error!!", videomaxline - 1, 0);
return;
}
while (HDD_DRQ() == 0);
__asm__ __volatile__("mov dx,0x1F0;");
__asm__ __volatile__("mov esi, %0;" : : "r"(buffer));
__asm__ __volatile__("mov ecx, 256");
__asm__ __volatile__("rep outsw");
}
- 0x30 : write 명령
이를 검증할 수 있는 쉘 명령어를 만든다.
#shell.c - sh_HDDwrite()
void sh_HDDwrite()
{
unsigned char test[512] = "Hello world!";
HDDwrite(2, test);
HDDwrite(3, test);
}
#main.c - translate_shell()
void translate_shell()
{
if (keyboard[0] == 0) { return; } // 명령어 없이 그냥 ENTER 침
if (kstrcmp(keyboard, "clear")) { sh_clear(); return; }
if (kstrcmp(keyboard, "version")) { sh_version(); return; }
if (kstrcmp(keyboard, "read")) { sh_HDDread(); return; }
if (kstrcmp(keyboard, "write")) { sh_HDDwrite(); return; }
kprintf("There is no such command.",++curline, 0);
}
- write 를 치면 shHDDwrite() 함수가 실행될 수 있도록 쉘 명령어를 구현해준다.
hdd.img를 먼저 확인해보면 섹터 2와 3이 다음과 같이 비어있는 것을 확인할 수 있다.
Qemu 를 통해 확인해보면 아무것도 쓰이지 않는다. 하지만 hdd.img 를 확인해보면 섹터에는 문자열이 저장된 것을 확인할 수 있다.
'Project > OStrial in AMAZON' 카테고리의 다른 글
#n+3 하드디스크 드라이버 - 읽기 (0) | 2019.12.08 |
---|---|
#n+1 이제 키보드 입력을 통한 쉘을 만들어봅시다. (0) | 2019.11.24 |
#n 중간 건너뛰고 키보드 드라이버 처리 (0) | 2019.11.24 |
#5 C언어로 개발하기! (0) | 2019.10.16 |
#4 어셈블리_함수 (0) | 2019.10.16 |