使用INT 13h / AH = 2将内核读入1MB以上的内存

时间:2017-08-27 02:05:50

标签: linker x86 kernel disk

我正在尝试将内核加载到0x100000,这是低内存之后的可用空间的底部。我尝试使用的代码是:

mov dl, 0x80
xor bx, bx
mov cl, 3

pusha
mov es, bx
mov al, 128
mov bx, 0x8000
call readDisk

add bx, 0x0800

mov ecx, 9
.readSectors:
  add bx, 0x1000
  mov es, bx
  xor bx, bx
  mov al, 128
  call readDisk
  loop .readSectors

popa

我的readDisk功能

readDisk:
pusha

mov ah, 0x02
mov ch, 0
mov dh, 0

int 0x13

jc disk_err:
popa
ret

disk_err打印错误消息的位置。

这背后的想法是地址指针的段改变了 允许我使用分段将1MB读入内存(0x100000)。数学计算的方法是每次通过向bx添加0x1000,该段增加0x10000,相当于128个扇区(每个512字节)。这样做9次应该读取比读取1MB磁盘所需的扇区多64个扇区。

问题是为什么这不起作用?当我在QEmu中运行它时,CPU三重故障到达" jmp 0x100000"在长模式下。我通过将跳转位置更改为0x8000进行了一些调试,这是下一个扇区,我得到了相同的结果。对我来说,这意味着CPU认为我试图跳到某个不存在的地方,这表明我的代码读取的磁盘高达1MB并不能正常工作。

增加:

我也尝试在0x100000处启动我的读取磁盘,而不是尝试读取所有扇区,直到该点。这看起来像

pusha
mov bx, 0xff00
mov es, bx
xor bx, bx  ; address buffer is now 0xff00:0x1000
mov al, 10
call readDisk

popa

; switch to long mode down here.... I know this works

[bits 64]
LongMode:

jmp 0x100000

times 1048576 - ($-($$ + 512)) db 0

0 个答案:

没有答案