我目前正在尝试通过研究开源代码来学习如何制作引导加载程序,并最终学习操作系统。我选择的项目是MikeOS:http://mikeos.berlios.de/
当我读取引导加载程序代码时,我陷入了代码计算BIOS INT 13h
调用的Head / Cylinder / Sector的部分,试图从磁盘读取根目录。
如果我理解正确,根目录从扇区19开始。(扇区0:引导记录,扇区1到9:FAT12拷贝1,扇区10到18:FAT12拷贝2)所以,我想在通话结束后,例程的输出应为:头0,轨道1,扇区19
然而,当我按照计算时,我在相应的寄存器中获得Head 1(DL),Track 0(CH),Sector 2(CL)。
我可能做错了,但这些数字是我应该得到的吗?我不会质疑代码,因为它是一个有效的代码。显然,我遗漏了关于分区表或磁盘寻址的一些概念。
任何人都可以看到我可能做错了什么,以及如何纠正它?
例程如下所示:(评论由设计师撰写)
致电之前:
mov ax, 19 ; Root dir starts at logical sector 19
12hts: ; Calculate head, track and sector settings for int 13h
; IN: logical sector in AX, OUT: correct registers for int 13h
push bx
push ax
mov bx, ax ; Save logical sector
mov dx, 0
div word [SectorsPerTrack] ; First the sector
add dl, 01h ; Physical sectors start at 1
mov cl, dl ; Sectors belong in CL for int 13h
mov ax, bx
mov dx, 0 ; Now calculate the head
div word [SectorsPerTrack]
mov dx, 0
div word [Sides]
mov dh, dl ; Head/side
mov ch, al ; Track
pop ax
pop bx
mov dl, byte [bootdev] ; Set correct device
ret
bootdev db 0 ; Boot device number
SectorPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
答案 0 :(得分:0)
简单的答案是逻辑扇区19是第20个扇区(编号从0开始)。 每个磁道20除以18个扇区,结果为余数为2.扇区编号从1开始,因此扇区编号为2.软盘中只有一个物理磁盘,因此有2个边 - 头0和头1。第2个扇区第二侧是气缸0(编号从0开始),第二侧是头1(编号从0开始)。 头1(DL),气缸0(CH),扇区2(CL)
快乐的答案是最新版本的MikeOS将从USB闪存盘启动并运行。告别软盘(如果你能找到一张)。
答案 1 :(得分:0)
请记住,CHS的内容仅适用于软盘。如今,您将使用硬盘驱动器甚至USB设备,您的驱动器很可能会格式化为FAT32格式。
此时,您必须使用LBA来计算INT 13h值:
C = LBA÷(HPC×SPT)
H =(LBA÷SPT)mod HPC
S =(LBA mod SPT)+ 1
例如,扇区2048(第一个分区很可能是,例如使用qemu-img)将是CX = 0x0221(C = 2,S = 21,H = 0)
可悲的是,我花了一段时间来弄明白这一点。我正在进行CHS计算,我的错误值......