- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩: 陈孝松
- 课程: 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语言写的,但使用了面向对象的设计思路。
站在用户角度,我们更关心的是文件对象。文件对象表示进程打开的文件,多个进程可能同时打开和操作同一个文件,同一个文件可能存在多个文件对象,最终指向同一个dentry
。
/*
* f_{lock,count,pos_lock}成员可能存在高度争用,共享相同的缓存行。
* 而f_{lock,mode}经常一起使用,因此也共享相同的缓存行。
* 读取频率较高的f_{path,inode,op}被保存在单独的缓存行中。
*/
struct file {
union {
struct llist_node f_llist; // 文件对象链表
struct rcu_head f_rcuhead; // 释放之后的rcu链表
unsigned int f_iocb_flags;
};
/*
* 保护 f_ep 和 f_flags。
* 禁止在 IRQ 上下文中获取。
*/
spinlock_t f_lock; // 单个文件结构锁
fmode_t f_mode; // 访问模式
atomic_long_t f_count; // 引用计数
struct mutex f_pos_lock;
loff_t f_pos; // 当前位移量(文件指针)
unsigned int f_flags; // 打开时指定的标志
struct fown_struct f_owner; // 拥有者通过信号进行异步IO数据的传送
const struct cred *f_cred; // 文件的信任状
struct file_ra_state f_ra; // 预读状态
struct path f_path; // 包含dentry和vfsmount
struct inode *f_inode; /* cached value */
const struct file_operations *f_op; // 文件操作表
u64 f_version; // 版本号
#ifdef CONFIG_SECURITY
void *f_security; // 安全模块
#endif
/* tty 驱动程序以及其他驱动程序可能需要 */
void *private_data; // tty设备驱动的钩子
#ifdef CONFIG_EPOLL
/* 由 fs/eventpoll.c 用于链接所有的钩子到这个file对象 */
struct hlist_head *f_ep; // 事件池链表
#endif /* #ifdef CONFIG_EPOLL */
struct address_space *f_mapping; // 页缓存映射
errseq_t f_wb_err;
errseq_t f_sb_err; /* for syncfs */
} __randomize_layout
__attribute__((aligned(4))); /* 防止某些奇怪的情况认为 2 是可以的 */