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這三個變量的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM