博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
register_chrdev_region 與 register_chrdev的差異
阅读量:4286 次
发布时间:2019-05-27

本文共 1794 字,大约阅读时间需要 5 分钟。

轉載自 

分配设备编号,注册设备与注销设备的函数均在fs.h中申明,如下:
extern int register_chrdev_region(dev_t, unsigned, const char *); //静态的申请和注册设备号

 

extern int alloc_chrdev_region(dev_t, unsigned, const char *);//动态的申请注册一个设备号
extern int register_chrdev(unsigned int, const char *,
               struct file_operations *);//int为0时候动态注册,非零时候静态注册。
extern int unregister_chrdev(unsigned int, const char *);
extern void unregister_chrdev_region(dev_t, unsigned);

 

在Linux2.6版本里面,register_chrdev_region()是register_chrdev()的升级版本。

 

使用register_chrdev_region()首先需要定义一个dev_t变量来作为一个设备号,

dev_t   dev_num; 

如果想静态申请,那么dev_num=MKDEV(major_no,0);major是一个表示设备号的变量

然后便可以用register_chrdev_region(dev_num,2,"my_dev");第二个参数表示注册的此设备数目,第三个表示驱动名

 

如果要动态的注册主设备号,使用下面

alloc_chrdev_region(&dev_num, 0, 2, "memdev"); //次设备号从0开始,注册两个设备,设备名是Memdev
    mem_major = MAJOR(devno);  //取出主设备号保存在mem_major中

 

前面只是注册了设备号,后面要向内核添加设备了。

///cdev included in <linux/cdev.h>

struct cdev  devno;

cdev_init(&devno,&file_ops); //初始化改设备

 

devno.owner = THIS_MODULE;   //.owner这表示谁拥有你这个驱动程序,
devno.ops = &mem_fops;

 

对于已经知道了主设备号,就用cdev_add(&devno, dev_num,MEMDEV_NR_DEVS);来添加设备

 

如果是动态申请的设备号,就用

cdev_add(&devno, MKDEV(mem_major, 0), MEMDEV_NR_DEVS); //向内核添加设备,第一个参数是设备,第二个参数是设备号,第三个参数是要注册的次设备数目,mem_major在动态申请时候保存起来了。

注销设备时候,使用unregister_chrdev_region(dev_t, unsigned);第一个参数设备号,和注册时候的要一致,因此如果是动态分配的就需要保存起来,第二个参数是次设备的个数。

而使用 register_chrdev(unsigned int, const char *,struct file_operations *);来申请设备号时候,如果第一个参数是0,表示动态的分配给此驱动程序一个主设备号,,非零时候,表示备驱动程序向系统申请主设备号,第二个是设备名,第三个file_operations,如果是动态分配的,则函数返回分配的主设备号。

对应的使用unregister_chrdev(unsigned int, const char *);来注销设备,第一个参数是主设备号,必须和注册时候的主设备号一致,如果注册时候是动态的分配的主设备号,就需要保存起来。第二个是设备名,

由此可见,使用register_chrdev_region()比register_chrdev()多了一步,就是想内核注册添加cdev设备的步骤

  

另外在2.6内核中

使用module_init()和module_exit()来作为模块的入口和出口,而老版本中使用init_module()和cleanup_module()来作为入口和出口

使用他们注册字符设备都需要手动创建设备节点

转载地址:http://bwpgi.baihongyu.com/

你可能感兴趣的文章
Java -- 入口函数浅析
查看>>
广播的使用
查看>>
Python Requests库
查看>>
下载离线 Visual Studio 离线安装包
查看>>
Makefile Project 中 MSBuild MSB3073 error 不能正确检测字符串 “error:"
查看>>
Xamarin.Forms.Xaml.XamlParseException: No embeddedresource found for
查看>>
如何 禁掉 Hyper-V && 如何解决禁不掉 Hyper-V 的问题
查看>>
杂记 7/30
查看>>
Linux 学习笔记 (九) 软件安装
查看>>
剑指offer(68):机器人的运动范围(回溯法)
查看>>
数据结构之排序:排序基本概念和各种排序方法总结
查看>>
数据结构之排序:直接插入排序
查看>>
数据结构之排序:希尔排序
查看>>
数据结构之排序:冒泡排序
查看>>
数据结构之排序:快速排序
查看>>
数据结构之排序:直接选择排序
查看>>
数据结构之排序:堆排序
查看>>
数据结构之排序:归并排序
查看>>
大数加法与乘法
查看>>
欧几里得算法求最大公约数的递归和非递归实现
查看>>