• LBA和CHS转换(转)


    来源    https://www.cnblogs.com/wangshuo/p/10454222.html

    这里有更详细的计算   https://blog.csdn.net/haiross/article/details/38661051

    这里做记录一下,总是忘记如何计算

    磁盘填充,先填满一个柱面之后,再填下一个柱面。LBA是从0开始的。

    LBA = (C-CS)*HPC*SPT + (H-HS)*SPT + (S-SS)
    
    C, H, S: 当前的CHS值   柱面  磁头 扇区
    CS, HS, SS: Cylinder, Head, Sector的起始(start)编号。一般来说,CS=0,HS=0,SS=1   , 扇区从1开始编号
    HPC: Heads Per Cylinder,每个柱面磁头数,也就是每个柱面磁道数   (一个柱面(圆环),一般都是正反两面,也就需要上下两个磁头)

    SPT: Sectors Per Track,每个磁道扇区数 SPT > (S-SS) 一定成立 HPC > (H-HS) 一定成立 一般来说,CS=0,HS=0,SS=1,因此可以得出

    假如硬盘的配置为C(柱面数),H(磁头数),S(扇区数)
    那么:
    1柱面(Cylinder)有H个磁道(Track)
    1磁道(Track)有S个扇区(Sector)
    1扇区(Sector)有512字节
    LBA = C*HPC*SPT + H*SPT + (S-1)

    以及 HPC > (H-0),即 HPC > H 因此: S = LBA%SPT + 1 H = LBA/SPT%HPC C = LBA/SPT/HPC 软盘中,HPC=2,所以: C = (LBA/SPT) >> 1 H = (LBA/SPT) & 1

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

    https://blog.csdn.net/haiross/article/details/38661051

    引言:确切地说,不能说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这三个变量的值。

     
  • 相关阅读:
    (转)ASP连接sql server实例解析
    (转)ASP与sql存储过程
    将博客搬至CSDN
    详细解析Java中抽象类和接口的区别
    蔬菜销售策划
    医学学习
    mlecms v2.2版权
    网页打印设置
    silverlight RadGridView总结系列(转载)
    silverlight RadGridView总结二(转载)
  • 原文地址:https://www.cnblogs.com/davytitan/p/13354150.html
Copyright © 2020-2023  润新知