我正在尝试将内核加载到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