什么是file结构
什么是file结构

什么是file结构

什么是file结构

什么是file结构

struct file {
union {
struct llist_node fu_llist;
struct rcu_head fu_rcuhead;
} f_u;
struct path f_path;
struct inode f_inode; / cached value */
const struct file_operations *f_op;

/*
* Protects f_ep_links, f_flags.
* Must not be taken from IRQ context.
*/
spinlock_t f_lock;
atomic_long_t f_count;
unsigned int f_flags;
fmode_t f_mode;
struct mutex f_pos_lock;
loff_t f_pos;
struct fown_struct f_owner;
const struct cred *f_cred;
struct file_ra_state f_ra;

u64 f_version;

ifdef CONFIG_SECURITY

void *f_security;

endif

/* needed for tty driver, and maybe others */ void *private_data;

ifdef CONFIG_EPOLL

/* Used by fs/eventpoll.c to link all the hooks to this file */ struct list_head f_ep_links; struct list_head f_tfile_llink;

endif /* #ifdef CONFIG_EPOLL */

struct address_space *f_mapping;

} attribute((aligned(4))); /* lest something weird decides



另外一个重要的数据结构就是struct file了,它定义在中。

file结构代表一个打开的文件(它并不仅仅限定于设备驱动程序,系统中每个打开的文件在内核空间都有一个对应的file结构)。它由内核在open时创建,并传递给在该文件上进行操作的所有函数,知道最后的close函数。在文件所有实力都被关闭之后,内核会释放这个数据结构。

在内核源码中,指向struct file的指针通常被称为file或者filp(“文件指针”)。为了不至于和这个结构本身相混淆,我们一致将该指针称为filp。这样,file值得是结构体本身,filp则是指向机构的指针。

fmode_t f_mode;
文件模式。它通过FMODE_READ和FMODE_WRITE位来标识是否可读或可写(或可读写)。内核在调用驱动程序的read和write前已经检查是否拥有读/写访问权限,所有不必为这两个方法检查权限。在没有获得对应访问权限而打开文件的情况下,对文件的读写操作将被内核拒绝,驱动程序无需为此而作额外的判断。

loff_t f_pos;
当前的读/写位置。loff_t是一个64位的数(用gcc的术语说就是long long)。如果驱动程序需要知道文件中的当前位置,可以读取这个值,但不要去修改它。read/write会使用它们接收到的最后那个指针参数来更新这一位置,而不是直接对filp->f_pos进行操作。这一规则的一个例外是llseek方法,该方法的目的本身就是为了修改文件位置。

unsigned int f_flags;
文件标志,如O_RDONLY、O_NONBLOCK和O_SYNC。为了检测用户请求的是否是非阻塞式的操作,驱动程序需要检测O_NONBLOCK标志,而其他标志很少用到。所有这些标志都定义在中。

const struct file_operations *f_op;
与文件相关的操作。内核在执行open操作时对这个指针赋值,以后需要处理这些操作时就读取这个指针。file->f_op中的值绝不会为方便引用而保持起来;也就是说,我们可以在任何需要的时候修改文件的关联操作,在返回给调用者之后,新的操作方法就会立刻生效。例如,对应于主设备号1(/dev/null、/dev/zero等等)的open代码根据要打开的次设备号替换filp->f_op中的操作。这种技巧允许先相同主设备号下的设备实现多种操作行为,而不会增加系统调用的负担。

void *private_data;
open系统调用在调用驱动程序的open方法前将这个指针置为NULL。驱动程序可以将这个字段用于任何目的或者忽略这个字段。驱动程序可以用这个字段指向已经分配的数据,但是一定要在内核销毁file结构前在release方法中释放内存。private_data是跨系统调用时保存状态信息的非常有用的资源。


电报导航群:https://t.me/SICdaohang

4条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注