我的简单引导程序代码有一个奇怪的问题 它应该通过BIOS中断13h函数02h从磁盘读取扇区进入文本模式的视频内存(只是为了查看它是否工作)。它在仿真器(Bochs,QEmu)上运行得非常好,但是当我尝试从附加到真机(Acer Extensa 5620Z)的pendrive启动它时,它只是清除屏幕并打印出来:
PCI System Error on Bus/Device/Function 0000h
PCI System Error on Bus/Device/Function 0200h
并且它似乎无法加载任何数据。调用该中断后没有进位标志设置,AH中没有错误代码,只有1(假设是读取的扇区数)。
以下是代码的相关部分:
mov bootdev, %dl # Device we're booting from.
# ES=B800 (video memory segment in mode 03h)
mov $0xB800, %ax
mov %ax, %es
# Read one block.
mov $0x0001, %cx # C:0, S;1
mov $0x00, %dh # H:0
xor %bx, %bx # ES:BX = B800:0000 = output buffer.
mov $0x0201, %ax # Function 02h: read sectors (just one).
stc
int $0x13 # Disk controller BIOS interrupt.
jc error # On error, print an error message.
我们启动的设备号来自BIOS本身(DL
),并存储在bootdev
中供以后使用。这个数字似乎没问题,我可以调用中断13h的函数08h来从中获取正确的驱动几何。当我尝试使用功能02h加载任何扇区时,会出现此错误消息。
任何想法可能出错?
答案 0 :(得分:1)
与虚拟机相比,“真实”机器上有两件不同的东西:
首先:软盘驱动器可能会失败一段时间,直到他们真正读取数据,因为真正的软盘驱动器有机械延迟,而模拟驱动器没有延迟。因为你是从USB启动的,所以这不是原因。
第二:内存组件不是模拟的,而是真实的。您无法确定地址B800:0处的内存是否与真实计算机上的“普通”RAM相似。 B800:0不是“常规”RAM,而是图形RAM,其行为可能与常规RAM不同。尝试读取地址为9000:0,然后使用“REP MOVSW”将数据复制到B800:0。