Project/OStrial in AMAZON

#n+4 하드디스크 쓰기

NONE_31D 2019. 12. 8. 21:04

하드디스크 쓰기를 구현해보도록 하자. 

 

 

#function.h - HDDwrite()

void HDDwrite(unsigned int sectorcharbuffer)
{

    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 - 10);
        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 를 확인해보면 섹터에는 문자열이 저장된 것을 확인할 수 있다.