2

我的引导加载程序代码有问题。我尝试使用 INT 13h AH=42h: "Extended Read Sectors From Drive" BIOS 3.0 版 (EDD-3.0) 和 BOCHS 将我的内核代码从硬盘映像复制到实模式下 0x100000 以上的内存位置。

当我使用 INT13 AH=41h BX=55AAh 函数检查是否支持 EDD-3.0 时,我得到了肯定的结果。我正在使用 BOCHS 2.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 = FFEFh。我究竟做错了什么?我使用 Ralf Brown 的中断列表 ( http://www.ctyme.com/intr/rb-0708.htm ) 作为参考。

4

1 回答 1

1

旧的 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)。

于 2015-07-19T19:40:11.710 回答