1. 程式人生 > >檔案系統中的物件總結及對目錄項物件的重點理解

檔案系統中的物件總結及對目錄項物件的重點理解

檔案系統中主要物件:
●超級塊(superblock)物件: 存放系統中已安裝檔案系統的有關資訊。對於基於磁碟的檔案系

統(具有I/O操作),這類物件通常對應於存放在磁碟上的檔案系統控制塊(FCB),也就是說,

每個檔案系統都有一個超級塊物件。
●索引節點(inode)物件: 存放關於具體檔案的一般資訊。對於基於磁碟的檔案系統,這類對

象通常對應於存放在磁碟上的檔案控制塊(FCB),也就是說,每個檔案都有一個索引節點物件。每

個索引節點物件都有一個索引節點號,這個號唯一地標識某個檔案系統中的指定檔案。
●目錄項(dentry)物件: 存放目錄項與對應檔案進行連結的資訊。VFS把每個目錄看作一個由

若干子目錄和檔案組成的常規檔案。例如,在查詢路徑名/tmp/test時 , 核心為根目錄“/ ”創

建第一個目錄項物件, 為根目錄下的 tmp項建立第二級目錄項物件,為 /tmp 目錄下的test項創

建第三級目錄項物件。
●檔案(file)物件: 存放開啟檔案與程序之間進行互動的有關資訊。這類資訊僅當程序訪問檔案

期間存在於記憶體中。
超級塊用來描述整個檔案系統的資訊
每個檔案除了有一個索引節點inode資料結構外,還有一個目錄項dentry資料結構。dentry 結構

中有個d_inode指標指向相應的inode結構。
dentry結構代表的是邏輯意義上的檔案,所描述的是檔案邏輯上的屬性,因此,目錄項物件在磁

盤上並沒有對應的映像;而inode結構代表的是物理意義上的檔案,記錄的是物理上的屬性
一個索引節點物件可能對應多個目錄項物件
一個有效的dentry結構必定有一個inode結構,這是因為一個目錄項要麼代表著一個檔案,要麼

代表著一個目錄,而目錄實際上也是檔案。所以,只要dentry結構是有效的,則其指標d_inode

必定指向一個inode結構。可是,反過來則不然,一個inode卻可能對應著不止一個dentry結構;

也就是說,一個檔案可以有不止一個檔名或路徑名。這是因為一個已經建立的檔案可以被連結

(link)到其他檔名。所以在inode結構中有一個佇列i_dentry,凡是代表著同一個檔案的所有

目錄項都通過其dentry結構中的d_alias域掛入相應inode結構中的i_dentry佇列。

主要資料結構之間的關係

超級塊是對一個檔案系統的描述;索引節點是對一個檔案物理屬性的描述;而目錄項是對一個文

件邏輯屬性的描述。
當核心被編譯時,就已經確定了可以支援哪些檔案系統,這些檔案系統在系統引導時,在VFS中

進行註冊。如果檔案系統是作為核心可裝載的模組,則在模組安裝時進行註冊,並在模組解除安裝時

登出。
每個檔案系統都有一個初始化例程,它的作用就是在VFS中進行註冊,即填寫一個叫做

file_system_type的資料結構,該結構包含了檔案系統的名稱以及一個指向對應VFS超級塊讀取

例程的地址。所有已註冊的檔案系統的file_system_type結構形成一個連結串列,稱為註冊連結串列。要

對一個檔案系統進行註冊,就呼叫register_filesystem()函式。

編寫一個新的檔案系統涉及的基本物件——一個結構、四個操作表
檔案系統型別結構(file_system_type)
超級塊操作表(super_operations)
索引節點操作表(inode_operations)
頁緩衝區操作表(address_space_operations)(虛擬檔案系統可以不要)
檔案操作表(file_operations)

做自己的檔案基本系統步驟:
首先,建立一個檔案系統型別(file_system_type)來描述檔案系統,它包含檔案系統的名稱、

型別標誌以及get_sb()等操作。當安裝檔案系統時,系統會對該檔案系統進行註冊,即填充

