檔案系統分層(file-system layers)
想想一封信如何從你的手中送到遠方朋友手上。你在紙上寫字、投進郵筒,郵局把它分到不同路線,卡車載著一袋袋郵件,最後郵差走到門口投遞。每個階段只懂自己的工作,並信任下面那個階段。檔案系統也是這樣建構的:把「有名字的檔案」這個親切的概念,變成磁碟上真正的記號,是透過一疊層次完成的,每一層都更接近裸硬體一點。
由上而下,經典的分層是:邏輯檔案系統,它懂得檔案名稱、目錄、權限,以及每個檔案的中繼資料記錄(檔案控制區塊);檔案組織模組,它知道一個檔案是一串邏輯區塊,並把每個邏輯區塊號碼對應到磁碟上的實體區塊號碼,同時也追蹤可用空間;基本檔案系統,它送出像「讀/寫實體區塊 0x4F2」這樣單純的命令給裝置;以及輸入輸出控制層(裝置驅動程式與中斷處理常式),真正去和磁碟控制器溝通。所以一個像「讀 report.txt 的第 3 個區塊」的請求會往下傳:邏輯層找到檔案的中繼資料,組織模組把邏輯區塊 3 換成實體區塊 1574,基本檔案系統說「取區塊 1574」,驅動程式讓硬體去做。
為什麼要分層?因為每一層都能各自撰寫、測試、替換,而上層完全不必在意儲存媒介是旋轉磁碟、固態硬碟、還是網路上的一個檔案。分層的代價是一點額外負擔與一些重複,但換來的清晰與重用價值極大——完全相同的基本檔案系統與輸入輸出程式碼,可以墊在許多不同的磁碟格式底下。
某應用程式呼叫 read(fd, buf, 4096)。邏輯檔案系統用 fd 找到開啟檔案的索引節點;檔案組織模組看到檔案指標停在第 8192 個位元組,算出這是邏輯區塊 2,而索引節點指出它落在實體區塊 1574;基本檔案系統要求取區塊 1574;裝置驅動程式對磁碟下指令,並在中斷時把資料複製進 buf。
一個讀取請求往下流經每一層,每一層都把它再翻譯到更接近硬體一步。
分層的確切數目與名稱在不同教科書與真實系統中各有不同;重點不在「有幾層」,而在原則——每一層都把下層雜亂的細節藏在一個乾淨的介面後面。