本文整理自多篇技術博客,基於 Linux 2.6.11 內核源碼(include/linux/fs.h),詳細解析 struct file 的各字段含義及驅動開發中的應用。
struct file {
union {
struct list_head fu_list;
struct rcu_head fu_rcuhead;
} f_u;
struct path f_path;
#define f_dentry f_path.dentry
#define f_vfsmnt f_path.mnt
const struct file_operations *f_op;
atomic_t f_count;
unsigned int f_flags;
mode_t f_mode;
loff_t f_pos;
struct fown_struct f_owner;
unsigned int f_uid, f_gid;
struct file_ra_state f_ra;
unsigned long f_version;
#ifdef CONFIG_SECURITY
void *f_security;
#endif
void *private_data;
#ifdef CONFIG_EPOLL
struct list_head f_ep_links;
spinlock_t f_ep_lock;
#endif
struct address_space *f_mapping;
};
| 字段 | 類型 | 作用 |
|---|---|---|
f_u | union | fu_list 用於通用文件對象鏈表;fu_rcuhead 配合 RCU 機制延遲釋放。 |
f_path | struct path | 包含 dentry(目錄項對象)和 vfsmount(掛載點),唯一標識文件在命名空間中的位置。 |
f_op | file_operations* | 指向文件操作函數表(open/read/write/llseek 等),內核根據文件類型填充,實現多態。 |
f_count | atomic_t | 引用計數。最後一次 put_files_struct() 釋放結構體。支持 CLONE_FILES 線程共享。 |
f_flags | unsigned int | open() 的 flags 參數(如 O_NONBLOCK),驅動判斷阻塞/非阻塞模式依據。 |
f_mode | mode_t | 讀寫模式(FMODE_READ/FMODE_WRITE),驅動可直接檢查。 |
f_pos | loff_t | 當前讀寫偏移量(64 位),支持大文件。 |
f_owner | fown_struct | 異步 I/O 信號通知相關(pid、uid、signum 等)。 |
f_uid/f_gid | uid_t/gid_t | 文件打開者的有效用戶/組 ID。 |
f_ra | file_ra_state | 文件預讀狀態,頁面緩存預讀算法核心數據結構。 |
f_version | unsigned long | 版本號,每次使用遞增,用於緩存一致性校驗。 |
f_security | void* | LSM 安全模塊擴展字段(需 CONFIG_SECURITY)。 |
private_data | void* | 驅動開發最常用:open 前為 NULL,驅動可掛載私有設備結構體,release 時必須釋放。 |
f_ep_links/f_ep_lock | list_head/spinlock_t | epoll 事件輪詢鏈表及其自旋鎖(需 CONFIG_EPOLL)。 |
f_mapping | address_space* | 指向文件地址空間對象,管理頁面緩存。 |
if (file->f_mode & FMODE_WRITE) { /* 用戶要求可寫 */ }
if (file->f_mode & FMODE_READ) { /* 用戶要求可讀 */ }
if (file->f_flags & O_NONBLOCK)
pr_debug("open: non-blocking\n");
else
pr_debug("open: blocking\n");
// open 方法中
struct my_dev *dev = kmalloc(sizeof(*dev), GFP_KERNEL);
file->private_data = dev;
// read/write 方法中
struct my_dev *dev = file->private_data;
// release 方法中
kfree(file->private_data);
file->private_data = NULL;
struct file 代表一個「打開的文件實例」,是內核與驅動交互的核心上下文。驅動開發者重點關注 f_op、f_flags、f_mode、f_pos 和 private_data,其餘字段多由 VFS 層維護。
本文出自 “技術成長,不斷進步!” 博客,原文地址:https://norawoo.blog.51cto.com/751155/287654