0724_驱动2 inode和file结构体功能

一、inode结构体功能

1.应用层只要有一个文件存在,就会有一个inode号对应

2.应用层只要有一个文件存在,在内黑空间就会有一个inode结构体与之对应

3.所以inode结构体起到上下级关联的作用

二、应用层open-->内核层open

1.应用层调用open函数,会返回一个文件描述符

2.通过文件描述符,对应内核层的open函数

三、什么是文件描述符

1.在进程中调用open函数,打开设备文件时,会返回一个文件描述符

2.每个进程都有自己唯一的文件描述符,文件描述符之间没有干扰

3.在进程中调用open函数,返回的文件描述符

4.所以在进程中可以找到文件描述符相关信息

5.通过task_struct结构体,记录描述进程的相关信息

6.所以task_struct结构体中可以找到文件描述符

四、分析task_struct结构体

struct task_struct {
	volatile long    state; //进程的状态
	unsigned int     cpu;   //当前进程运行在哪一个cpuid上
	pid_t            pid;   //进程号
	struct task_struct __rcu    *parent;    //父进程
	struct list_head        children;  //子进程
	/* Open file information: */
	struct files_struct     *files;  //打开文件信息
};

struct files_struct {
	struct file * fd_array[fd]; ========> fd是结构体指针数组下标
};

五、分析struct file *结构体

struct file {
    struct path        f_path; //打开文件路径
    unsigned int       f_flags; //打开文件方式
    const struct file_operations *f_op; //操作方法结构体
    void           *private_data; //私有数据传参
};

1.应用层只要open打开一个文件,在内核空间就会产生一个struct file*结构体指针

2.struct file *结构体之阵中记录打开文件所有信息

3.fd ==> fd_array[fd] ==> struct file * ==> file_operations ==> open/read/write/close

六、私有数据传参

int myled_open(struct inode *inode, struct file *file)
{
    int a = 10;
    //将变量a的值,赋值给私有数据
    file->private_data = (void*)&a; //这种写法是错误的
    file->private_data = (void*)a; //直接强转
    return 0;
}
------------------------------------------------------------
ssize_t myled_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loff)
{
    //将私有数据中的内容,赋值给a变量
    int a = *(int*)file->private_data; //这种写法是错误的
    int a = (int)file->private_data; //直接强转
    return size; 
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核中,驱动程序中的`file`, `file_operations`, 和 `inode` 结构体是操作系统文件系统核心组件的关键部分,它们之间存在着紧密的关系: 1. **file**: 这是一个用户空间的抽象,代表一个打开的文件描述符。当用户进程打开一个文件时,内核会为该进程创建一个`file`结构体实例。`file`包含了许多信息,如文件描述符、缓冲区管理、以及与用户空间交互的接口。 2. **file_operations (fops)**: 这是一个指向`struct file_operations`的指针,也称为`file_operations table`。它是内核用于描述一个文件的行为的函数表,包含了处理文件的各种操作,如读写、关闭、打开等。每个具体的文件类型(如普通文件、目录、特殊设备等)都有对应的fops,由驱动程序或内核模块定义。 3. **inode**: 是文件系统中的基本存储单元,用于存储文件或目录的基本属性,如权限、所有者、大小、数据块映射等。每个打开的文件都关联着一个inode, inode号是文件系统中唯一的标识符。`file`结构体中的`inode`字段就是用来存储与特定文件相关的inode信息。 关系总结: - `file`结构体依赖于`file_operations`,因为文件的行为是由fops定义的。 - `file`结构体通过其`inode`字段引用了实际的`inode`结构体,以便访问文件的元数据。 - 驱动程序在初始化`file_operations`时,通常会设置对应的`inode_operations`,这些操作与特定类型的inode相关,比如对于目录类型的inode,会处理目录遍历等特殊行为。 相关问题: 1. 为什么要使用`file_operations`来描述文件行为? 2. 驱动程序如何通过`file`结构体与`inode`交互? 3. 如何在内核中为特定类型的文件定义定制的`file_operations`和`inode_operations`?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值