邏輯區塊定址(logical block addressing)
/ LBA /
想像一家旅館從前指路會說「到第三棟、四樓、左邊第二扇門」。既令人困惑——一旦改建立刻作廢。於是他們改為把旅館裡每個房間編號成 0、1、2、3……排成一長串清單,客人只需要一個房號。邏輯區塊定址替硬碟做的就是這件事:不再用實體的磁柱、磁頭、磁區來命名資料,硬碟改為呈現一長串扁平、編了號的區塊序列,軟體只要說「給我第 1492 號區塊」就行。
具體來說,硬碟把它的儲存空間呈現為一個固定大小、編號從 0 到(區塊數減一)的邏輯區塊陣列。當作業系統想要某些資料時,它下達像「從 LBA 50000 開始讀 8 個區塊」這樣的請求,再由硬碟自己的控制器把那個扁平的號碼轉譯成目前真正存放它的實體位置——正確的表面、磁軌與磁區。作業系統不知道、也不在乎真正的幾何。硬碟可以自由地巧妙安排區塊(外圈磁軌容納較多磁區,所以編號相連的區塊間距並不相等),也可以在某個區塊的原始位置壞掉時,悄悄把它重新映射到備用磁區。
為什麼重要:LBA 是一層乾淨的抽象,把雜亂、不斷演進的硬體藏在一個穩定的介面後面——這是作業系統與硬體之間契約的完美範例。它讓同一份作業系統程式碼能驅動任何硬碟或 SSD 而不必知道其內部,讓硬碟得以改進與自我修復卻不破壞軟體,而對於舊 CHS 方案位址位元已不夠用的大容量硬碟而言更是不可或缺。另一面則是:因為實體佈局被藏了起來,作業系統只能猜測區域性。它假設編號相近的 LBA 在實體上也相近(在硬碟上通常成立,也是循序存取加速的基礎),但在 SSD 上這個假設幾乎無關緊要,因為反正沒有搜尋懲罰。
一顆以 4 KB 為區塊的 1 TB 硬碟,會呈現第 0 號到約第 2.5 億號的區塊。檔案系統說「寫入第 12000 到 12007 號區塊」;硬碟自行算出這八個區塊究竟在哪裡,而若第 12003 號區塊的磁區已壞,便會透明地把它改導向一個保留的備用磁區——作業系統毫無察覺。
一串扁平的編號清單,把硬碟的實體現實藏了起來。
LBA 給出乾淨的編號,但它對實體區域性只是一種提示,而非保證。硬碟可能把連號的 LBA 存得相隔甚遠(在重新映射之後),所以「連續」的 LBA 不一定在實體上連續。