0

プロテクト モードからファイルをロードする ATA PIO ドライバーを作成しようとしましたが、ポートから受信したすべてのデータがゴミのように見えます ( 0xffff)。

PIO ドライバーを作成するのはこれが初めてなので、自分が何をしているのかよくわかりません。28 ビット PIO を機能させるために、OsDev のリンクをたどっています。( https://wiki.osdev.org/ATA_PIO_Mode#28_bit_PIO )

以下は、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);
}    

そして、私のasmから私はこれを次のように呼び出します:

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 の値を確認しました。dl の値は080h、qemu がハードディスクから起動するように設定されています。

4

0 に答える 0