天天看點

linux檔案系統初始化過程(1)---概述 一、目的 二、常用資料結構 三、函數調用關系 四、總結

術語表:

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的檔案系統了。

    另外,該圖隻給出了主要的關系結構,忽略了部分細節。

linux檔案系統初始化過程(1)---概述 一、目的 二、常用資料結構 三、函數調用關系 四、總結

                               圖1

    圖2描述了檔案系統初始化過程中主要的函數調用關系。linux檔案系統初始化過程主要分為三個階段:

    1、vfs_caches_init()負責挂載rootfs檔案系統,并建立了第一個挂載點目錄:'/';

    2、rest_init()負責加載initrd檔案,擴充VFS樹,建立基本的檔案系統目錄拓撲;

    3、init程式負責挂載磁盤檔案系統,并将檔案系統的根目錄從rootfs切換到磁盤檔案系統;

linux檔案系統初始化過程(1)---概述 一、目的 二、常用資料結構 三、函數調用關系 四、總結

                   圖2

    linux檔案系統初始化過程主要分為三個階段:挂載rootfs,提供第一個挂載點''/;加載initrd,擴充VFS樹;執行init程式,完成linux系統的初始化。下面會詳細介紹每個階段的主要内容。

繼續閱讀