1. 文件系統
文件系統是操作系統用于明確存儲設備(常見的是磁盤,也有基于NAND Flash的固態硬盤)或分區上的文件的方法和數據結構,即在存儲設備上組織文件的方法。
1.1 基本組成
索引節點(inode):用來記錄文件的元信息,比如inode編號、文件大小、訪問權限、創建時間、修改時間、數據在磁盤的位置等等。索引節點是文件的唯一標識,它們之間一一對應,也同樣都會被存儲在硬盤中,所以索引節點同樣占用磁盤空間。
目錄項(dentry):用來記錄文件的名字、索引節點指針以及與其他目錄項的層級關聯關系。多個目錄項關聯起來,就會形成目錄結構,但它與索引節點不同的是,目錄項是由內核維護的一個數據結構,不存放于磁盤,而是緩存在內存。
數據塊(data block):是文件系統讀寫的最小單位,用于存儲文件的數據。不同的文件系統數據塊大小可能不同,例如Linux中的邏輯塊大小通常為4KB。
1.2 主要功能
管理和調度文件的存儲空間:負責為文件分配和回收磁盤空間,提高磁盤空間的利用率。
提供文件的邏輯結構、物理結構和存儲方法:定義了文件在磁盤上的存儲方式和組織形式,如鏈式存儲、索引存儲等。
實現文件從標識到實際地址的映射:通過索引節點和目錄項等數據結構,將用戶使用的文件名轉換為磁盤上的實際存儲地址。
實現文件的控制操作和存取操作:提供對文件的創建、刪除、讀取、寫入等操作的支持。
實現文件信息的共享并提供可靠的文件保密和保護措施:支持多個用戶或進程對文件的共享訪問,并通過訪問權限等機制保護文件的安全性和保密性。
提供文件的安全措施:如文件的加密、備份與恢復等功能,保障文件數據的完整性和可用性。
?這一節,我們主要認識文件系統的硬件部分,即磁盤(或硬盤)。
2. 磁盤
2.1 磁盤的分類
機械硬盤(HDD):機械硬盤是傳統的磁盤存儲設備,由盤片、磁頭、電機、控制電路等部件組成。數據存儲在盤片的磁性涂層上,磁頭通過在盤片表面移動來讀寫數據。機械硬盤的優點是容量大、價格相對較低,適合對讀寫速度要求不高的大容量存儲場景。
固態硬盤(SSD):固態硬盤采用閃存芯片作為存儲介質,通過電子信號來存儲和讀取數據,不需要機械部件。固態硬盤的優點是讀寫速度快、抗震性強、功耗低、噪音小,適合對讀寫速度要求較高的場景,如系統盤、游戲盤等。
?2.2 機械硬盤的存儲結構
磁盤的數據就存儲在圓型的磁片上,磁頭可以在搖頭臂的驅動下,隨著盤片的高速旋轉,訪問到盤片表面的任意位置。
盤片的表面被分為多個存儲單元,這些單元被成為扇區。
?扇區:是磁盤存儲數據的基本單位,每個扇區可存儲512字節。
這意味著,每次對磁盤的數據進行讀寫都必須將一個扇區的512個字節一起加載到內存中。
通常來說,一塊磁盤上有多組盤片與磁頭(一個盤片對應兩個面、兩個磁頭)。這些盤片繞著主軸進行同步的高速旋轉,磁頭在同一個機械臂桿的驅動下進行同步運動。
也就是說這些磁頭在豎直方向上連成一條線,指向各自盤面的對應扇區。隨著盤片的高速旋轉,與磁道一同形成了一個柱面,如圖所示。
磁盤容量 = 磁頭數 × 磁道(柱面)數 × 每道扇區數 × 每扇區字節數(512)。
2.3 CHS地址定位
操作系統要訪問一個文件,就需要知道該文件在哪一個扇區(或哪幾個)。
那么,如何定位一個扇區呢?
- 定位扇區所在柱面(Cylinder)。
- 選擇有效磁頭(Header)。
- 定位扇區(Sector)。
?三個參數 "Cylinder-Header-Sector" 共同構成了 "CHS地址"。
操作系統只要知道所需訪問文件對應的 CHS地址 ,即可通過驅動程序完成訪問。
CHS模式支持的硬盤容量有限,因為系統用8bit來存儲磁頭地址,用10bit來存儲柱面地址,用6bit來存儲扇區地址,而一個扇區共有512Byte,這樣使用CHS尋址一塊硬盤最大容量為256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B來算就是8.4GB)。
2.4 LBA地址定位
我們可以將一個磁道看作一個一維數組,將一個柱面看作二維數組(在同一柱面上的每一個磁道作為二維數組的一行),那么磁盤就可以看作一個三維數組。
我們知道,無論是二維數組還是三維數組,從存儲空間上來看都是一維數組首尾相接的結果。
我們按照這樣的思路就可以將磁盤的存儲空間映射為一維數組。
將這個磁盤抽象成的數組的下標作為扇區的地址,我們就得到了 "LBA地址"(Logical Block Address) ,即線性地址。
同樣的,使用 LBA地址,操作系統就能很好的定位到扇區。只要在硬件層面上實現 "LBA地址 到 CHS地址" 的轉換。?
2.5 CHS 與 LBA地址的相互轉換
CHS 轉換為 LBA
LBA = 柱面號C * (磁頭數 * 每磁道扇區數) + 磁頭號H * 每磁道扇區數 + 扇區號S - 1
- 扇區通常是從1開始編號的,而柱面和磁道都是從0開始編號的。
- 在LBA中,地址是從0開始的。
- 總柱面,磁道個數,扇區總數等信息,在磁盤內部會自動維護,上層開機的時候,會獲取到這些參數。
LBA 轉換為 CHS
柱?號C = LBA / (單個柱?的扇區總數 = 磁頭數 * 每磁道扇區數)
磁頭號H = (LBA % 單個柱?的扇區總數) / 每磁道扇區數
扇區號S = (LBA % 每磁道扇區數) + 1
從現在開始,我們主要關注LBA 地址,將磁盤看作一個一維數組,而不再關心其底層細節了(交由硬件自動處理)。