|
下面隨筆給出塊設(shè)備文件與文件系統(tǒng)之間的關(guān)系解析。 Linux操作系統(tǒng)秉承“一切皆文件”的設(shè)計思想,將所有的設(shè)備頁看作文件來進行處理。目前的Linux版本中,當內(nèi)核發(fā)現(xiàn)一個塊設(shè)備時,用戶空間會利用udev這一數(shù)據(jù)結(jié)構(gòu)以及相關(guān)的操作來為塊設(shè)備創(chuàng)建其所需的塊設(shè)備文件。 關(guān)于塊設(shè)備文件,可以從兩方面來進行理解。從塊設(shè)備文件的外部表現(xiàn)來看,它是屬于某個外部文件系統(tǒng)上的一個文件。通常Linux內(nèi)核將其存放在/dev目錄下,用戶像對常規(guī)文件一樣來對其進行訪問。從塊設(shè)備文件的內(nèi)部實現(xiàn)來看,它可以看作是一種特殊文件系統(tǒng)的所屬文件,同時該塊設(shè)備文件的文件邏輯編號與塊設(shè)備邏輯編號一一對應。 那如何對常規(guī)文件與塊設(shè)備文件進行區(qū)分?當類似于/dev目錄下的掛載在宿主系統(tǒng)中的塊設(shè)備文件,主要通過文件所對應的inode結(jié)構(gòu)中i_mode字段來進行判別,另外在inode結(jié)構(gòu)中i_zone[0]字段中存儲了所對應的塊設(shè)備的編號。 而為了對塊設(shè)備文件進行便捷的組織與管理,Linux內(nèi)核創(chuàng)建了bdev文件系統(tǒng),該文件系統(tǒng)的目的是為了建立塊設(shè)備文件在外部表現(xiàn)與內(nèi)部實現(xiàn)之間的關(guān)聯(lián)性。bdev文件系統(tǒng)是一個“偽”文件系統(tǒng),它只被內(nèi)核使用,而無需掛載到全局的文件系統(tǒng)樹上。 塊設(shè)備文件除了與常規(guī)文件類似的在根文件系統(tǒng)上存在inode之外,其在bdev文件系統(tǒng)上也存在對應的inode。兩個inode之間通過塊設(shè)備編號相關(guān)聯(lián),需要注意的是,前者的inode稱之為次inode,而后者稱之為主inode。 Linux中,存在對設(shè)備抽象之后的目錄,即/dev,也就是前邊所描述的宿主文件系統(tǒng)下的塊設(shè)備文件。該目錄由指向系統(tǒng)中硬件的特殊文件組成。所以程序員可以便捷的對硬件進行訪問,而不需要使用一些特殊的接口函數(shù)。 **這些文件其所對應的inode所具有的特征有以下幾點:** **1. 文件模式為塊設(shè)備文件** **2. 文件內(nèi)容為塊設(shè)備編號,保存在inode當中** **3. 文件長度為0** 雖然bdev文件系統(tǒng)是一個“偽”文件系統(tǒng),不會掛載在全局文件系統(tǒng)樹中,且只存在于內(nèi)存中。但是Linux內(nèi)核仍然根據(jù)文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)來對其進行創(chuàng)建。 對于每個塊設(shè)備,在bdev文件系統(tǒng)中都有一個indoe,同時磁盤和分區(qū)也會有屬于自己的inode。Linux內(nèi)核利用blokc_inode數(shù)據(jù)結(jié)構(gòu)表示塊設(shè)備的inode,其中包含了兩個字段,分別是struct block_device,即塊設(shè)備描述符。另一個是struct inode,即inode描述符。但是Linux系統(tǒng)為了能夠?qū)φw的inode進行統(tǒng)一的管理,因此在宿主系統(tǒng)中創(chuàng)建了與bdev文件系統(tǒng)中相對應的inode。 |
|
|