[英]Reading data from HDD without BIOS interrupts DRQ bit not setting
重要说明:此代码将导致媒体无法使用,而无需格式化或恢复。 使用未使用的,空的或不需要的介质。
复制BIOS中断功能的行为应该很简单,但是在现实使用场景中,在线获取有关BIOS中断功能的信息并不足够。 因此,我编写了代码以读取2.5英寸硬盘驱动器标识信息,这是int 13h的功能。在检查0x1f7状态寄存器的DRQ(准备查询的数据?)位的阶段,我挂了起来。在check-DRQ循环中,代码继续执行,但是数据全为0,可能是因为未读取。我尝试了改变从机和主机位以及主要/辅助总线...辅助总线通过了DRQ检查但数据似乎全为1。重要的是,在同一驱动器和同一台机器上的int 13h正常工作。有人知道是否有以下方法:a)知道硬盘的ide位置(主要/次要,主/从)那正在引导,然后b)测试它是否存在而没有读取它,并且c)弄清楚如何使DRQ位变为绿色?错误寄存器在DRQ发出之前是否有意义?
有趣的是,BIOS向我显示了除USB,DVD和LAN条目之外的3个HDD,但是我只有两个用于硬盘驱动器的插槽。 而且我永远都无法插入我的HDD,因此它就是HDD1。 奇怪 这可能有关吗?
这是我的可启动代码,可使用控制寄存器从ATA HDD主主机读取,并将其几个字节作为二进制数字显示在屏幕上:
[bits 16]
[org 0x7c00]
xor ax, ax
cli
mov dx, 0x1f7
m1:
in al, dx
test al, 010000000b
jnz m1
mov dx, 0x1f6
mov al, 0xE0 ; LBA mode - not needed for this?
out dx,al
mov dx, 0x1f7
m2:
in al, dx
test al, 010000000b ; wait for BSY to be 0
jnz m2
test al, 001000000b ; wait for DRDY to be 1
jz m2
mov dx, 0x1f7
mov al, 0xEC ; identify drive command
out dx, al
mov dx, 0x1f7
m3:
in al, dx
test al, 010000000b
jnz m3
mov dx, 0x1f7
m4:
in al, dx
test al, 000001000b ; this test for DRQ never turns 1
jz m4
mov ax, 0
mov es, ax
mov di, 0x7e00 ;save the identification to 0x7e00
mov dx, 0x1f0
mov cx, 256
rep insw
mov ax, 0xb800 ; display in table of binary bytes
mov es, ax
mov di, 0
mov ax, 0
mov ds, ax
mov si, 0x7e00 ;starting RAM address to read
mov cx, 0
mov dl, 20 ;how many lines to print
morelines:
mov bh, 7 ;how many bytes per line
morebytes:
mov ah, [ds:si]
mov bl, 8 ;counter for bits of each byte to print
morebits:
shl ah, 1
mov al, 48
jnc zero
mov al, 49
zero:
mov [es:di], al
inc di
inc di
dec bl
jnz morebits
mov al, 32
mov [es:di], al
inc di
inc di
inc si
dec bh
jnz morebytes
add cx, 80*2
mov di, cx
dec dl
jnz morelines
times 510 - ($ - $$) db 0
dw 0xaa55
复制BIOS中断功能的行为应该很简单,但是在现实使用场景中,在线获取有关BIOS中断功能的信息并不足够。
不,绝对不是。
例如,要重新创建(由于历史限制和“浪费时间,如果有更好的CPU完成,浪费CPU时间轮询以完成IO”设计愚蠢)设计inio int 0x13
接口,则需要int 0x13
接口:
这加起来比512字节启动加载程序所能容纳的代码更多,这引出了一个问题:“如果可以使用BIOS加载处理设备所需的代码,为什么不能使用BIOS加载启动所需的代码?内核和正常的设备驱动程序不吸?”。
请注意,在大多数情况下(例如,所有SCSI,所有RAID),BIOS仅使用设备制造商提供并包含在其ISA / PCI卡中的ROM,因此BIOS本身没有用于设备的任何代码。 。
您可能正在使用插入SATA0端口而不是HDD的DVD驱动器。 在这种情况下,命令0xA1(标识包设备)将返回标识数据。
对于SATA1-SATA3端口,请尝试设置寄存器0x1F6的位4(驱动器选择),或使用@rcgldr建议的0x170-0x177寄存器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.