1. 文件对象(file object)
文件对象描述进程怎样与一个打开的文件进行交互。文件对象是在文件被打开时创建的。注意:文件对象在磁盘上没有对应的映像,因此file结构体中没有dirty字段表示文件对象是否被修改。
1.1 文件数据结构
struct file {
union {
struct list_head fu_list; /* 用于通用文件对象链表的指针 */
struct rcu_head fu_rcuhead; /* 回收文件对象时,由RCU描述符使用 */
} 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; /* 通过信号进行I/O事件通知的数据 */
unsigned int f_uid, f_gid; /* 用户的UID,用户的GID */
struct file_ra_state f_ra; /* 文件预读状态 */
unsigned long f_version; /* 版本号,每次使用后自动递增 */
void *f_security; /* 指向文件对象的安全结构的指针 */
void *private_data; /* 指向特定文件系统或设备驱动程序所需要的数据的指针 */
struct list_head f_ep_links; /* 文件的事件轮询等待者链表的头 */
spinlock_t f_ep_lock; /* 保护f_ep_links链表的自旋锁 */
struct address_space *f_mapping; /* 指向文件地址空间对象的指针 */
}
1.2 关键字段说明
fu_list
:
每个超级块对象把文件对象链表的头存放在 s_files 字段中,因此,属于不同文件系统的文件对象包含在不同的链表中。fu_list 字段链接链表中的相邻元素。f_pos
:
文件指针存放的是文件中当前的位置,由于几个进程可能同时访问同一文件,因此指针必须存放在文件对象而不是索引节点对象中。f_count
:
记录使用文件对象的进程数(以 CLONE_FILES标志创建的轻量级进程共享打开文件表,他们可以使用相同的文件对象)。f_dentry
:
指向与文件对应的目录项对象。f_vfsmnt
:
指向与该文件相应的已安装文件系统描述符。f_flags
:
通过该字段可以解析出打开文件时指定的标志。
1.3 文件操作
每个文件系统都有自己的文件操作集合,执行诸如读写文件这样的操作,由 f_op 字段指向。
1.3.1 文件操作结构体
struct file_operations {
struct module *owner;