函数register_chrdev()调用函数__register_chrdev()实现其功能,函数__register_chrdev()首先调用函数__register_chrdev_region()创建一个字符设备区,此设备区的主设备号相同,由函数register_chrdev()的第一个参数决定,次设备号的变化范围是0~256,设备区的名字为函数register_chrdev()的第二个参数,此函数将更改/proc/devices
文件的内容;然后动态申请一个新的字符设备cdev结构体变量,对其部分字段进行初始化,初始化完成之后将其加入Linux内核系统中,即向Linux内核系统添加一个新的字符设备。函数register_chrdev()调用函数cdev_alloc()动态申请一个字符设备,调用函数cdev_add()将其加入Linux内核系统中。
register_chrdev文件包含
#include <linux/fs.h>
register_chrdev函数定义
在内核源码中的位置:linux-3.19.3/include/linux/fs.h
函数定义格式:
static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256, name, fops);
}
register_chrdev输入参数说明
- 函数register_chrdev()有三个输入参数,第一个输入参数是unsigned int型的变量,代表动态申请字符设备的主设备号,对于此设备号函数自动赋值为0。
- 第二个输入参数是char型的指针,代表申请设备的设备名。
- 第三个输入参数是struct file_operations结构体类型的指针,代表申请设备的操作函数,通过此结构体包含的函数完成对设备的访问及控制操作,此结构体在函数cdev_init()的说明文档中已详细说明,详细信息请参考极客笔记函数cdev_init()说明文档的输入参数说明部分。
register_chrdev返回参数说明
- 函数register_chrdev()返回int型的结果,表示设备添加是否成功。如果成功返回0,如果失败返回-ENOMEM, ENOMEM的定义值为12。
register_chrdev实例解析
函数register_chrdev()需要和函数unregister_chrdev()配对使用,不能单独进行测试,所以在此没有单独测试,实例解析及结果分析请读者参考极客笔记函数unregister_chrdev()的分析文档。