硬碟定址 CHS LBA
近期回顧了下HDD磁碟的結構原理,重新又發現幾個比較有意思的問題
稍作整理記錄一下。
【背景資訊】fdisk -l 命令返回(rhce 7以下)
[[email protected]_0_15_centos ~]# fdisk -l
Disk /dev/vda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00086547
寫在前面 先翻譯幾個單詞:
-
heads: 頭部 --->這裡理解為磁頭數
(PS,HDD中讀寫磁頭是分開的,寫+讀為一組,這裡表示磁頭組數,即盤面數 , 一個盤有兩個面) - sectors / track:扇形 / 小道 --->這裡理解為磁軌
- cylinders :圓柱 --->這裡理解為柱面
由上面的命令輸出可以很直觀的瞭解到這個分割槽的大小為:53687091200 bytes
即: 255 heads 63 sectors/track 6527 cylinders = 104856255(總sectors數)
104856255 * 512 = 53686402560 bytes數
這裡開始拋幾個小問題:
- 為什麼磁頭數為單數? 另外數值為什麼有255這麼“巨”大?
- 磁軌外圈與內圈周長 相差巨大,為什麼扇區數一樣? 且為什麼是 63 ?
-
為什麼我們實際計算的53686402560 bytes數 與 53687091200 bytes不相等?
要解釋這幾個問題,我們還是一定要引出 磁碟定址 這個知識點。
磁碟定址,意思就是kernel 如何找到 PBA(物理塊地址)的一種實現方式。
主要有兩種 CHS(老式) 和 LBACHS
由於早期磁碟的每個磁軌的扇區數一樣多(外圈磁顆粒稀疏,耐用性強),
整體磁碟空間大小也不大。所以在設計時用了24位來表示:10+8+6
C, (柱面數) 可程式設計數為 2^10 =1024
H, (磁頭數) 可程式設計數為 2^8 =256
S, (扇區數) 可程式設計數為 2^6 =64
由於1位用於特殊作用,均需要減1 即最大定址空間為:
1023 255很顯然隨著儲存需求增加,單塊磁碟的儲存空間已經有了很大量級的發展。 其中物理特性裡,主要的幾個關鍵引數均有改變:
磁盤面的磁顆粒為高密+磁頭更穩定更細(影響C)
磁盤面的磁顆粒均勻分佈(影響S)
磁碟增加磁碟盤面(影響H)
改變後之前的演算法就不在適用於現在的這種結構了。所以就出了新的定址
方式LBA 邏輯塊地址(從0開始計,一直到最後一個扇區)。但為了相容老式的計算方式以及更為顯示的體現硬碟物理構造形態(個人理解),還是會體現出CHS的資訊出來。
OK, 瞭解到這裡 最上面的幾個問題就很好解答了:
-
為什麼磁頭數為單數? 另外數值為什麼有255這麼“巨”大?
這裡不是真實的磁頭數,只是為了在LBA換算成CHS時均用了CHS的最
大值來轉換運算而已。如上面截圖一塊東芝3T的盤就是 8個盤面 16個磁頭數 - 磁軌外圈與內圈周長 相差巨大,為什麼扇區數一樣? 且為什麼是 63 ?
同理63也不是真實是這樣,真實情況肯定是外圈扇區數比內圈大 - 為什麼我們實際計算的53686402560 bytes數 與 53687091200 bytes不相等?
這個個人是這樣理解:Units = cylinders of 16065 512 = 8225280 bytes
CHS的一個最小計算單元,即一1個柱面所擁有的扇區數: 255 63 = 16065
那麼在LBA上表示出CHS時肯定以LBA為準,CHS作為參考。為此當有零頭數時,就直接去掉不在CHS上做顯示處理。實際情況中LBA總扇區數幾乎一定不是 16065的倍數,所以我們用CHS去計算總大小時會比LBA的值稍小一點。範圍是在(1~16064) * 512