【发布时间】:2019-10-26 07:43:13
【问题描述】:
当我按下回车键时,我的引导加载程序必须进入内核,但它没有反应。 Bootloader位于第一个磁道的第一个扇区,磁头-0,但内核的地址是:扇区3,磁道-0,磁头1。
我什至将内核放在第一条轨道的第 5 个扇区。我已经有从软盘读取和写入的函数,尝试从位于我的内核的头 1 读取,并且它读取正确。但是当我在引导加载程序中放入相应的磁头、扇区和磁道时,在读取int 13h/ah=02h 时它什么也没做。
引导加载程序
readingProcess:
xor AX, AX
mov DS, AX
mov BX, 0060h
cli
mov ss,bx
mov sp,ax
sti
cld
mov AH, 02h
mov AL, 25
mov CH, 0
mov CL, 3
mov DL, 0
mov DH, 1
mov BX, 0060h
mov ES, BX
xor BX, BX
int 13h
;go to kernel
jmp 0060h:0000h
ret
所以,现在我真的不明白它是如何工作的,因为当我尝试向软盘写入磁头 1 时,它应该几乎在我的 .img 文件的中间,但它出现在我的开头的文件。我认为一定有一个公式可以帮助我找到正确的轨道和部门。
【问题讨论】:
-
需要检查的几件事:您将堆栈设置为 0060:0000。我认为这意味着您的堆栈中没有空间,因此
int 13h指令将引发异常,然后出现双重故障并停止。您没有检查来自int 13h的返回值来检查错误。您正在尝试读取 25 个扇区,从扇区 3 开始。IIRC,只有在您尝试读取的轨道上至少有 27 个扇区时才会起作用。 -
@1201ProgramAlarm :他已将堆栈设置为 0x0060:0x0000,这没关系。在 16 位实模式下 - 在第一次推送时 SP 将减 2,这会将 SP 包装到 0x0060:0xfffe。
-
你如何测试这个?在真实硬件上还是在模拟器/虚拟机中?如果是模拟器或虚拟机,是哪一个?如果在真实硬件上,您是作为 USB 媒体启动的吗?
-
在这个答案中有一些关于 LBA(逻辑块地址)到 CHS 计算的信息:stackoverflow.com/questions/45434899/…。 LBA 是一个介于 0 和磁盘上扇区之间的数字。如果您知道要读取的数据的 LBA 位置,您可以将其转换为 CHS,您是否知道每个媒体轨道的磁头和扇区数
-
避免在读取时越过磁道边界的最简单方法是一次读取/写入一个扇区。所以不是读取 25 个扇区,而是一次读取 25 个扇区 1。读取 1 个扇区永远不能跨越 Track 边界,否则您需要计算当前磁道上剩余的扇区数且不超过该数量,并且如果需要将磁盘读取拆分为多个读取。
标签: assembly nasm x86-16 bootloader bios