充一篇關於更為底層的——磁碟定址,讓我們更清楚的了解計算機在
硬碟上是如何定址的。
上圖顯示了計算機系統中磁碟的形態。其中磁碟會在主軸上通過機械搖臂旋轉,乙個磁碟上下會有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。因此要定位某個磁碟的位置,只需給出扇區編號即可。
例如: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未使用,這樣就構建了乙個單向鍊錶,來記錄分割槽之間的關係。
linux核心原理剖析 記憶體定址(一)
最近總想分享點硬核的原創文章出來,一是硬核技術是乙個程式設計師真正應該修煉 的內功 二是修煉硬核技能是通往架構師領域的必經之路。本系列文章將分享關 於linux核心設計原理相關的內容,希望能打通我們的七經八脈,真正領悟底層系 所謂記憶體定址,簡單說來就是cpu接受到指令後需要從記憶體中取得相應資料,...
linux核心剖析之main c
main函式主要做一些初始化,比如記憶體,塊裝置 字元裝置等的初始化,然後建立子程序開啟bin sh mem init main memory start,memory end trap init 陷阱門 硬體中斷向量 初始化。kernel traps.c blk dev init 塊裝置初始化。k...
Linux核心剖析 核心的記憶體管理
核心的記憶體管理不同於使用者空間的記憶體管理,首先來講核心本身的限制點就比較多,比如核心一般不能睡眠,因此處理記憶體錯誤一般來講是件很困難的事情,再加上其他限制以及核心記憶體機制不能太複雜導致想獲取核心記憶體變成了一件難事。在說核心的記憶體管理機制之前,首先我們得明白核心記憶體管理的基本單位才行,一...