Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

深入解析 Linux 核心常見檔案結構體

編輯:Linux 教學

前言

Linux 核心透過一系列精心設計的資料結構來管理檔案系統、進程與裝置。理解這些核心結構體,不僅有助於驅動程式開發,更能讓系統工程師在效能調校與問題排查時得心應手。本文將詳細剖析五大關鍵結構體:struct file、struct dentry、struct files_struct、struct fs_struct 以及 struct inode。

1. struct file — 打開檔案的核心描述

struct file 定義於 include/linux/fs.h,代表一個已打開的檔案實例。每當進程呼叫 open(),核心便會在核心空間建立一個對應的 struct file,並將其指標傳遞給後續的檔案操作函式。當所有引用該檔案的檔案描述符皆關閉時,核心才會釋放此結構。在核心與驅動程式碼中,指向它的指標常命名為 file 或 filp。

關鍵欄位說明

  • f_u.fu_list / fu_rcuhead:檔案物件鏈表指標或 RCU(Read-Copy Update)機制用的回呼頭,用於無鎖同步。
  • f_path:包含 dentry 與 vfsmount,決定檔案在命名空間中的路徑。
  • f_op:指向 file_operations,定義該檔案支援的操作(讀、寫、ioctl、mmap 等)。
  • f_count:原子引用計數,記錄有多少進程持有此檔案。
  • f_flags / f_mode:對應 open() 的 flags 與 mode 參數。
  • f_pos:當前進程的檔案偏移量,支援 lseek 操作。
  • f_owner:用於非同步 I/O 訊號通知的擁有者資訊。
  • f_ra:預讀狀態,優化循序讀取效能。
  • private_data:驅動程式私有資料指標,常用於字元裝置驅動。
  • f_mapping:指向 address_space,連結頁面快取與檔案映射。

2. struct dentry — 目錄項,連結路徑與 inode

Dentry(Directory Entry)是 VFS 層的記憶體實體,將檔案名稱與 inode 綁定。一個 inode 可對應多個 dentry(硬連結),d_count 記錄連結數。Dentry 透過雜湊表(d_hash)與 LRU 鏈表(d_lru)實現快速查找與記憶體回收。

關鍵欄位說明

  • d_inode:指向關聯的 inode;若為負向 dentry(檔案不存在)則為 NULL。
  • d_parent:父目錄的 dentry,構建目錄樹。
  • d_name:檔案名稱(qstr 結構)。
  • d_op:目錄項操作函式表,支援自定義比對、釋放等行為。
  • d_sb:所屬超級區塊。
  • d_iname:短檔案名內嵌緩衝區,避免小檔名額外分配記憶體。

3. struct files_struct — 進程級檔案描述符表

每個進程擁有一個 files_struct(定義於 include/linux/file.h),管理該進程打開的所有檔案描述符(fd)。核心透過 fdtable 動態擴展 fd 陣列,支援大量並發檔案。

核心欄位

  • fdt:指向當前 fdtable,包含 fd 指標陣列與 close_on_exec/open_fds 位圖。
  • next_fd:下一個可分配的最小 fd 編號。
  • file_lock:自旋鎖,保護 fd 表的並發存取。

4. struct fs_struct — 進程檔案系統上下文

記錄進程的根目錄(/)、目前工作目錄(pwd)與替代根目錄(altroot)及其掛載點。umask 決定建立檔案的預設權限遮罩。rwlock_t lock 保護多執行緒環境下的目錄切換。

5. struct inode — 索引節點,檔案元資料核心

Inode 定義於 linux/fs.h,對應實體儲存物件(檔案、目錄、裝置等)。它包含權限、時間戳、區塊映射、操作函式表等完整元資料。

重要欄位分類

總結:從 open() 到 VFS 掛載

當進程打開檔案 F 時,核心會:

  1. 解析路徑,建立或查找對應的 dentry 與 inode;
  2. 分配 struct file,填充 f_op、f_mapping 等;
  3. 在進程的 files_struct 中分配 fd,指向該 file;
  4. 將 VFS 定義的介面串聯,使後續 read/write/mmap 等系統呼叫能正確分派至具體檔案系統驅動。

掌握這五大結構體的關係與生命週期,是深入 Linux 儲存子系統的基石。

Copyright © Windows教程網 All Rights Reserved
類別欄位說明
身分與權限i_inoinode 編號,檔案系統內唯一
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_opinode 操作表(建立、刪除、連結等)
i_fop預設檔案操作表
i_sb所屬超級區塊
同步與鎖i_lock / i_alloc_sem自旋鎖與信號量,保護 inode 內部一致性