BIOS INT13h AH = 42小时与BOCHS

时间:2015-07-19 17:37:25

标签: assembly bios osdev bochs

我的引导加载程序代码出了问题。我尝试使用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)作为参考。

1 个答案:

答案 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)