首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 內核文件結構體(struct file)深度解析

     編輯:關於C語言

前言

本文整理自多篇技術博客,基於 Linux 2.6.11 內核源碼(include/linux/fs.h),詳細解析 struct file 的各字段含義及驅動開發中的應用。

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_uunionfu_list 用於通用文件對象鏈表;fu_rcuhead 配合 RCU 機制延遲釋放。
f_pathstruct path包含 dentry(目錄項對象)和 vfsmount(掛載點),唯一標識文件在命名空間中的位置。
f_opfile_operations*指向文件操作函數表(open/read/write/llseek 等),內核根據文件類型填充,實現多態。
f_countatomic_t引用計數。最後一次 put_files_struct() 釋放結構體。支持 CLONE_FILES 線程共享。
f_flagsunsigned intopen() 的 flags 參數(如 O_NONBLOCK),驅動判斷阻塞/非阻塞模式依據。
f_modemode_t讀寫模式(FMODE_READ/FMODE_WRITE),驅動可直接檢查。
f_posloff_t當前讀寫偏移量(64 位),支持大文件。
f_ownerfown_struct異步 I/O 信號通知相關(pid、uid、signum 等)。
f_uid/f_giduid_t/gid_t文件打開者的有效用戶/組 ID。
f_rafile_ra_state文件預讀狀態,頁面緩存預讀算法核心數據結構。
f_versionunsigned long版本號,每次使用遞增,用於緩存一致性校驗。
f_securityvoid*LSM 安全模塊擴展字段(需 CONFIG_SECURITY)。
private_datavoid*驅動開發最常用:open 前為 NULL,驅動可掛載私有設備結構體,release 時必須釋放。
f_ep_links/f_ep_locklist_head/spinlock_tepoll 事件輪詢鏈表及其自旋鎖(需 CONFIG_EPOLL)。
f_mappingaddress_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");

private_data 典型用法


// 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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved