第一天,linux设备驱动 字符设备(杂)
本类学习笔记是linux设备驱动笔记
linux内核为linux4.0,作者学习随笔记录
学习完结后会抽空总结
遇到的问题和解答,及一些看法
未经作者同意,不得转载
不多介绍,了解过的懂,不了解设备的自行百度
字符设备
1.MKDEV(int major, int minor)
宏则可以通过主设备号和次设备号生成dev_t
dev_t是cdev结构体的成员变量,表示设备号
cdev描述一个字符设备
2.container_of()
container_of()的作用是通过结构体成员的指针找到对应结构体的指针,
类似实现
#define NodeParent(node,parent,name) (parent *)((uint32_t)node - (uint32_t)&(parent *)0->name)
解释下,已知结构体成员变量的地址,将结构体地址找出来通过计算结构体与结构体成员之间的偏移量,从而得出结构体地址。
图片版权为电子发烧友网所有,若侵权,联系删除
3.register_chrdev_region
ret = register_chrdev_region(devno, DEVICE_NUM, “globalmem”);
ret = alloc_chrdev_region(&devno, 0, DEVICE_NUM, “globalmem”);
register_chrdev_region()函数用于已知起始设备的设备号的情况,而alloc_chrdev_region()用于设 备号未知,向系统动态申请未被占用的设备号的情况,函数调用成功之后,会把得到的设备号放入第一个 参数dev中。
失败返回<0的一个数
4.kzalloc(sizeof(struct globalmem_dev) * DEVICE_NUM, GFP_KERNEL);
kzalloc()申请了一份globalmem_dev结构体的内存并清0。成功返回0,失败记得注销设备号,一般使用goto
5.GFP_KERNEL作用
————————————————
GFP_KERNEL是linux内存分配器的标志,标识着内存分配器将要采取的行为。
分配器标志分为行为修饰符,区修饰符及类型。行为修饰符表示内核应当如何分配所需的内存。
区修饰符表示内存区应当从何处分配。类型就是行为修饰符和区修饰符的合体。
在include/linux/gfp.h中定义,GFP_KERNEL是内核内存分配时最常用的,无内存可用时可引起休眠.
#define GFP_KERNEL(__GFP_WAIT | __GFP_IO | __GFP_FS)
__GFP_WAIT : 缺内存页的时候可以睡眠;
__GFP_IO : 允许启动磁盘IO;
__GFP_FS : 允许启动文件系统IO。
————————————————
版权声明:本文为CSDN博主「慢慢的燃烧」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010164190/article/details/84789220
6.globalmem_setup_cdev
globalmem_setup_cdev(globalmem_devp, 0);通过申请的到结构体内存将得到
cdev_add()函数和cdev_del()函数分别向系统添加和删除一个cdev,完成字符设备的注册和注 销。
7.模块加载函数以“module_init(函数名)”的形式被指定。它返回整型值,若初始化成功,应返回0。 而在初始化失败时,应该返回错误编码。