BIOS INT13h AH=42h 带 BOCHS
BIOS INT13h AH=42h with BOCHS
我的引导加载程序代码有问题。我尝试使用 INT 13h AH=42h: "Extended Read Sectors From Drive" 3.0 (EDD-3.0) 版本的 BIOS 功能和 BOCHS 将我的内核代码从硬盘映像复制到 0x100000 以上的内存位置 real mode.
当我使用 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) 作为参考。
旧的 BIOS 根本不支持 "extended disk bios" 功能。
后来的 BIOS 不支持最新 BIOS 版本所具有的所有功能。
我敢肯定,即使是一些现代 BIOS 也不支持 "flat target addresses",而只支持 segment:offset 地址 - 而您的结构中的 segment:offset 字段是 0xFFFF:0xFFFF。
这样的 BIOS 将识别地址 0xFFFF:0xFFFF 然后。
可能BOCHS模拟器中的BIOS就是这种
顺便说一句:如果 ES 寄存器与控制包中给定的段不一致,我的计算机功能将无法正常工作!
其他一些可能不适用于某些 BIOS 的东西是偏移部分的溢出(读取 N 字节到地址 A:B 以便 (B+N)>0x10000)以及访问 0x100000 以上的内存( (0x10*A+B+N)>0x100000).
我的引导加载程序代码有问题。我尝试使用 INT 13h AH=42h: "Extended Read Sectors From Drive" 3.0 (EDD-3.0) 版本的 BIOS 功能和 BOCHS 将我的内核代码从硬盘映像复制到 0x100000 以上的内存位置 real mode.
当我使用 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) 作为参考。
旧的 BIOS 根本不支持 "extended disk bios" 功能。
后来的 BIOS 不支持最新 BIOS 版本所具有的所有功能。
我敢肯定,即使是一些现代 BIOS 也不支持 "flat target addresses",而只支持 segment:offset 地址 - 而您的结构中的 segment:offset 字段是 0xFFFF:0xFFFF。
这样的 BIOS 将识别地址 0xFFFF:0xFFFF 然后。
可能BOCHS模拟器中的BIOS就是这种
顺便说一句:如果 ES 寄存器与控制包中给定的段不一致,我的计算机功能将无法正常工作!
其他一些可能不适用于某些 BIOS 的东西是偏移部分的溢出(读取 N 字节到地址 A:B 以便 (B+N)>0x10000)以及访问 0x100000 以上的内存( (0x10*A+B+N)>0x100000).