1. 程式人生 > 實用技巧 >LBA和CHS轉換(轉)

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 全稱為LogicalBlockAddressing(邏輯塊編址),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這三個變數的值。