file_system_type結構,然後呼叫get_sb()函式來建立該檔案系統的超級塊。
接下來,建立超級塊操作表(super_operations),提供建立一個索引節點、釋放一個索引節點

等的相關函式。
然後,索引節點操作表(inode_operations),提供索引節點的一些自操作函式,如lookup()用

於搜尋索引節點,建立符號連線等

    有關目錄項物件的理解一直讓我很迷惑,心裡總以為目錄項物件只是目錄而已,看完以下的文章你將會有寫明白吧,前提是你已經看過這方面的內容了,只是和我一樣遇到了疑問。

目錄項物件

      每個檔案除了有一個索引節點inode資料結構外,還有一個目錄項dentry(directory enrty)資料結構。dentry 結構中有個d_inode指標指向相應的inode結構。讀者也許會問,既然inode結構和dentry結構都是對檔案各方面屬性的描述,那為什麼不把這兩個結構“合而為一”呢?這是因為二者所描述的目標不同,dentry結構代表的是邏輯意義上的檔案,所描述的是檔案邏輯上的屬性,(註釋:從使用者觀點看邏輯檔案是使用者所觀察到的檔案組織形式,是使用者可以直接處理的資料及結構,它獨立於物理裝置,邏輯檔案又稱為檔案組織。物理檔案是與儲存介質效能有關的,在外存上儲存的組織形式。 )因此,目錄項物件在磁碟上並沒有對應的映像;而inode結構代表的是物理意義上的檔案,記錄的是物理上的屬性,對於一個具體的檔案系統(如Ext2),Ext2_ inode結構在磁碟上就有對應的映像。所以說,一個索引節點物件可能對應多個目錄項物件。

    dentry 的定義在include/linux/dcache.h中:

    struct dentry {

       atomic_t d_count;        /* 目錄項引用計數器 */

       unsigned int d_flags;    /* 目錄項標誌 */

       struct inode  * d_inode;   /* 與檔名關聯的索引節點 */

       struct dentry * d_parent;       /* 父目錄的目錄項 */

       struct list_head d_hash;        /* 目錄項形成的雜湊表 */

       struct list_head d_lru;         /*未使用的 LRU 連結串列 */

      struct list_head d_child;       /*父目錄的子目錄項所形成的連結串列 */

     struct list_head d_subdirs;     /* 該目錄項的子目錄所形成的連結串列*/

     struct list_head d_alias;       /* 索引節點別名的連結串列*/

     int d_mounted;                  /* 目錄項的安裝點 */

     struct qstr d_name;             /* 目錄項名(可快速查詢) */

     unsigned long d_time;           /* 由 d_revalidate函式使用 */

     struct dentry_operations  *d_op; /* 目錄項的函式集*/

     struct super_block * d_sb;      /* 目錄項樹的根 (即檔案的超級塊)*/

     unsigned long d_vfs_flags;  

     void * d_fsdata;                /* 具體檔案系統的資料 */

     unsigned char d_iname[DNAME_INLINE_LEN]; /* 短檔名 */

};

下面對dentry結構給出進一步的解釋。

