術語表:
struct task:進程
struct mnt_namespace:命名空間
struct mount:掛載點
struct vfsmount:掛載項
struct file:文件
struct super_block:超級塊
struct dentry:目錄
struct inode:索引節點
一、目的
linux文件系統主要分爲三個部分:文件系統調用;虛擬文件系統(VFS);掛載到VFS的實際文件系統。
其中,VFS是核心,linux文件系統的本質就是在內存中創建一棵VFS樹。當根目錄被創建後,用戶就可以使用系統調用在VFS上創建文件、刪除文件、掛載各種文件系統等操作。
該系列文章主要分析linux3.10文件系統初始化過程,分爲三個階段:
1、掛載根文件系統(rootfs);
2、加載initrd;
3、掛載磁盤文件系統;
二、常用數據結構
linux文件系統中重要的數據結構有:文件、掛載點、超級塊、目錄項、索引節點等。每個數據結構的具體實現請參見源代碼,這裏不再描述。
爲了直觀的表示數據結構之間的關係,請參見圖1:圖中含有兩個文件系統(紅色和綠色表示的部分),並且綠色文件系統掛載在紅色文件系統tmp目錄下。一般來說,每個文件系統在VFS層都是由掛載點、超級塊、目錄和索引節點組成;當掛載一個文件系統時,實際也就是創建這四個數據結構的過程,因此這四個數據結構的地位很重要,關係也很緊密。由於VFS要求實際的文件系統必須提供以上數據結構,所以不同的文件系統在VFS層可以互相訪問。
如果進程打開了某個文件,還會創建file(文件)數據結構,這樣進程就可以通過file來訪問VFS的文件系統了。
另外,該圖只給出了主要的關係結構,忽略了部分細節。
圖1
三、函數調用關係
圖2描述了文件系統初始化過程中主要的函數調用關係。linux文件系統初始化過程主要分爲三個階段:
1、vfs_caches_init()負責掛載rootfs文件系統,並創建了第一個掛載點目錄:'/';
2、rest_init()負責加載initrd文件,擴展VFS樹,創建基本的文件系統目錄拓撲;
3、init程序負責掛載磁盤文件系統,並將文件系統的根目錄從rootfs切換到磁盤文件系統;
圖2
四、總結
linux文件系統初始化過程主要分爲三個階段:掛載rootfs,提供第一個掛載點''/;加載initrd,擴展VFS樹;執行init程序,完成linux系統的初始化。下面會詳細介紹每個階段的主要內容。
版權聲明:
原創作品,如非商業性轉載,請註明出處;如商業性轉載出版,請與作者聯繫。