Linux内核的学习(四)之字符设备驱动
#include <linux/cdev.h> struct cdev { struct kobject kobj;//内核用于管理字符设备驱动,kobject 就是内核里最底层的类,内核里会自动管理此成员, struct module *owner://通常设为THIS——MODULE,用于防止驱动在使用中时卸载驱动模块。 const struct file_operations *ops;//这个结构体是实现用户进程进行open/read/write等操作时,驱动里对应的操作 struct list_head list;//内核链表节点,内核里自动管理此成员 dev_t dev;//设备号 unsigned int count;// 设备个数 }; //struct cdev 类型的一个对象来描述一个字符设备驱动的;
c语言是面向过程的, 内核是有C语言来实现面向对象。但不全是。
/////////////////////
内核提供对cdev对象操作的函数
void cdev_init(struct cdev*, const struct file_operations *); //初始化cdev对象 struct cdev *cdev_alloc(void); //动态分配一个cdev对象 int cdev_add(struct cdev *, dev_t unsigned); //设置cdev对象使用设备号及设备个数,再把cdev对象增加到内核里,让它工作起来 void cdev_del(struct cdev*) //从内核里移除cdev对象
字符设备驱动实现的基本步骤
1.申请设备号 register_chrdev_region(); 2.声明一个cdev的对象 struct cdev mycdev; 声明一个file_operations 的文件操作对象 struct file_operations fops = { .owner = THIS_MODULE, .read = 读函数的地址 .write = 写函数的地址 ......... }; 3.初始化cdev对象,并把fops对象与cdev对象关联起来。 cdev_init(&mycdev, &fops); //mycdev.ops = &fops; mycdev.owner = THIS_MODULE; 4.把cdev对象加入内核里cdev_map(字符设备驱动的哈希表),并指定该驱动对象的设备号 cdev_add(&mycdev, 设备号, 次设备号的个数); 5. 卸载模块时, 要把设备驱动对象从内核里移除, 并把设备号反注册 unregister_chrdev_region(..); cdev_del(&mycdev);
编译加载驱动模块后,需要用”mknod /dev/设备文件名 c 主设备号 次设备号”来创建设备文件.
mknod /dev/mydev0 c 1234 3344
浙公网安备 33010602011771号