改变linux 次设备号,Linux设备驱动程序 之 主次设备号

主设备号和次设备号

对字符设备的访问是通过文件系统内的设备名称进行的,这些名称被称为特殊文件、设备文件、或者简单称之为文件系统树的节点,它们通常位于/dev目录。字符设备驱动程序的设备文件可以通过ls -l命令输出的第一列中的c字符来识别,块设备也出现在/dev下,但它们由字符b来标识;

通过执行ls -l 命令,可以看到在修改日期之前,有两个用逗号分隔的数字,分别为主设备号和次设备号。

主设备号标识设备对应的驱动程序;linux设备内核允许多个驱动程序共享主设备号;

次设备号由内核使用,用用户正确确定设备文件所指的设备。依赖驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可以将次设备号当做设备本地数组的索引。不管哪种方式,除了知道次设备号用来指向驱动程序所实现的设备之外,内核本身不关心关于此设备号的其他信息;

crw-rw----. 1 root video 10, 175 Nov 25 17:09agpgart

crw-------. 1 root root 10, 235 Nov 25 17:09autofs

drwxr-xr-x. 2 root root 140 Nov 25 17:09block

drwxr-xr-x. 2 root root 80 Nov 25 17:09bsg

crw-------. 1 root root 10, 234 Nov 25 17:09 btrfs-control

drwxr-xr-x. 3 root root 60 Nov 25 17:09bus

lrwxrwxrwx.1 root root 3 Nov 25 17:09 cdrom ->sr0

drwxr-xr-x. 2 root root 3120 Nov 25 17:10 charcrw-------. 1 root root 5, 1 Nov 25 17:09console

lrwxrwxrwx.1 root root 11 Nov 25 17:09 core -> /proc/kcore

drwxr-xr-x. 6 root root 120 Nov 25 17:09cpu

crw-------. 1 root root 10, 62 Nov 25 17:09cpu_dma_latency

crw-------. 1 root root 10, 203 Nov 25 17:09cuse

drwxr-xr-x. 5 root root 100 Nov 25 17:09disk

crw-rw----+ 1 root audio 14, 9 Nov 25 17:09 dmmidi

设备编号的内部表达

内核中,dev_t类型(位于)用来保存设备编号,包括主设备号和次设备号;

1 typedef __u32 __kernel_dev_t;2

3 typedef __kernel_dev_t dev_t;

可见dev_t类型是个32位的无符号整数,其中12位用来表示主设备号,其余20位表示次设备号;我们不应该对设备编号的组织做假定,而应该始终使用如下两个宏(位于linux/kdev_t.h)来获取主次设备号;

1 #define MINORBITS 20

2 #define MINORMASK ((1U << MINORBITS) - 1)

3

4 #define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))

5 #define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))

如果需要将主次设备号转换成dev_t类型,则使用下面宏(位于linux/kdev_t.h):

1 #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))

分配和释放设备编号

指定范围分配编号:

在建立一个字符设备之前,我们的驱动程序首先要做的事情就是获取一个或者多个设备编号,完成该工作的必要函数是register_chrdev_region,该函数在中声明:

1 int register_chrdev_region(dev_t from, unsigned count, const char *name)

参数from标识要分配的设备号范围的起始值,次设备号经常设置为0,但对该函数不是必须的;

参数count标识分配设备号的个数,如果count非常大,则所请求的范围可能和下一个主设备号重叠,但是只要我们所请求的编号范围是可用的,则不会带来问题;

参数name是和该编号范围关联的设备名称,它将出现在/proc/devices和sysfs中;

动态分配设备编号:

在不知道要分配的设备号的时候,可以使用动态分配的方式,函数如下:

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

参数dev是仅用于输出的参数,在成功完成调用后将保存已分配范围的第一个编号;

参数baseminor是要使用的被请求的第一个次设备号,通常是0;

参数count标识分配设备号的个数;

参数name是和该编号范围关联的设备名称;

始终使用动态分配设备编号:

对于新的驱动程序,强烈建议不要随便选择一个当前设备未使用的设备号作为主设备号,而应该使用动态分配机制获取主设备号;驱动程序应该使用使用alloc_chrdev_region而不是register_chrdev_region函数;

动态分配的缺点:由于分配的主设备号不能始终保持一致,素以无法预先创建设备节点;对于驱动程序的一般做法是,为了加载一个使用动态主设备号的设备驱动程序,对insmod的调用可替换成一个简单的脚本,该脚本在调用insmod之后读取/proc/devices以获得新分配的主设备号,然后创建对应的设备文件;

释放设备编号:

在不使用设备编号的时候需要进行释放,函数如下:

1 void unregister_chrdev_region(dev_t from, unsigned count)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,设备主设备设备组成,用来标识设备对应的驱动程序和具体的设备主设备用来表示一个特定的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而设备用来标识具体且唯一的某个设备主设备设备统称为设备。 在Linux系统中,每个设备类别有一组唯一的主设备,而设备则用来区分同一类型的多个设备主设备用来区分不同种类的设备,而设备用来区分同一类型的多个设备。 需要注意的是,主设备设备在不同磁盘的工具中都有输出显示,对于理解命令的输出是很重要的。比如,使用命令"cat /proc/devices"可以查看主设备设备的输出意义。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [linux设备管理之主/设备](https://blog.csdn.net/m0_74282605/article/details/129185160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Linux通过设备找到设备的方法](https://download.csdn.net/download/weixin_38499336/12842761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值