代码实现之磁盘的 LBA 寻址转换为 CHS 寻址

磁盘的 LBA 寻址转换为 CHS 寻址


引言:确切地说,不能说LBA 寻址方式的值转换为 CHS寻址方式的值,而由LBA则需要通过运算间接得出cylinder、head、sector这三个变量的值

1. 术语

  • cylinder:磁盘的柱面
  • head:磁盘的磁头,每张磁片有两个磁头
  • sector:磁盘扇区,这里指物理扇区,编号从 1 - 63,每条 track 的最大 sector 数 63
  • SPT(sector_per_track):每磁道上的 sector 数
  • HPC(head_per_cylinder):每个 cylinder 的 head 数量,这个数量应该是磁片数 * 2

2. LBA 寻址

LBA 全称为 Logical Block Addressing(逻辑块编址),LBA 扇区由 0 开始编址,LBA 扇区号的计算方式是:

LBA = (cylinder * HPC + head) * SPT + sector - 1

先计算出 track 数量,再加上物理扇区(物理扇区从 1 开始编号),转换为 LBA 扇区需要减 1

track 的数量计算方式为:cylinder * HPC(head_per_cylinder)+ head

3. LBA_to_CHS

这里以 floopy 为例,floopy 的是单磁片:

  • SPT 为 18
  • HPC 为 2

因此,假设 LBA 扇区是 1,那么:1 = (0 * 2 + 0) * 18 + 2 - 1 ,结果是:cylinder = 0,head = 0,sector = 2

3.1 计算 cylinder

cylinder 的计算方式为:

cylinder = LBA / (SPT * HPC)

我们需要计算出总共有多少 cylinder,因此我们的式子可以分解为:

  1. sector_per_cylinder = SPT * HPC: 计算出每个 cylinder 有多少个 sector,由 SPT * HPC 计算出
  2. cylinder = LBA / sector_per_clylinder: 第二步,再计算出在磁盘内需要多少个 cylinder 表达

以上面的例子:

  • cylinder = 1 / (18 * 2) = 0

计算出 cylinder 为 0

3.2 计算 head

计算 head 的式子为:

head = (LBA / SPT) % HPC

在已经求出 cylinder 的前提下,我们需要得出在一个 cylinder 内的 head 编号,因此我们的式子可以分解为:

  1. tatol_head = LBA / SPT:我们得出在磁盘内总共有多少 head
  2. head = total_head % HPC: 第二步,再计算出在一个 cylinder 内的 head 编号

以上面的例子:

  • head = (1 / 18) % 2 = 0

3.3 计算 sector

计算 sector 的式子为:

sector = LBA % SPT + 1

我们的式子可以分解为:

  1. logical_sector = LBA % SPT: 通过对 LBA 取 SPT 模操作得出逻辑的 sector 号
  2. sector = logical + 1: 物理的 sector 等于逻辑的 sector 加上 1,因为物理 sector 从 1 开始编号,而逻辑 sector 从 0 开始编号

3.4 对计算 Cylinder/Head/Sector 的优化

我们看到这三个式子就都有共同的部分:LBA / SPT(或者 LBA % SPT),我们对这些进行优化,下面是我的实现代码:

;#########################################################
; lba_to_chs.inc for boot
;
;  Copyright (c) 2009-2011                                     
;  All rights reserved.                                        
;  mik                                                         
;  visit web site : www.mouseos.com/OS/doc/index.html
;
;#########################################################

 

%ifndef LBA_TO_CHS_INC
%define LBA_TO_CHS_INC

 

;*******************************************************
; LBA_to_CHS() - LBA Converting CHS for floppy diskette
;
; description:
; input:
;        ax - LBA sector
;
; output:
;        ch - cylinder
;        cl - sector ( 1 - 63)
;        dh - head
;*******************************************************

LBA_to_CHS:

%define SPT        18
%define HPC        2


        mov cl, SPT
        div cl                           ; al = LBA / SPT, ah = LBA % SPT


; cylinder = LBA / SPT / HPC

        mov ch, al
        shr ch, (HPC / 2)                ; ch = cylinder               


; head = (LBA / SPT) % HPC
       
        mov dh, al
        and dh, 1                        ; dh = head


; sector = LBA % SPT + 1

        mov cl, al
        inc cl                           ; cl = sector

        ret

 

 

%endif

上面的代码很精简,只有 8 条指令 :)

小结:

不管CHS(寻址方式)也好,还是LBA寻址方式)也好。磁盘存储寻址都需要通过cylinder、head、sector这三个变量来实现;CHS、LBA都是一个数字,CHS按照固定格式把24个bit位分成cylinder、head、sector;LBA则需要通过求模运算得出cylinder、head、sector。即由chs值可以直接获得cylinder、head、sector这三个变量的值,而LBA则需要通过运算间接得出cylinder、head、sector这三个变量的值



参考:http://www.mouseos.com/os/doc/lba_to_chs.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值