数据结构

#define CHRDEV_MAJOR_HASH_SIZE  255static struct char_device_struct {struct char_device_struct *next;unsigned int major;unsigned int baseminor;int minorct;char name[64];struct file_operations *fops;struct cdev *cdev; /* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];/* index in the above */
static inline int major_to_index(int major)
{return major % CHRDEV_MAJOR_HASH_SIZE;
}

全局变量chrdevs,是一个保存所有字符设备的数组,按主转换出的索引值从小到大排列;
每个元素为一个char_device_struct 链表,链表元素按次设备号从小到大排列。
主设备号与索引的关系为:major % CHRDEV_MAJOR_HASH_SIZE, 即:major = 1 与major = 256在使用相同的索引值,index=1;

设备申请方式的差异

-----------------------------------------------  支持多设备 -----------------------------------------------int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)dev = 0 时,为动态申请设备,申请到的设备号保存到dev;baseminor,次设备号起始编号;count,申请连续设备号的数量;name,设备名称;-----------------------------------------------  只支持静态申请 -----------------------------------------------int register_chrdev_region(dev_t from, unsigned count, const char *name)from,申请的设备号起始编号;count,申请连续设备号的数量;name,设备名称;
-----------------------------------------------  单设备 -----------------------------------------------int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)major = 0 时,为动态申请设备,申请到的主设备号保存到major;name,设备名称;fops,关联设备的文件操作符;

注:对于申请连续的设备号,使用倒序申请。最终返回起始设备号。

功能差异

完整注册过程

    register_chrdev = { alloc_chrdev_region + cdev_init + cdev_add }

转载于:https://www.cnblogs.com/gaoyang3513/p/10968765.html

chrdev字符设备几种注册方式的差异相关推荐

  1. 字符设备编号的注册分配

    内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里.该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char ...

  2. 第12课第3节 字符设备驱动程序之查询方式的按键驱动程序

    第12课第3节 字符设备驱动程序之查询方式的按键驱动程序 cat /proc/devices //查询主设备号 insmod ./second_drv.ko ls /dev/button -l pos ...

  3. JS标签的获取、js curd、事件的四要素、事件的三种注册方式和区别

    1.掌握html和body标签的两种特殊获取方式(*****)---(重点)         html: document.documentElement body: document.body le ...

  4. linux驱动的中断函数,嵌入式Linux驱动开发(四)——字符设备驱动之中断方式以及中断方式获取按键值...

    之前我们完成了关于通过查询的方式获取按键键值的驱动程序,可以参考:嵌入式Linux开发--裸板程序之中断控制器. 虽然读取键值没有什么问题,但是测试程序占用CPU过高,一直在不断的查询,资源消耗过大, ...

  5. 【我的C语言学习进阶之旅】介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

    目录 一.要介绍本篇博客的原因 二.静态注册 2.1 实现原理 2.2 实现过程 2.3 弊端 2.4 示例 三.动态注册 3.1 实现原理 3.2 实现过程 3.3 优点 3.4 示例 一.要介绍本 ...

  6. spring初识--bean的几种注册方式

    spring彻底改变了java世界观.spring解决了java 对象管理问题,今天我们来看看spring创建对象的方式有哪些至今还不知道的吧 注册bean的几种方式(IOC) BeanDefinit ...

  7. Android面试,BroadCastReceiver的两种注册方式的异同

    在Android手机应用程序中开发中,需要用到BroadcastReceiver来监听广播的消息.在自定义好BroadcastReceiver ,需要对其进行注册,注册有两种方法: 一种是在代码当中注 ...

  8. SSL请求trustStore的两种注册方式

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 如果是要 ...

  9. 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)

    1.中断方式获取按键值单片机: 1)按键按下 2)cup发生中断,跳转到异常向量入口执行 3)b 函数a.保存被中断的现场b.执行中断处理函数c.恢复 linux: 1)trap_init()函数构造 ...

最新文章

  1. [置顶] 单例模式lua实现
  2. 嵌入式小白到大神学习全攻略(学习路线+课程+学习书籍+练习项目)
  3. UNIX再学习 -- 错误和警告
  4. 七十九、深度和广度优先搜索算法
  5. “悟道”公开课第四讲丨悟道开发案例:​悟空策论——议论文写作平台
  6. java runtime类高级,java入门 -- RunTime类
  7. date oracle 显示毫秒_Oracle中根据Date型转换成Java对应的long型毫秒数
  8. spring cloud连载第一篇之bootstrap context
  9. plt.subplots中的ax = ax.flatten()
  10. mysql update修改数据_MySQL UPDATE:修改数据(更新数据)
  11. 中鸣投篮机器人怎么组装_1000余人参加洛阳市青少年机器人竞赛
  12. TCP,UDP学习总结
  13. 数据可视化图表有哪些类型
  14. 板块拥挤度的相对强度rps
  15. 网上体育商城的设计与实现毕业设计论文
  16. 烧牛肉,烧肥肠,泡椒兔,炸胡豆炸豌豆?做法指南
  17. 什么是MySQL数据空洞?
  18. Python爬取问卷星内容
  19. 【每日蓝桥】13、一三年省赛Java组真题“黄金连分数”
  20. 在CentOS 8 下yum install curl时报错

热门文章

  1. Linq 无法删除尚未附加的实体的问题
  2. robots.txt文件的解析及过滤
  3. C#系列五《多样化的程序分支》
  4. 为你的水晶报表装载本地图片
  5. 金山发布《2006年度信息安全报告》
  6. 开机运行记事本怎么回事
  7. 自己写的一个测试函数执行效率的单元(test on Delphi 7)
  8. 解读Go语言的2018:怎么就在中国火成这样了?
  9. 避免成为垃圾邮件_如何避免犯垃圾
  10. 超越Android:Kotlin在后端的工作方式