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

Linux 內核 VFS 層文件與設備操作流程深度剖析:以 ext3 為例

     編輯:關於C語言

核心數據結構關係圖

struct file (進程私有)
    → f_dentry → struct dentry (目錄項緩存)
        → d_inode → struct inode (索引節點)
            → i_sb → struct super_block (超級塊)
                → s_op → super_operations (文件系統方法集)
            → i_fop → file_operations (文件操作方法集)
            → i_op  → inode_operations (索引節點操作集)

打開流程關鍵路徑

  1. sys_open → filp_open → do_filp_open
  2. open_namei → path_lookup → link_path_walk → do_lookup → real_lookup
  3. ext3_lookup → ext3_find_entry → iget → ext3_read_inode
  4. ext3_read_inode 根據 inode 類型賦值 i_fop/i_op:
    • 普通文件:ext3_file_operations(open 為 generic_file_open 空實現)
    • 目錄:ext3_dir_operations
    • 符號鏈接:ext3_symlink_operations
    • 設備文件:init_special_inode → def_chr_fops/def_blk_fops
  5. nameidata_to_filp → __dentry_open 動態分配 struct file,複製 inode->i_fop 到 file->f_op
  6. 調用 file->f_op->open(若存在)

設備驅動掛接機制

字符設備 open 入口為 chrdev_open,其核心邏輯:

  1. 從 inode->i_cdev 或 kobj_lookup 找到 struct cdev
  2. filp->f_op = fops_get(cdev->ops) 替換為驅動註冊的 file_operations
  3. 調用驅動自己的 open 方法

超級塊註冊時機

register_filesystem(&ext3_fs_type) 註冊 get_sb = ext3_get_sb → 掛載時 vfs_kern_mount → ext3_get_sb → get_sb_bdev(ext3_fill_super) → ext3_fill_super 中 sb->s_op = &ext3_sops 完成掛鉤。

關鍵區別總結

操作集掛載對象典型方法
inode_operationsinode 元數據create、lookup、unlink、rename
file_operations打開文件實例read、write、mmap、ioctl、poll
super_operations文件系統整體read_inode、write_inode、statfs、sync_fs
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved