1. 程式人生 > >硬碟定址 CHS LBA

硬碟定址 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數

這裡開始拋幾個小問題:

  1. 為什麼磁頭數為單數? 另外數值為什麼有255這麼“巨”大?
  2. 磁軌外圈與內圈周長 相差巨大,為什麼扇區數一樣? 且為什麼是 63 ?
  3. 為什麼我們實際計算的53686402560 bytes數 與 53687091200 bytes不相等?

    要解釋這幾個問題,我們還是一定要引出 磁碟定址 這個知識點。

    磁碟定址,意思就是kernel 如何找到 PBA(物理塊地址)的一種實現方式。
    主要有兩種 CHS(老式) 和 LBA

    CHS
    由於早期磁碟的每個磁軌的扇區數一樣多(外圈磁顆粒稀疏,耐用性強),
    整體磁碟空間大小也不大。所以在設計時用了24位來表示:10+8+6
    C, (柱面數) 可程式設計數為 2^10 =1024
    H, (磁頭數) 可程式設計數為 2^8 =256
    S, (扇區數) 可程式設計數為 2^6 =64
    由於1位用於特殊作用,均需要減1 即最大定址空間為:
    1023 255

    63 * 512 = 8414461440 bytes = 8G+

    很顯然隨著儲存需求增加,單塊磁碟的儲存空間已經有了很大量級的發展。
    其中物理特性裡,主要的幾個關鍵引數均有改變:

    磁盤面的磁顆粒為高密+磁頭更穩定更細(影響C)
    磁盤面的磁顆粒均勻分佈(影響S)
    磁碟增加磁碟盤面(影響H)
    改變後之前的演算法就不在適用於現在的這種結構了。所以就出了新的定址
    方式LBA 邏輯塊地址(從0開始計,一直到最後一個扇區)。

    但為了相容老式的計算方式以及更為顯示的體現硬碟物理構造形態(個人理解),還是會體現出CHS的資訊出來。

OK, 瞭解到這裡 最上面的幾個問題就很好解答了:
硬碟定址 CHS LBA

  1. 為什麼磁頭數為單數? 另外數值為什麼有255這麼“巨”大?
    這裡不是真實的磁頭數,只是為了在LBA換算成CHS時均用了CHS的最
    大值來轉換運算而已。如上面截圖一塊東芝3T的盤就是 8個盤面 16個磁頭數

  2. 磁軌外圈與內圈周長 相差巨大,為什麼扇區數一樣? 且為什麼是 63 ?
    同理63也不是真實是這樣,真實情況肯定是外圈扇區數比內圈大
  3. 為什麼我們實際計算的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