- 作者: 陈孝松
- 主页: chenxiaosong.com
- 公网主页: replace_with_public_ip_or_delete_this_line
- 哔哩哔哩: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- QQ交流群: 544216206, 点击查看群介绍
点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)。
一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。
虚拟文件系统英文全称Virtual file system,缩写为VFS,又称为虚拟文件切换系统(virtual filesystem switch)。所有的文件系统都要先经过虚拟文件系统层,虚拟文件系统相当于制定了一套规则,如果你想写一个新的文件系统,只需要遵守这套规则就可以了。
VFS虽然是用C语言写的,但使用了面向对象的设计思路。
索引节点对象中最重要的一个成员是i_op
,也是面向对象思想的一个体现,索引节点操作函数表结构体也是定义在文件include/linux/fs.h
中。还是不需要背,用到什么查什么就好。
struct inode_operations {
struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int); // 寻找索引节点,对应dentry中的文件名
const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *);
int (*permission) (struct mnt_idmap *, struct inode *, int); // 检查访问模式
struct posix_acl * (*get_inode_acl)(struct inode *, int, bool);
int (*readlink) (struct dentry *, char __user *,int); // 复制符号链接中的数据
int (*create) (struct mnt_idmap *, struct inode *,struct dentry *, // 为dentry创建一个新的索引节点
umode_t, bool);
int (*link) (struct dentry *,struct inode *,struct dentry *); // 创建硬链接
int (*unlink) (struct inode *,struct dentry *); // 删除索引节点对象
int (*symlink) (struct mnt_idmap *, struct inode *,struct dentry *, // 创建符号链接
const char *);
int (*mkdir) (struct mnt_idmap *, struct inode *,struct dentry *, // 创建新目录
umode_t);
int (*rmdir) (struct inode *,struct dentry *); // 删除目录
int (*mknod) (struct mnt_idmap *, struct inode *,struct dentry *, // 创建特殊文件(设备文件、命名管道、套接字)
umode_t,dev_t);
int (*rename) (struct mnt_idmap *, struct inode *, struct dentry *, // 移动文件
struct inode *, struct dentry *, unsigned int);
int (*setattr) (struct mnt_idmap *, struct dentry *, struct iattr *); // 被notify_change()调用,修改索引节点后,通知
int (*getattr) (struct mnt_idmap *, const struct path *, // 从磁盘更新时调用
struct kstat *, u32, unsigned int);
ssize_t (*listxattr) (struct dentry *, char *, size_t); // 将所有属性列表复制到缓冲列表中
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
u64 len);
int (*update_time)(struct inode *, int);
int (*atomic_open)(struct inode *, struct dentry *,
struct file *, unsigned open_flag,
umode_t create_mode);
int (*tmpfile) (struct mnt_idmap *, struct inode *,
struct file *, umode_t);
struct posix_acl *(*get_acl)(struct mnt_idmap *, struct dentry *,
int);
int (*set_acl)(struct mnt_idmap *, struct dentry *,
struct posix_acl *, int);
int (*fileattr_set)(struct mnt_idmap *idmap,
struct dentry *dentry, struct fileattr *fa);
int (*fileattr_get)(struct dentry *dentry, struct fileattr *fa);
struct offset_ctx *(*get_offset_ctx)(struct inode *inode);
} ____cacheline_aligned;