來源 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,因此我們的式子可以分解為:
- sector_per_cylinder = SPT * HPC: 計算出每個 cylinder 有多少個 sector,由 SPT * HPC 計算出
- cylinder = LBA / sector_per_clylinder: 第二步,再計算出在磁盤內需要多少個 cylinder 表達
以上面的例子:
- cylinder = 1 / (18 * 2) = 0
計算出 cylinder 為 0
3.2 計算 head
計算 head 的式子為:
head = (LBA / SPT) % HPC |
在已經求出 cylinder 的前提下,我們需要得出在一個 cylinder 內的 head 編號,因此我們的式子可以分解為:
- tatol_head = LBA / SPT:我們得出在磁盤內總共有多少 head
- head = total_head % HPC: 第二步,再計算出在一個 cylinder 內的 head 編號
以上面的例子:
- head = (1 / 18) % 2 = 0
3.3 計算 sector
計算 sector 的式子為:
sector = LBA % SPT + 1 |
我們的式子可以分解為:
- logical_sector = LBA % SPT: 通過對 LBA 取 SPT 模操作得出邏輯的 sector 號
- sector = logical + 1: 物理的 sector 等於邏輯的 sector 加上 1,因為物理 sector 從 1 開始編號,而邏輯 sector 從 0 開始編號
3.4 對計算 Cylinder/Head/Sector 的優化
我們看到這三個式子就都有共同的部分:LBA / SPT(或者 LBA % SPT),我們對這些進行優化,下面是我的實現代碼:
;#########################################################
%ifndef LBA_TO_CHS_INC
;******************************************************* LBA_to_CHS: %define SPT 18
mov ch, al
mov cl, al 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這三個變量的值。