计算BIOS中断的磁头,气缸(磁道)和扇区13h

时间:2012-01-12 18:09:27

标签: assembly x86 interrupt bootstrapping bootloader

我目前正在尝试通过研究开源代码来学习如何制作引导加载程序,并最终学习操作系统。我选择的项目是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

2 个答案:

答案 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计算,我的错误值......