一個有效的dentry結構必定有一個inode結構,這是因為一個目錄項要麼代表著一個檔案,要麼代表著一個目錄,而目錄實際上也是檔案。所以,只要dentry結構是有效的,則其指標d_inode必定指向一個inode結構。可是,反過來則不然,一個inode卻可能對應著不止一個dentry結構;也就是說,一個檔案可以有不止一個檔名或路徑名。這是因為一個已經建立的檔案可以被連線(link)到其他檔名。所以在inode結構中有一個佇列i_dentry,凡是代表著同一個檔案的所有目錄項都通過其dentry結構中的d_alias域掛入相應inode結構中的i_dentry佇列。

    在核心中有一個雜湊表dentry_hashtable ,是一個list_head的指標陣列。一旦在記憶體中建立起一個目錄節點的dentry 結構,該dentry結構就通過其d_hash域鏈入雜湊表中的某個佇列中。

   核心中還有一個佇列dentry_unused,凡是已經沒有使用者(count域為0)使用的dentry結構就通過其d_lru域掛入這個佇列。

   Dentry結構中除了d_alias 、d_hash、d_lru三個佇列外,還有d_vfsmnt、d_child及d_subdir三個佇列。其中d_vfsmnt僅在該dentry為一個安裝點時才使用。另外,當該目錄節點有父目錄時,則其dentry結構就通過d_child掛入其父節點的d_subdirs佇列中,同時又通過指標d_parent指向其父目錄的dentry結構,而它自己各個子目錄的dentry結構則掛在其d_subdirs域指向的佇列中。

     從上面的敘述可以看出,一個檔案系統中所有目錄項結構或組織為一個雜湊表,或組織為一顆樹,或按照某種需要組織為一個連結串列,這將為檔案訪問和檔案路徑搜尋奠定下良好的基礎。

相關推薦

檔案系統物件總結目錄物件重點理解

檔案系統中主要物件:●超級塊(superblock)物件: 存放系統中已安裝檔案系統的有關資訊。對於基於磁碟的檔案系 統(具有I/O操作),這類物件通常對應於存放在磁碟上的檔案系統控制塊(FCB),也就是說, 每個檔案系統都有一個超級塊物件。●索引節點(inode)物件: 存

Linux根檔案系統的比較常見的目錄結構

/bin 存放二進位制可執行命令的目錄 /dev 存放裝置檔案的目錄 /etc 存放系統管理和配置檔案的目錄 /home 使用者主目錄,比如使用者user的主目錄就是/home/user,可以用~user表示 /lib 存放動態連結共享庫的目錄 /sbin存放系

Linux系統命令總結感悟

1.進入shell命令視窗alt+shift+T。 2.cp -i file.c myfile.c 是將原始檔file.c複製到目標檔案myfile.c中,並且在覆蓋後者之前給出提示。 3.who命令:顯示出正在使用系統的使用者、所用終端名和註冊到系統是時間。 4.echo

Atittit HDFS hadoop 大資料檔案系統java使用總結 目錄 1. 作業系統,進行操作 1 2. Hdfs 類似nfs ftp遠端分散式檔案服務 2 3. 啟動hdfs服務start

Atittit HDFS hadoop 大資料檔案系統java使用總結   目錄 1. 作業系統,進行操作 1 2. Hdfs 類似nfs ftp遠端分散式檔案服務 2 3. 啟動hdfs服務start-dfs.cmd 2 3.1. 配置core-site

檔案系統目錄檔案理解

在最開始的開始,讓我們瞭解一下兩個事實: 1、目錄檔案和普通檔案都是檔案 2、作業系統想要管理這些檔案,就需要得到兩個東西,目錄項(有時候也叫FCB)和檔案內容 其中目錄項存放三個主要的內容:檔案的名字,ID號,檔案內容在物理裝置的儲存地址。 那作業系統裡的檔案系統是

Django檢視總結[urls匹配,HttpRequest物件,HttpResponse,render,redirect物件物件序列化接受案例]

http://www.bubuko.com/infodetail-2234101.html 檢視的功能: 接收請求,進行處理,返回應答。 檢視返回的內容為: HttpResponse的物件或子物件 render 返回的是HttpResponse的物件 Json

linux檔案系統的掛載,各種型別的實現試驗

掛載介紹: 系統的中的檔案系統需要掛載才可進行讀取訪問。掛載就是將檔案系統與當前系統根下的某一個目錄產生對映關係,訪問該目錄時實際訪問的是掛載在該目錄上的檔案系統。 注意:在目錄下有檔案時,將檔案系統掛載在該目錄上時,將無法訪問該原本該目錄下的檔案,只能顯示

檔案系統的索引與目錄

檔案系統操作居於高速緩衝演算法之上。 1. 索引節點 UNIX系統中每個檔案有一個唯一的索引節點,包含為程序存取檔案所必須的資訊。 inode以靜態形式存在於磁碟上,核心把他們鍍金記憶體索引節點表中以便操縱它們。包含內容:檔案所有者、型別、時間、檔案資料磁碟地址明細表,檔案

