麦子学院字符设备驱动201126
一,需要了解知识
(一)设备号
1,内核中通过类型dev_t,来描述设备号,其实质是unsigned int 32位整数,其中高12位为主设备号,低20位为次设备号。
int register_chadev_region(dev_t from, unsigned count, const char *name)
第一个参数:申请设备号范围起始值
第二个参数:从from开始申请多少个
第三个参数:设备号名字(为了方便管理)
2,设备号独一无二,主设备号表示同一类型设备,次设备号表示同一类型的不同设备。就像摄像头,分前置和后置。
(二)设备信息描述
1,对于设备信息的静态描述
struct cdev{
struct kobject kobj; //设备管理机制,不是由我们操作的,由内核设备管理模型操作。
struct module *owner; //为了加载驱动实现的。
const struct file_operation *ops;
struct list_head list; //一个链表
dev_t dev; //设备号
unsigned int count; //支持的设备
}
2,对于设备信息行为的描述
file_operation
3,相关注册函数
(1)只有登记注册,内核才能统一管理
(2)相关注册函数
a,int cdev_add(struct cdev *p, dev_t dev, unsigned count);
第一个参数:设备信息结构体
第二个参数:设备号
第三个参数:个数
目的:把字符设备注册到内核里
b,void cdev_init(struct cdev *, const struct file_operations *);
目的:建立设备信息和设备行为之间的联系
(三)驱动生存周期
1,insmod **.ko,装载驱动,生存周期开始;
2,rmmod **ko,卸载驱动,生存周期结束。
(四)代码分析
1,MKDEV(主设备号,次设备号); //宏定义,非函数。该宏定义是在Kdev_t.h中定义的,也就是内核中实现的,所以可以直接调用。
2,printk
和printf很像,都是打印错误信息,不同的是,printk是分打印级别的。
目的:只打印相关信息。
3,kzalloc与kmalloc
(1)与malloc功能相似,不过malloc是用户空间用来申请一段内存,在内核空间必须用kzalloc或kmalloc
(2)kzalloc与kmalloc区别
kzalloc会把申请到的空间全部清零。