我的引导加载程序代码出了问题。我尝试使用INT 13h AH = 42h:"从驱动器扩展读取扇区"版本3.0(EDD-3.0)的BIOS功能,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)作为参考。
答案 0 :(得分:1)
旧的BIOS不支持"扩展磁盘bios"完全没有功能。
后来的BIOS不支持最新BIOS版本的所有功能。
我确信即使是一些现代BIOS也不支持"平面目标地址"但只有段:偏移地址 - 和结构中的segment:offset字段是0xFFFF:0xFFFF。
这样的BIOS会识别地址0xFFFF:0xFFFF然后。
也许BOCHS模拟器中的BIOS就是那种。
顺便说一句:如果ES寄存器与控制包中给出的段不相同,我的电脑无法正常工作!
某些BIOS可能无法解决的其他问题是偏移部分的溢出(读取N个字节到地址A:B使得(B + N)> 0x10000)以及访问0x100000以上的内存((0x10 *) A + B + N)>的0x100000)