Linux 核心透過一系列精心設計的資料結構來管理檔案系統、進程與裝置。理解這些核心結構體,不僅有助於驅動程式開發,更能讓系統工程師在效能調校與問題排查時得心應手。本文將詳細剖析五大關鍵結構體:struct file、struct dentry、struct files_struct、struct fs_struct 以及 struct inode。
struct file 定義於 include/linux/fs.h,代表一個已打開的檔案實例。每當進程呼叫 open(),核心便會在核心空間建立一個對應的 struct file,並將其指標傳遞給後續的檔案操作函式。當所有引用該檔案的檔案描述符皆關閉時,核心才會釋放此結構。在核心與驅動程式碼中,指向它的指標常命名為 file 或 filp。
dentry 與 vfsmount,決定檔案在命名空間中的路徑。file_operations,定義該檔案支援的操作(讀、寫、ioctl、mmap 等)。open() 的 flags 與 mode 參數。lseek 操作。address_space,連結頁面快取與檔案映射。Dentry(Directory Entry)是 VFS 層的記憶體實體,將檔案名稱與 inode 綁定。一個 inode 可對應多個 dentry(硬連結),d_count 記錄連結數。Dentry 透過雜湊表(d_hash)與 LRU 鏈表(d_lru)實現快速查找與記憶體回收。
qstr 結構)。每個進程擁有一個 files_struct(定義於 include/linux/file.h),管理該進程打開的所有檔案描述符(fd)。核心透過 fdtable 動態擴展 fd 陣列,支援大量並發檔案。
fdtable,包含 fd 指標陣列與 close_on_exec/open_fds 位圖。記錄進程的根目錄(/)、目前工作目錄(pwd)與替代根目錄(altroot)及其掛載點。umask 決定建立檔案的預設權限遮罩。rwlock_t lock 保護多執行緒環境下的目錄切換。
Inode 定義於 linux/fs.h,對應實體儲存物件(檔案、目錄、裝置等)。它包含權限、時間戳、區塊映射、操作函式表等完整元資料。
| 類別 | 欄位 | 說明 |
|---|---|---|
| 身分與權限 | i_ino | inode 編號,檔案系統內唯一 |
| i_mode | 檔案類型與存取權限 | |
| i_uid / i_gid | 擁有者與群組 ID | |
| 時間戳 | i_atime | 最後存取時間 |
| i_mtime | 最後內容修改時間 | |
| i_ctime | 最後狀態變更時間(權限、擁有者等) | |
| i_version | 版本號,用於 NFS 快取驗證 | |
| 儲存映射 | i_mapping / i_data | 位址空間,管理頁面快取與區塊映射 |
| i_size / i_blocks | 檔案大小(位元組)與佔用區塊數 | |
| i_blkbits / i_blksize | 區塊大小(位元組與位元) | |
| 操作介面 | i_op | inode 操作表(建立、刪除、連結等) |
| i_fop | 預設檔案操作表 | |
| i_sb | 所屬超級區塊 | |
| 同步與鎖 | i_lock / i_alloc_sem | 自旋鎖與信號量,保護 inode 內部一致性 |