Linux字符设备注册所用函数
作者:互联网
设备节点被创建在/dev下,在Linux中,所有设备都以文件的形式存放在/dev目录下,都是通过文件的方式进行访问,设备节点是Linux内核对设备的抽象,一个设备节点就是一个文件。应用程序通过一组标准化的调用执行访问设备,这些调用独立于任何特定的驱动程序。而驱动程序负责将这些标准调用映射到实际硬件的特有操作。
设备节点,驱动,硬件设备是如何关联到一起的呢?
这是通过设备号实现的,包括主设备号和次设备号。当我们创建一个设备节点时需要指定主设备号和次设备号。应用程序通过名称访问设备,而设备号指定了对应的驱动程序和对应的设备。 主设备号标识设备对应的驱动程序,次设备号由内核使用,用于确定设备节点所指设备。
主设备号:
驱动程序在初始化时,会注册它的驱动及对应主设备号到系统中,这样当应用程序访问设备节点时,系统就知道它所访问的驱动程序了。你可以通过/proc/devices文件来查看系统设备的主设备号。
次设备号:
驱动程序遍历设备时,每发现一个它能驱动的设备,就创建一个设备对象,并为其分配一个次设备号以区分不同的设备。这样当应用程序访问设备节点时驱动程序就可以根据次设备号知道它说访问的设备了。
以上转自博客:https://www.cnblogs.com/y4247464/p/12370188.html
总结:应用程序访问设备节点时,可以得到驱动程序为它分的次设备号,从而得知其主设备号,最后就知道了该用哪个驱动。
在生成字符设备节点之前,需要创建设备类。
class是设备类,它是一个抽象的概念,没有对应的实体。它是提供给用户接口相似的一类设备的集合。常见的有输入子系统input、usb、串口tty、块设备block等。
1.静态申请字符类设备号
(1)register_chrdev_region():提前知道设备的主次设备号,再去申请设备号
(2)MKDEV(numdev_major,numdev_minor):将主次设备号生成dev_t类型的设备号,高12位为主设备号,低20位为次设备号。
(3)module_param(numdev_major,int,S_IRUSR),通过命令台对numdev_major进行赋值传参
Linux指令查看已被注册的设备号:cat /proc/devices
2.动态申请字符类主设备号
(1)alloc_chrdev_region() 是动态分配主设备号,一般是从高向低分配。
(2)宏定义MAJOR提取dev_t数据中的主设备号,如MAJOR(dev_t *)
3.注册字符类设备
(1)kmalloc()分配内存空间,在include/linux/slab.h文件中。
– 参数1:申请的内存大小(最大128K),
– 参数2:GFP_KERNEL,代表优先权,内存不够可以延迟分配
(2)memset()清除内存空间的数据
– 参数1:内存地址
– 参数2:0
– 参数3:内存长度
(3)cdev_init()字符设备初始化,在头文件include/linux/cdev.h中
– 参数1:cdev字符设备文件结构体
– 参数2:file_operations结构体
(4)cdev_add()字符设备注册函数
– 参数1:cdev字符设备文件结构体
– 参数2:设备号
– 参数3:设备范围大小
– 向系统注册设备,也就是向linux系统添加数据
(5)cdev_del()卸载设备函数
– 参数1:cdev结构体
– 移除字符设备
4.生成设备类
class_create()函数创建class文件
– 参数1:一般是THIS_MODULE
– 参数2:设备名称
– 创建一个设备类,用于设备节点文件的创建
– 返回一个class结构体变量
class结构体变量是设备驱动模型中通用的设备类结构
创建成功后位于/sys/class目录下
5.创建设备节点名称
device_create
– 头文件include/linux/device.h中
– 参数1:设备所属于的类
– 参数2:设备的父设备,NULL
– 参数3:设备号
– 参数4:设备数据,NULL
– 参数5:设备名称
创建成功后位于/dev的目录下
6.摧毁设备节点函数device_destroy
– 参数1:设备所属于的类
– 参数2:设备号
7.释放内存函数kfree
标签:字符,驱动程序,所用,参数,Linux,cdev,节点,设备 来源: https://blog.csdn.net/a792544191/article/details/112670565