电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Linux字符设备驱动模型之设备号
分 享
扫描二维码分享
Linux字符设备驱动模型之设备号
linux
驱动
嵌入式
东方青
关注
发布时间: 2019-11-26
丨
阅读: 13984
Linux字符设备驱动模型之设备号 -----东方青 从上文中可知,在Linux用户空间中,如若需要操作硬件设备,均通过/dev目录下的设备文件节点进行操作,基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中,其表示字符设备的结构成员也提供了相应的设备号。 ![](https://cf03.ickimg.com/bbsimages/201911/c5a5f97c30c9c37a4122323a3e4d7f20.png) 设备号成员为dev_t dev;那么其与设备之间的关系是什么呢?它又与用户空间的操作是和关系?? 一、设备号 那么设备文件节点又是如何与Linux内核驱动程序进行对应的映射关系呢???答案是:主设备号。 ![](https://cf03.ickimg.com/bbsimages/201911/5db07f6c04b4b87ffe484dfdacc0948a.png) 在前文举例过,可能会存在多个相同的设备运行在Linux系统中,这些设备所使用的是同一个内核驱动程序,那么是如何区分各个设备的呢???答案是:次设备号。 ![](https://cf03.ickimg.com/bbsimages/201911/4b6f53ae2d4642799034f0888032b1c5.png) 那么设备号在用户空间中,是如何体现的呢??? 在我们现有的Linux系统中,进行/dev目录下,执行命令。 命令:ls -l ![](https://cf03.ickimg.com/bbsimages/201911/d9a5dce33b2a8b2f5ac1b9bf373df6f4.png) 如上图所示,在其设备节点文件的属性中,可以查看到设备节点的主设备号和次设备号。其中逗号‘,’前为主设备号,后为次设备号。并且如上图所示,对于loop设备而言,其有很多相同的设备运行在Linux操作系统中,那么他们的各个相同的设备都具有唯一的节点名称,但他们的主设备号相同,均为7;次设备号不同,按照节点的顺序进行排列。 二、设备号操作 在Linux内核源码中,使用结构体dev_t类型来定义设备号。实际上dev_t类型为32位的unsigned int类型(在Linux内核源码中可以进行跟踪)。其中高12位作为存储主设备号,低20位作为存储次设备号。 那么就存在了如下几个问题: 1.如果知道主设备号和次设备号,那么怎么组合成dev_t类型的数据? 在Linux内核中,提供了MKDEV方法宏来进行组合主设备号和次设备号。其原型如下: ![](https://cf03.ickimg.com/bbsimages/201911/29420a9942c4204b328a8dcf3cfbd7e0.png) 用法为:dev_t dev = MKDEV(主设备号,次设备号) 2.如何从dev_t类型的数据中解析出主设备号? 如上图,在Linux内核中采用了MAJOR方法宏来进行解析主设备号。用法如下: 主设备号 = MAJOR(dev_t dev) 3.如何从dev_t类型的数据中解析出次设备号? 如上图,在Linux内核中采用了MINOR方法宏来进行解析主设备号。用法如下: 次设备号 = MINOR(dev_t dev) 三、设备号分配/申请 因为是在Linux内核框架下进行编写设备驱动程序,那么每一个设备的设备号可以有Linux内核提供的方法来进行分配。 Linux内核中如何为设备分配一个主设备号??? 实际上在Linux内核中提供了两种方法可以进行分配主设备号。分别为静态申请设备号和动态分配设备号。 静态申请设备号:程序员自己选择一个数字作为某一个设备的主设备号,再确定其次设备号(实际上如果是单一的设备,通常次设备号为0),通过组合得到设备号,然后通过函数register_chrdev_region向内核申请主设备号使用。其原型如下: ![](https://cf03.ickimg.com/bbsimages/201911/371db5d16871744958d6fce7f6c78fc6.png) 静态申请设备号的缺点在于,如果所申请的设备号已经在内核中被其他设备驱动使用了,则会申请失败。并且另一点是,在Linux内核中存在一些设备驱动的设备号为固定的设备号,例如:串口UART、I2C设备驱动等。 动态分配设备号:Linux内核提供方法函数alloc_chrdev_region,由内核动态的分配一个可用的主设备号给相应的设备驱动。其原型为: ![](https://cf03.ickimg.com/bbsimages/201911/e25e92130a524b767f7c69d338ffa38c.png) 动态分配设备号的优点在于,因为Linux内核本身自己知道了哪些设备号已经被使用了,所以基本不会导致分配到已用了的设备号,从而不会申请设备号失败。 四、设备号注销 实际上无论是使用动态分配得到的设备号,还是使用静态申请得到的设备号,当Linux系统中不再需要相应的硬件设备时,可将其设备驱动进行注销,那么重要的一步就是在设备驱动退出时,使用方法函数unregister_chrdev_region函数释放相应的设备号。其原型为: ![](https://cf03.ickimg.com/bbsimages/201911/064a11195b1e7e31ea286a12e70888f4.png) 设备号释放后,设备节点文件将不存在。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
3
)
东方青
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交