简单的bootloader无法在真机上读取int 13h的扇区

时间:2015-02-11 08:06:49

标签: assembly interrupt bootloader bios usb-drive

我的简单引导程序代码有一个奇怪的问题 它应该通过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加载任何扇区时,会出现此错误消息。

任何想法可能出错?

1 个答案:

答案 0 :(得分:1)

与虚拟机相比,“真实”机器上有两件不同的东西:

首先:软盘驱动器可能会失败一段时间,直到他们真正读取数据,因为真正的软盘驱动器有机械延迟,而模拟驱动器没有延迟。因为你是从USB启动的,所以这不是原因。

第二:内存组件不是模拟的,而是真实的。您无法确定地址B800:0处的内存是否与真实计算机上的“普通”RAM相似。 B800:0不是“常规”RAM,而是图形RAM,其行为可能与常规RAM不同。尝试读取地址为9000:0,然后使用“REP MOVSW”将数据复制到B800:0。

相关问题