(ATA PIO) Мусор читает из порта

Я пытался написать драйвер ATA PIO для загрузки файлов из защищенного режима, но может показаться, что все данные, которые я получаю из порта, являются мусором (0xffff).

Я впервые пишу драйвер PIO, поэтому я не совсем уверен, что я делаю правильно. Я перешел по ссылке от OsDev, чтобы заставить работать 28-битную PIO. ( https://wiki.osdev.org/ATA_PIO_Mode)

Вот фрагмент кода, который пытается загрузить первый сектор, используя чтение PIO.

extern void ata_disk_wait();
extern void ata_drq_wait();

void read_sector(uint32_t sector)
{
    ata_disk_wait(); // wait BSY to 0 and RDY to 1
    outb(0x1F6, sector >> 24 | 0xE0);// Master drive
    outb(0x1F2, 1); // Read one sector
    outb(0x1F3, sector);
    outb(0x1F4, sector >> 8);
    outb(0x1F5, sector >> 16);
    // Make a read call
    outb(0x1F7, 0x20);
    // transfere
}

void read_kernel(uint32_t address, uint32_t sector)
{
    read_sector(sector);
    ata_disk_wait();
    ata_drq_wait();// wait DRQ to 1
    // copy to address
    // insw(0x1F0, (uint32_t)address, 512/2);
}

void
boot_main()
{
    byte *address = (byte *)0x10000; // Save kernel at address
    read_kernel((uint32_t)address, 1);
}    

и из моей ассм я называю это так:

mov     sp, 07c00h
call    boot_main

;; get data from port
mov     dx, 01F0h
xor     eax, eax
in      al, dx
mov     [010000h], al

Вот функции disk_wait и drq_wait:

    global ata_drq_wait
ata_drq_wait:
    pusha
    xor al, al
    mov dx, 01F7h
.loop:   
    in  al, dx
    test al, 008h
    jz .loop
.end:
    popa
    ret


    global ata_disk_wait
ata_disk_wait:
    pusha
    xor ax, ax
    mov dx, 01F7h
.loop:
    in  al, dx
    and al, 0C0h
    cmp al, 040h
    jne .loop
.end:
    popa
    ret

Но все данные, которые я получаю, похоже, 0xffff,

Я проверил значение boot_disk в моем загрузчике. и значение дл 080h поэтому QEMU загружается с жесткого диска.

0 ответов

Другие вопросы по тегам