击左上方蓝色“一口Linux”,选择“设为星标”
第一时间看干货文章 ☞【干货】嵌入式驱动工程师学习路线 ☞【干货】Linux嵌入式知识点-思维导图-免费获取 ☞【就业】一个可以写到简历的基于Linux物联网综合项目 ☞【就业】简历模版
每一个字符设备都需要设备号,Linux内核通过字符设备号来区分设备的唯一标识。
设备号:由 主设备号(major) + 次设备号(minor) 组成。
1 对应 mem,5 对应 tty)。操作依赖设备号,以下是常用的设备号操作函数(配套使用):
MKDEV(major, minor) | dev_t | dev_t MKDEV(unsigned int major, unsigned int minor); |
MAJOR(dev) | dev_t 提取主设备号 | unsigned int MAJOR(dev_t dev); |
MINOR(dev) | dev_t 提取次设备号 | unsigned int MINOR(dev_t dev); |
宏定义位于内核文件
@include/linux/kdev_t.h7#define MINORBITS 208#define MINORMASK ((1U << MINORBITS) - 1)910#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))11#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))12#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))主次设备号内存组成如下:
Linux内核提供的主要注册字符设备函数:register_chrdev()、register_chrdev_region()。
Linux内核字符设备号管理规则:
为方便验证代码,彭老师从内核中将字符设备号申请注册的核心代码单独拎出来,去掉一些内核特定函数,
这样我们可以脱离内核进行测试:





我们通过一组实例讲解字符设备号的分配:
register_chrdev_region(MKDEV(251,0),3,"cdev1"); /* 1 */ register_chrdev_region(MKDEV(251,3),4,"cdev2"); /* 2 */ register_chrdev_region(MKDEV(506,0),3,"cdev3"); /* 3 */ register_chrdev_region(MKDEV(506,3),4,"cdev4"); /* 4 */ register_chrdev(234,"cdevA"); /* 5 */ register_chrdev(489,"cdevB"); /* 6 */申请成功之后,节点信息如下:

如果此时我们要再申请字符设备cdev5:
register_chrdev_region(MKDEV(506,4),4,"cdev5");主设备号:506,次设备号基值:4、个数4、区间:[4-7],
那么就会和字符设备cdev4冲突,从而申请失败。
完整代码获取,关注添加好友,或者后台回复:charno
end
一口Linux
关注,回复【1024】海量Linux资料赠送
精彩文章合集
文章推荐