繁体   English   中英

在没有BIOS的情况下从HDD读取数据不会中断DRQ位

[英]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接口:

  • 旧版/ ISA软盘控制器,软盘驱动器,磁带驱动器
  • 旧版/ ISA“并行ATA”控制器,ATA磁盘驱动器和ATAPI CD-ROM
  • 大约50种不同的传统/ ISA“并行ATA” RAID控制器
  • 80个不同的旧版/ ISA SCSI控制器
  • 3种不同的USB控制器,USB软盘驱动器,USB大容量存储设备
  • SATA / AHCI
  • 大约20种不同的PCI SCSI控制器
  • 大约30种不同的PCI(SATA,SAS)RAID控制器
  • NVMe
  • 一堆设备枚举代码(例如,扫描PCI总线并找出其中有哪些设备,等等)
  • 以上所有内容都取决于(例如内存管理,IRQ处理等)

这加起来比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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM