linux進程空間、頁緩存和虛擬文件系統圖

        linux內核與實現中分別大致介紹了內核子系統的各個模塊,並給出了該模塊下重要的數據結構。但是,閱讀過本書之後(感覺底層確實欠缺)發現只是對各個子系統分別有了一個大致的印象,單憑自己的理解難以將各個系統之間串聯起來,尤其是每個內核子系統總是涉及較多的數據結構。趁着即將元旦假期,花點時間將內核中的虛擬文件系統、進程地址空間、頁緩存以及內存映射之間的關係建立一個大致的框圖。有關於各個子系統內部的結構體之間的關係,尤其是虛擬文件系統,請參考圖中紅色部分的博客地址。關於虛擬內存,邏輯地址、線性地址和物理地址之間的轉換請參考途中藍色部分的博客。

        下文中的圖是根據《linux內核設計與實現》以及衆多的博客畫出,希望能對初步瞭解linux內核的同學有所幫助。


圖 1 linux進程地址空間、虛擬文件系統以及頁緩存之間的關係

對上圖的說明和補充:

       由於空間有限,因此只畫出了linux下虛擬文件系統、進程地址空間的部分結構體中的部分成員變量。

       1、每個模塊都維護了一個X_op指針指向它所對應的操作對象X_operations;

       2、超級塊(圖中未畫出,與一個文件系統相對應)維護了一個s_files指針指向了“已打開文件列表模塊",即內核所有的打開文件的鏈表,這個鏈表信息是所有進程所共享的,便於進程之間打開文件時共享已經存在於系統物理內存中緩存信息;

       3、目錄塊操作和inode模塊都維護了一個X_sb指針指向超級塊,從而可以獲得整個文件系統的元數據信息;

       4、目錄項對象和inode對象各自維護了指向對方的指針,可以方便的找到對方的數據;

       5、已打開文件列表上每個file結構體實例維護了一個struct path,struct path中維護着指向vfsmount和dentry結構體的指針,從dentry指針中可以方便的查找到其對應的目錄項,從而可以根據目錄項找到對應的inode信息;

       6、已打開文件列表上每個file結構體示例維護了一個f_op指針,指向可以對這個文件進行操作的所有函數集合file_operations;

       7、indode結構體不僅有何其他模塊關聯的指針,重要的是它可以指向address_space模塊,從而獲得自身文件在內存中的緩存信息;

       8、address_space結構體內部維護了一個基數樹,用於管理屬於該address_space結構體的所有物理頁結構---struct page,同時維護一個host指針指向inode來獲得文件的元數據;

       9、內核使用task_struct來表示單個進程的描述符,其中包含一個進程的所有信息。task_struct結構體維護了一個files的指針(該指針和"一打開文件列表“上的表項是不同的指針)來指向結構體files_struct,files_struct中包含了文件描述符表和文件對象信息;

       10、file_struct中的文件描述符表其實是個file類型的指針列表(和"已打開文件列表"上的表項是相同的指針),可以支持動態擴展,每一個指針指向虛擬文件系統中文件列表模塊的某一個已經打開的文件;

       11、過個進程可以同時指向一個打開文件對象(未見列表表項),例如父進程和子進程共享文件對象;

       12、一個進程可以多次打開同一個文件,生成不同的文件描述符,每個文件描述符指向不同的文件列表。但是由於是同一個文件,inode是唯一的,所以這些文件表項最終指向同一個inode。通過這樣的方法實現文件共享;

        關於頁緩衝、快緩衝以及系統讀取文件與頁緩衝和快緩衝之間的交互,將會在接下來的文章中介紹。

發佈了29 篇原創文章 · 獲贊 23 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章