Centos6.7或7.2系統 github配置基本使用

github配置及基本使用1.安裝 yum install git git-gui 2.生成密鑰對 ssh-keygen -t rsa -C "github郵箱地址"1、首先要檢查key是不是已經存在,2、打開一個終端,並輸入以下命令:$ ls -al ~/.ssh如果

XP方法學習總結小組開發的思考

是個 note 使用 進一步 根據 數據科學家 pos 範圍 log 眾所周知,數據科學是這幾年才火起來的概念,而應運而生的數據科學家(data scientist)明顯缺乏清晰的錄取標準和工作內容。此次課程以《星際爭霸II》回放文件分析為例,集中在IBM Cloud相關數

ADO.NET的模型

list exec cmd 成功 密碼 comm log top sin 一、ADO.NET中的模型及對象 1、EexcuteNonQuery------>實現非查詢操作(增刪改)   sql語句查詢非參數化 //連接字符串

Linux檔案系統管理 swap分割槽作用

概述 在安裝系統的時候已經建立了 swap 分割槽。swap 分割槽是 Linux 系統的交換分割槽,當記憶體不夠用的時候,我們使用 swap 分割槽存放記憶體中暫時不用的資料。也就是說,當記憶體不夠用時,我們使用 swap 分割槽來臨時頂替。在記憶體較小的情況下建議 swap 分割槽的

fsck---於檢查並且試圖修復檔案系統的錯誤

fsck命令被用於檢查並且試圖修復檔案系統中的錯誤。當檔案系統發生錯誤四化,可用fsck指令嘗試加以修復。   -a:自動修復檔案系統,不詢問任何問題; -A:依照/etc/fstab配置檔案的內容,檢查檔案內所列的全部檔案系統; -N:不執行指令,僅列出實際執行會進行的動作; -P:當搭配"-

檔案系統的邏輯塊、物理塊和扇區之間的關係

轉載:https://blog.csdn.net/aspirinvagrant/article/details/11365209 扇區(sector):硬體(磁碟)上的最小的操作單位,是作業系統和塊裝置(硬體、磁碟)之間傳送資料的單位。 block由一個或多個sect

Chap3:檔案系統跳轉[The Linux Command Line]

1 introduce the following commands   pwd - Print name of current working directory   cd-Change directory   ls-List directory contents 2 understand the

LInux系統使用訊號量兩個程序訪問同一資源互斥注意事項

對於同一個共享資源的訪問,在Linux系統應用程式設計中經常遇到,通過訊號量來保護共享資源,實現互斥非常重要,對於實現互斥一般有如下幾個步驟: (1):建立訊號量:呼叫 int semget(key_t key,int num,in

Node.js-檔案系統之使用第三方模組操作目錄

7. 第三方模組操作目錄 例子: npm install 包名 安裝 // =======第三方建立目錄包make-dir======== const madkDir = require('mak

原版英文書籍《Linux命令列》閱讀記錄2 | 在檔案系統翱翔

背景: 閱讀英文原作只為了更好地理解書中的精髓,當然也是為了更好地掌握書中的技巧。我們會堅持閱讀全書,並記錄書中的精髓。 The first thing we need to learn is how to navigate the filesystem on our linux s

Dubbo+Zookeeper架構—高階篇16—訊息中介軟體在分散式系統的作用介紹

一、訊息中介軟體的定義        Message-orientedmiddleware (MOM) is software infrastructure focused on sending and receivingmessages between distribute

細數流行檔案系統哪個最適合你的Linux系統

檔案系統:它們不是世界上最激動人心的技術,但是仍然很重要。本文我們將細數那些流行的 Linux 檔案系統 – 它們是什麼,它們能夠做什麼,以及它們的目標使用者。 1.Ext4 file-systems-ext4 如果你曾經安裝過 Linux,你可能在安裝過程中看到過“Ext4”字樣。用它有一個