【问题标题】:Calculating Head, Cylinder (Track) and Sector for BIOS Interrupt 13h [duplicate]计算 BIOS 中断 13h 的磁头、圆柱体(轨道)和扇区 [重复]
【发布时间】:2012-01-12 18:09:26
【问题描述】:

我目前正在尝试通过学习开源代码来学习如何制作引导加载程序,并最终制作操作系统。我选择的项目是MikeOS:http://mikeos.berlios.de/

在阅读引导加载程序代码时,我卡在代码计算 BIOS INT 13h 调用的 Head/Cylinder/Sector 的部分,试图从磁盘读取根目录。

如果我理解正确的话,根目录从 Sector 19 开始。(Sector 0:引导记录,Sector 1 到 9:FAT12 副本 1,Sector 10 到 18:FAT12 副本 2)所以,我想在调用之后,例程的输出应该是:Head 0, Track 1, Sector 19

但是,当我进行计算时,我在相应的寄存器中获得了 Head 1 (DL)、Track 0 (CH)、Sector 2 (CL)。

我可能做错了,但这些数字是我应该得到的吗?我不质疑代码,因为它是一个工作代码。显然,我缺少一些关于分区表或磁盘寻址的概念。

谁能看到我可能做错了什么,以及如何纠正它?

例程如下图:(cmets由设计者编写)

通话前:

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

【问题讨论】:

    标签: assembly x86 interrupt bootstrapping bootloader


    【解决方案1】:

    请记住,CHS 内容仅适用于软盘。如今,您将使用 HDD 甚至 USB 设备,并且您的驱动器很可能会被格式化为 FAT32。

    此时,您必须使用 LBA 来计算您的 INT 13h 值:

    C = LBA ÷ (HPC × SPT)

    H = (LBA ÷ SPT) 模 HPC

    S = (LBA mod SPT) + 1

    例如,Sector 2048(第一个分区很可能是,例如使用 qemu-img)将是 CX = 0x0221 (C = 2, S = 21, H = 0)

    很遗憾,我花了一段时间才弄清楚这一点。我正在做 CHS 计算,但我得到了错误的值......

    【讨论】:

    • 不应该是CPH而不是HPC(CylindersPerHead而不是HeadsPerCylinder)吗?
    【解决方案2】:

    简单的答案是逻辑扇区 19 是第 20 个扇区(编号从 0 开始)。 每个磁道 20 除以 18 个扇区,余数为 2。扇区编号从 1 开始,因此扇区号为 2。软盘中只有一个物理磁盘,因此有 2 个面 - 磁头 0 和磁头 1。第二个扇区第 2 面是柱面 0(编号从 0 开始),第 2 面是磁头 1(编号从 0 开始)。 头 1 (DL)、气缸 0 (CH)、扇区 2 (CL)

    令人高兴的是,最​​新版本的 MikeOS 可以从 USB 闪存驱动器启动和运行。告别软盘(如果你能找到的话)。

    【讨论】:

    • 感谢迈克的友好回复。非常感谢。
    • 原来我错过了一个重要的事实。写入磁盘时,我认为数据首先填充磁头0并移动到磁头1。换句话说,我认为磁道1在磁头0上,而实际上它在磁头1上。我希望这有助于和我有同样问题或难以理解的人。
    • 磁道从 0 开始编号,从磁盘边缘开始向内移动。然后将磁头 0(磁盘的上表面)更改为磁头 1(磁盘的“另一侧”),磁道的编号再次从 0 开始。上磁道 0(被磁头 0 读取)和下磁道0(被磁头 1 读取)在同一个圆柱体中一个在另一个之上。因此,同一个柱面中的所有磁道具有相同的编号,但构成“层”,就像建筑物中的楼层一样。
    猜你喜欢
    • 2020-04-12
    • 2017-09-05
    • 2014-07-23
    • 1970-01-01
    • 2020-02-22
    • 2016-03-04
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多