一、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;
}