字符设备驱动模型

xiaoxiao2021-02-27  187

字符设备是指在I/O传输过程中以字符为单位进行传输的设备,例如键盘,打印机等。 cdev结构体:(描述一个字符设备) struct cdev{   struct kobject kobj; //内嵌的kobject对象   struct module *owner; //所属模块   struct file_operations *ops; //文件操纵结构体,定义了字符设备驱动提供给文件系统的接口函数;   struct list_head list;   dev_t dev;   //设备号(主设备号代表设备类型,次设备号代表设备个数)。MAJOR(dev_t dev):获得主设备号;MINOR(dev_t dev):获得次设备号;MKDEV(int major,int minor)通过主次设备号生成dev_t;   unsigned int count; } Linux内核提供的一组函数用于操作cdev结构体: void cdev_init(...) //初始化cdev成员,建立cdev与file_operations的连接 Struct cdev *cdev_alloc(void) //动态申请一个cdev内存 Void cdev_put(...) Int cdev_add(...) //添加一个cdev Void cdev_del(...) //删除一个cdev 在调用cdev_add()向系统注册字符设备之前,要先调用register_chrdev_region或者alloc_chrdev_region()向系统申请设备号; 在调用cdev_del()向系统注销字符设备之后,要调用unregister_chrdev_regin()来释放原先申请的设备号; File_operations结构体: File_operations结构体中的成员函数是字符设备驱动程序设计的主体内容,是字符设备驱动与内核的接口,是用户空间对linux进行系统调用的最终落实者。 Struct file_operations{ llseek( ); //修改一个文件的当前读写位置,并将新位置返回 read( ); //从设备中读取数据 write( ); //向设备发送数据 readdir( ); //仅用于目录,设备节点不需要实现 ioctl( ); //执行设备I/O控制命令 mmap( ); //将设备内存映射到进程内存中 poll( ); //询问设备是否可被非阻塞地立刻读写 aio_read( ); //对文件描述符对应的设备进行异步读操作 aio_write( ); //对文件描述符对应的设备进行异步写操作 }(主要成员) Linux字符设备驱动的组成: 1:字符设备驱动模块加载和卸载函数 2:字符设备驱动中的file_operations结构体中成员函数 由于内核空间与用户空间的内存不能直接互相访问,因此借助了函数copy_from_user()完成用户空间到内核空间的拷贝,以及copy_to_user()完成内核空间到用户空间的拷贝。
转载请注明原文地址: https://www.6miu.com/read-13659.html

最新回复(0)