檔案系統註冊

2021-05-22 21:17:02 字數 2521 閱讀 8573

前面主要把vfs物件,以及他們如何串聯起來的內容介紹得差不多了。相信走大現在,大家對大概的vfs工作機制有了相應的了解,接下來要做的事,就是把那些重要的細節描述清楚。首先,linux核心支援很多不同的檔案系統型別。本篇博文,我們將討**件系統註冊——也就是通常在系統初始化期間並且在使用檔案系統型別之前必須執行的基本操作。一旦檔案系統被註冊,其特定的那些虛擬檔案模型中的物件中的函式對核心就是可用的了,因此檔案系統型別可以安裝在系統的目錄樹上。

接下來,我們再介紹一些特殊的檔案系統型別,它們在linux核心的內部設計中具有非常重要的作用。

通常,使用者在為自己的系統編譯核心時可以把linux配置為能夠識別所有需要的檔案系統。但是,檔案系統的源**實際上要麼包含在核心映像中,要麼作為乙個模組被動態裝入。

vfs必須對**目前已在核心中的所有檔案系統的型別進行跟蹤。這就是通過進行檔案系統型別註冊來實現的。

每個註冊的檔案系統都用乙個型別為file_system_type的物件來表示:

struct file_system_type ;

所有檔案系統型別的物件都插入到乙個單向鍊錶中。由變數file_systems指向鍊錶的第乙個元素,而結構中的next欄位指向鍊錶的下乙個元素:

static struct file_system_type *file_systems;

fs_flags欄位存放如下幾個標誌:

fs_requires_dev:這種型別的任何檔案系統必須位於物理磁碟裝置上

fs_binary_mountdata:檔案系統使用的二進位制安裝資料

fs_reval_dot:始終在目錄項快取記憶體中使「.」和「..」路徑重新生效(針對網路檔案系統)

fs_odd_rename:「重新命名」操作就是「移動」

在系統初始化期間,呼叫register_filesystem()函式來註冊b編譯時指定的b每個檔案系統(通過find_filesystem()函式找到name);該函式把相應的file_system_type物件插入到檔案系統型別的鍊錶中:

int register_filesystem(struct file_system_type * fs)

static struct file_system_type **find_filesystem(const char *name)

另外,當實現檔案系統的模組被裝入時,也要呼叫register_filesystem()函式。在這種情況下,當該模組被解除安裝時,對應的檔案系統也可以被登出(呼叫unregister_filesystem()函式)。

get_fs_type()函式(接收檔案系統名作為它的引數)掃瞄已註冊的檔案系統鍊錶以查詢檔案系統型別的name欄位,並返回指向相應的file_system_type物件(如果存在)的指標:

struct file_system_type *get_fs_type(const char *name)

return fs;

}磁碟和網路檔案系統能夠使使用者處理存放核心之外的資訊,而特殊檔案系統可以為系統序員和管理員提供一種容易的方式來操作核心的資料結構並實現作業系統的特殊特徵。我們先列出linux中所用的最常用的特殊檔案系統;對於其中的每個檔案系統,破折號隔出了它的安裝點和簡短描述:

bdev——none——塊裝置

binfmt_misc——any——其他可執行格式

devpts——/dev/pts——偽終端支援(開放組織的unix98標準)

eventpollfs——none——由有效事件輪詢機制使用

futexfs——none——由futex(快速使用者空間加鎖)機制使用

pipefs——none——管道

proc——/proc——對核心資料結構的常規訪問點

rootfs——none——為啟動階段提供乙個空的根目錄

shm——none——ipc共享線性區

mqueue——any——實現posix訊息佇列時使用

sockfs——none——套接字

sysfs——/sys——對系統資料的常規訪問點(一般是些驅動)

tmpfs——any——臨時檔案(如果不被交換出去就保持在ram中)

usbfs——/proc/bus/usb——usb裝置

注意,有幾個檔案系統沒有固定的安裝點(兩個破折號之間的「any」)。這些檔案系統可以由使用者自由地安裝和使用。此外,一些特殊檔案系統根本沒有安裝點(兩個破折號之間的「none」)。它們不是用於與使用者互動,但是核心可以用它們來很容易地重新使用vfs層的某些**。例如,有了pipefs特殊檔案系統,就可以把管道和fifo檔案以相同的方式對待。

特殊檔案系統不限於物理塊裝置。然而,核心給每個安裝的特殊檔案系統分配乙個虛擬的塊裝置,讓其主裝置號為0而次裝置號具有任意值(每個特殊檔案系統有不同的值)。

set_anon_super()函式用於初始化特殊檔案系統的超級塊;該函式本質上獲得乙個未使用的次裝置號dev,然後用主裝置號0和次裝置號dev設定新超級塊的s_dev欄位。而另乙個kill_anon_super()函式移走特殊檔案系統的超級塊。unnamed_dev_idr變數包含指向乙個輔助結構(記錄當前在用的次裝置號)的指標。儘管有些核心設計者不喜歡虛擬塊裝置識別符號,但是這些識別符號有助於核心以統一的方式處理特殊檔案系統和普通檔案系統。

linux 檔案系統註冊

以fat檔案系統為例 linux2.6.35 fs fat namei msdos.c module init init msdos fs insmod載入模組時呼叫init msdos fs static int init init msdos fs void 先看引數 msdos fs type...

linux 檔案系統模組的註冊

用cramfs.ko做的實驗,斷點放在init cramfs fs void 函式的rv register filesystem cramfs fs type 行,執行register filesystem函式 register filesystem fs 0xda7142e0 at fs file...

教你如何註冊proc檔案系統

分類 linux 有些時候編寫的核心模組,為了具有更高的可除錯性,通常會使用proc檔案系統。例如netfilter的layer7模組。下面是在2.6.24下的註冊proc檔案系統,並實現讀寫功能的 在 proc net下建立目錄procdir,在該目錄下註冊procfile檔案。include i...