重庆营销型网站开发公司电话,网站建设叫什么软件,wordpress5.0.2好用吗,wordpress会员等级插件一、总体框架
1.Linux字符设备驱动工作原理图 2.驱动使用端 3.驱动实现端 二、各部分详解
1.VFS层
1) inode结构体 在Unix/Linux操作系统中#xff0c;每个文件都由一个inode#xff08;索引节点#xff09;来索引。inode是特殊的磁盘块#xff0c;它们在文件系统创建时…一、总体框架
1.Linux字符设备驱动工作原理图 2.驱动使用端 3.驱动实现端 二、各部分详解
1.VFS层
1) inode结构体 在Unix/Linux操作系统中每个文件都由一个inode索引节点来索引。inode是特殊的磁盘块它们在文件系统创建时就已经生成。inode的数量限制了文件系统中可以存储的文件/目录的总数。 每个inode节点的大小一般是128字节或256字节。inode节点的总数在格式化时就给定一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中每个inode节点的大小为128字节每1KB就设置一个inode那么inode table的大小就会达到128MB占整块硬盘的12.8%。
inode包含以下信息 文件的字节数 文件拥有者的User ID 文件的Group ID 文件的读、写、执行权限 文件的时间戳包括 ctimeinode上一次变动的时间 mtime文件内容上一次变动的时间 atime文件上一次打开的时间 链接数即有多少文件名指向这个inode 文件数据block的位置 inode的存在使得文件名和inode号码分离这种机制导致了一些Unix/Linux系统特有的现象。例如移动文件或重命名文件只是改变文件名不影响inode号码。打开一个文件以后系统就以inode号码来识别这个文件不再考虑文件名。因此通常来说系统无法从inode号码得知文件名。 总的来说inode在文件系统中起着至关重要的作用它存储了文件的元信息并为文件的存储和访问提供了基础。 2) struct file结构体 struct file是Linux内核中的一个重要结构体它代表一个已经打开的文件。系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后内核释放这个数据结构。 struct file的定义在include/linux/fs.h中。在内核创建和驱动源码中struct file的指针通常被命名为file或filp。
struct file的一些重要成员包括 文件描述符fdfd只是一个小整数在open时产生。起到一个索引的作用进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。 缓冲区根据应用程序对文件的访问方式即是否存在缓冲区对文件的访问可以分为带缓冲区的操作和非缓冲区的文件操作。 总的来说struct file结构体在Linux内核中起着至关重要的作用它为文件的打开、读写等操作提供了基础。在编写设备驱动或者进行内核开发时理解和掌握struct file结构体的使用是非常重要的。 2.字符设备的描述和操作
1) cdev结构体 在Linux内核中cdev结构体用于描述一个字符设备。cdev结构体的定义如下 struct cdev { struct kobject kobj; // 内嵌的内核对象 struct module *owner; // 该字符设备所在的内核模块的对象指针 const struct file_operations *ops; // 该结构描述了字符设备所能实现的方法是极为关键的一个结构体 struct list_head list; // 用来将已经向内核注册的所有字符设备形成链表 dev_t dev; // 字符设备的设备号由主设备号和次设备号构成 unsigned int count; // 隶属于同一主设备号的次设备号的个数 }; 在Linux字符设备驱动中模块加载函数通过register_chrdev_region()或alloc_chrdev_region()来静态或者动态获取设备号通过cdev_init()建立cdev与file_operations之间的连接通过cdev_add()向系统添加一个cdev以完成注册。用户空间访问该设备的程序通过Linux系统调用如open(),read(),write()来“调用”file_operations来定义字符设备驱动提供给VFS的接口函数。 总的来说cdev结构体在Linux内核中起着至关重要的作用它为字符设备的管理提供了基础。在编写设备驱动或者进行内核开发时理解和掌握cdev结构体的使用是非常重要的。 2)file_operations结构体 file_operations结构体在Linux内核中的定义位于linux/fs.h头文件中。它用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事务的函数的地址。 例如每个字符设备需要定义一个用来读取设备数据的函数。这个结构的每一个成员都对应着一个系统调用。读取file_operation中相应的函数指针接着把控制权转交给函数从而完成了Linux设备驱动程序的工作。 在系统内部I/O设备的存取操作通过特定的入口点来进行而这组特定的入口点恰恰是由设备驱动程序提供的。通常这组设备驱动程序接口是由结构file_operations结构体向系统说明的。 file_operations结构体中的成员函数是字符设备驱动程序设计的主体内容这些函数实际会在应用程序进行Linux的open()、write()、read()、close()等系统调用时最终被内核调用。 总的来说file_operations结构体在Linux内核中起着至关重要的作用它为设备的各种操作提供了基础。在编写设备驱动或者进行内核开发时理解和掌握file_operations结构体的使用是非常重要的。