Assembly BIOS INT13h AH=42h带BOCHS

Assembly BIOS INT13h AH=42h带BOCHS,assembly,bios,osdev,bochs,Assembly,Bios,Osdev,Bochs,我的引导程序代码有问题。我尝试使用3.0版(EDD-3.0)的INT 13h AH=42h:“从驱动器扩展读取扇区”BIOS功能和BOCHS,以实模式将内核代码从硬盘映像复制到0x100000以上的内存位置 当我使用INT13 AH=41h BX=55AAh函数检查是否支持EDD-3.0时,我得到了一个肯定的结果。我用的是Bochs2.6.8 Disk Address Packet: db 0x1C ; size of packet (I tried 18h as well) db 0

我的引导程序代码有问题。我尝试使用3.0版(EDD-3.0)的INT 13h AH=42h:“从驱动器扩展读取扇区”BIOS功能和BOCHS,以实模式将内核代码从硬盘映像复制到0x100000以上的内存位置

当我使用INT13 AH=41h BX=55AAh函数检查是否支持EDD-3.0时,我得到了一个肯定的结果。我用的是Bochs2.6.8

Disk Address Packet:
db  0x1C    ; size of packet (I tried 18h as well)
db  0x00    ; reserved
db  0x04    ; # blocks to transfer
db  0x00    ; reserved
dw  0xFFFF  ; offset
dw  0xFFFF  ; segment
dq  0x1     ; starting absolute block number (LBA)
dq  0x100000; 64-bit flat target address
我用这个DAP。BOCHS所做的是将4个块从磁盘复制到FFFF:FFFF mod 100000h=FFFH。我做错了什么?
我使用拉尔夫·布朗的中断列表()作为参考。

旧的bios根本不支持“扩展磁盘bios”功能

后来的BIOS不支持最新BIOS版本的所有功能

我敢肯定,即使是一些现代的bios也不支持“平面目标地址”,只支持段:偏移地址,而您的结构中的段:偏移字段是0xFFFF:0xFFFF

这样的BIOS将识别地址0xFFFF:0xFFFF

也许BOCHS模拟器中的BIOS就是这样的

顺便说一句:我有一台计算机,如果ES寄存器与控制数据包中给出的段不相同,则功能无法正常工作


某些BIOS可能无法使用的其他一些东西是偏移部分中的溢出(读取N个字节以寻址A:B,以便(B+N)>0x10000)以及访问0x100000以上的内存((0x10*A+B+N)>0x100000)。

“数据包大小”似乎与RBIL所说的不匹配???你是对的,我也尝试了0x18h,但它不起作用。所以这似乎不是问题所在。由于您试图写入0x1000000以上的位置,我想知道您在实模式下做了哪些工作以使其可访问…:)这就是重点:在实模式下,我无法将代码或数据移动到FFFFF H以上的位置,因此我尝试从BIOS获得帮助。有一些函数应该支持这一点,比如上面提到的INT 13h AH=42h函数,但你似乎不能依赖它们的存在或完整的实现:(Thx为你的答案。错误似乎是依赖于INT 13h AH=41h BX=55AAh返回的内容。我认为BOCHS有一个“干净的”实现了具有可靠功能的BIOS。我将寻找另一种解决方案…结果表明,INT13h AH=42h的RBIL不正确/是最新的。如果实现了对64位平面地址的支持,在调用INT13h AH=41h BX=55AAh后,在寄存器CX中设置了第四位。RBIL没有提到这一点,但本文提到:Thx供您帮助。请注意,大多数BIOS不实施EDD3扩展。