linux內核原理剖析——磁盤尋址、分區

繼上一篇<<linux內核原理剖析——內存尋址(一)>>之後,發現大家
對底層技術關注度比較高之後,今天繼上一篇的內存尋址一文後,補
充一篇關於更爲底層的——磁盤尋址,讓我們更清楚的瞭解計算機在
硬盤上是如何尋址的。

磁盤模型

磁盤結構

上圖顯示了計算機系統中磁盤的形態。其中磁盤會在主軸上通過機械搖臂旋轉,一個磁盤上下會有2個磁頭(圖中爲了方便,只畫了一個),當旋轉時,磁頭在磁盤上畫出磁道(一個磁盤上有多個磁道),每個磁道的立面稱爲柱面,兩個磁道之間會分割成一小塊一笑塊區域,稱爲扇區。

尋址方式

數據是存儲在計算機的磁盤上的,那麼cpu是如何通過內存在磁盤上找到需要找的數據呢?答案當然也是需要尋址的,即爲磁盤尋址。磁盤尋址分爲CHS和LBA。

CHS

最開始我們的磁盤有8個磁片,每個磁片上有2個磁頭,每個磁片上有21024個磁道,每個磁道有63個扇區,每個扇區大小相等,爲512byte。即整個磁盤大小:82102463*512byte = 500M。但是我們會發現個問題,如果每個磁道都是63個扇區,那麼外層磁道分的每個扇區一定是要比內層磁道分的每個扇區要大,所有爲了保證每個扇區大小相等,外層扇區採用稀疏的存儲方式存儲,但是這樣浪費了存儲空間,所有產生了LBA。在聊LBA之前,我們先看下CHS是如何尋址的。

磁道是有編號的,最外層磁道編號爲0,然後依次爲1、2、3…越靠近圓心的磁道編號越大。

扇區:每個磁道的扇區也是從0開始編號,0、1、2、3…

CHS是柱面 磁道 扇區的縮寫,用CHS方式表示的地址爲0/0/1,那麼表示當前的物理地址所對應的是第0個柱面第0個磁道上的第一個扇區,那麼即定位到了尋址0/0/1所對應的物理位置爲第0個柱面的第0個磁道的第一個扇區。

LBA

目前我們的磁盤和之前有所不同,盤片外層的磁道劃分的扇區數多於內層的扇區,這樣內外層扇區大小就保持了一致。

扇區編號方式也有所不同,扇區編號從0開始,0盤片0磁道第一個扇區爲0,第二個扇區爲1,以此類推。如0磁道扇區範圍爲0-127,那麼1磁道的扇區就從128開始,即可能128-256。因此要定位某個磁盤的位置,只需給出扇區編號即可。

LBA線性地址的計算公式爲:磁頭數 × 每磁道扇區數 × 當前所在柱面號 + 每磁道扇區數 × 當前所在磁頭號 + 當前所在扇區號 – 1

例如:CHS=0/0/1,則根據公式可以LBA=255 × 63 × 0 + 63 × 0 + 1 – 1= 0

也就是說物理0柱面0磁頭1扇區,是邏輯0扇區。

磁盤分區

在我們計算機中,利用磁盤是需要分區的,比如我們windows操作系統,在做系統時,可分爲c、d、e、f盤,這就是對磁盤的分區。磁盤分區的最小單位是柱面,如c盤可以對應磁盤的0-100柱面,d盤對應101-200柱面… …以此類推。

但磁盤的0扇區是不可使用的,它需要存放主引導程序,446byte。剩下的64byte是存放分區表的。

主引導程序:系統啓動的時候負責加載啓動菜單。引導每個分區的引導程序啓動。

分區表:記錄着基本分區表信息。

因爲一個分區表只有64byte,所以一個分區表只能記錄4個分區信息,所以要分出更多的分區,那麼就需要在分區表中拿出一個分區記錄單獨記錄拓展分區的信息。

分區結構
上圖描述了基本分區和擴展分區的結構關係,主引導記錄中存放主引導程序和分區記錄,分區記錄中分別記錄了每個分區的信息,記錄了每個分區的指針。圖中列舉了3個基本分區和2個擴展分區,其中擴展分區也有單獨的擴展分區表來記錄擴展分區信息,見下圖。
擴展分區
拓展分區中,每一個擴展分區中都包含了分區表,也是4個分區表項,分區表項1記錄當前分區的信息,指向當前分區,分區表項2指向下一個擴展分區,分區表項3和4未使用,這樣就構建了一個單向鏈表,來記錄分區之間的關係。

最後

如果本文對你有價值,哪怕一點點,請記得關注、點贊,有不足或疑問之處請留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章