Linux设备号

一、设备号的组成

为了方便管理,Linux中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。Linux提供了一个名为dev_t的数据类型表示设备号,dev_t定义在文件include/linux/types.h里面,定义如下:

typedef __u32 __kernel_dev_t;
......
typedef __kernel_dev_t dev_t;

可以看出dev_t是__u32类型的,而__u32定义在文件include/uapi/asm-generic/int-ll64.h里面,定义如下:

typedef unsigned int __u32;

所以,dev_t其实就是unsigned int类型,是一个32位的数据类型。这32位数据构成了主设备号和次设备号两部分,其中高12位为主设备号,低20位为次设备号。因此Linux系统中主设备号范围为0~4095,所以大家在选择主设备号的时候一定不要超过这个范围。在文件include/linux/kdev_t.h中提供了几个关于设备号的操作函数(本质是宏),如下所示:

#define MINORBITS          20
#define MINORMASK          ((1U << MINORBITS) - 1)
#define MAJOR(dev)         ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev)         ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi)       (((ma)<<MINORBITS)|(mi))
  • 宏MINORBITS表示次设备号位数,一共是20位。
  • 宏MINORMASK表示次设备号掩码。
  • 宏MAJOR用于从devt中获取主设备号,将devt右移20位即可。
  • 宏MINOR用于从dev_t中获取次设备号,取dev_t的低20位的值即可。
  • 宏MKDEV用于将给定的主设备号和次设备号的值组合成dev_t类型的设备号。

二、设备号的分配

1、静态分配设备号
注册字符设备的时候需要给设备指定一个设备号,这个设备号可以是驱动开发者静态的指定一个设备号,比如选择200这个主设备号。有一些常用的设备号已经被Linux内核开发者给分配掉了。并不是说内核开发者已经分配掉的主设备号就不能用了,具体能不能用还得看硬件平台运行过程中有没有使用这个主设备号,使用“cat/proc/devices”命令即可查看当前系统中所有已经使用了的设备号。
2、动态分配设备号
静态分配设备号需要检查当前系统中所有被使用了的设备号,然后挑选一个没有使用的。而且静态分配设备号很容易带来冲突问题,Linux社区推荐使用动态分配设备号,在注册字符设备之前先申请一个设备号,系统会自动给你一个没有被使用的设备号,这样就避免了冲突。卸载驱动的时候释放掉这个设备号即可,设备号的申请函数如下:

int alloc_chrdev_region(dev_t*dev,unsigned baseminor,unsigned count,const char *name)

函数alloc_chrdev_region用于申请设备号,此函数有4个参数:

  • dev:保存申请到的设备号。
  • baseminor:次设备号起始地址,alloc_chrdev_region可以申请一段连续的多个设备号,这些设备号的主设备号一样,但是次设备号不同,次设备号以baseminor为起始地址,地址开始递增。一般baseminor为0,也就是说次设备号从0开始。
  • count:要申请的设备号数量。
  • name:设备名字。

注销字符设备之后要释放掉设备号,设备号释放函数如下:

void unregister_chrdev_region(dev_t from,unsigned count)

此函数有两个参数:

  • from:要释放的设备号。
  • count:表示从from开始,要释放的设备号数量。

以上就是Linux设备号的讲解!!!感谢大家观看!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留小乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值