`

引用 Linux的主设备号和次设备号

阅读更多
转自:http://fanyihui1986.blog.163.com/blog/static/784485920091132043905/

引用

伴风 的 Linux的主设备号和次设备号
分配并注册主次设备号
    设备号是在驱动module中分配并注册的,也就是说,驱动module拥有这个设备号(我的理解),而/dev目录下的设备文件是根据这个设备号创建的,因此,当访问/dev目录下的设备文件时,驱动module就知道,自己该出场服务了(当然是由内核通知)。
    在Linux内核看来,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而次设备号则用来标识具体且唯一的某个设备。
    在内核中,用dev_t类型(其实就是一个32位的无符号整数)的变量来保存设备的主次设备号,其中高12位表示主设备号,低20位表示次设备号。
    设备获得主次设备号有两种方式:一种是手动给定一个32位数,并将它与设备联系起来(即用某个函数注册);另一种是调用系统函数给设备动态分配一个主次设备号。

对于手动给定一个主次设备号,使用以下函数:
int register_chrdev_region(dev_t         first,
                           unsigned int -count,
                           char          *name)
    其中first是我们手动给定的设备号,count是所请求的连续设备号的个数,而name是和该设备号范围关联的设备名称,它将出现在/proc/devices和sysfs中。
    比如,若first为0x3FFFF0,count为0x5,那么该函数就会为5个设备注册设备号,分别是0x3FFFF0、 0x3FFFF1、 0x3FFFF2、 0x3FFFF3、 0x3FFFF4,其中0x3(高12位)为这5个设备所共有的主设备号(也就是说这5个设备都使用同一个驱动程序)。而0xFFFF0、 0xFFFF1、 0xFFFF2、 0xFFFF3、 0xFFFF4就分别是这5个设备的次设备号了。需要注意的是,若count的值太大了,那么所请求的设备号范围可能会和下一个主设备号重叠。比如若 first还是为0x3FFFF0,而count为0x11,那么first+count=0x400001,也就是说为最后两个设备分配的主设备号已经不是0x3,而是0x4了!用这种方法注册设备号有一个缺点,那就是若该驱动module被其他人广泛使用,那么无法保证注册的设备号是其他人的 Linux系统中未分配使用的设备号。


对于动态分配设备号,使用以下函数:
int alloc_chrdev_region(dev_t         *dev,
                        unsigned int -firstminor,
                        unsigned int -count,
                        char          *name)
    该函数需要传递给它指定的第一个次设备号firstminor(一般为0)和要分配的设备数count,以及设备名,调用该函数后自动分配得到的设备号保存在dev中。动态分配设备号可以避免手动指定设备号时带来的缺点,但是它却也有自己的缺点,那就是无法预先在/dev下创建设备节点,因为动态分配设备号不能保证在每次加载驱动module时始终一致(其实若在两次加载同一个驱动module之间并没有加载其他的module,那么自动分配的设备号还是一致的,因为内核分配设备号并不是随机的,但是书上说某些内核开发人员预示不久的将来会用随机方式进行处理),不过,这个缺点可以避免,因为在加载驱动module后,我们可以读取/proc/devices文件以获得Linux内核分配给该设备的主设备号。

与主次设备号相关的3个宏:
MAJOR(dev_t dev):根据设备号dev获得主设备号;
MINOR(dev_t dev):根据设备号dev获得次设备号;
MKDEV(int major, int minor):根据主设备号major和次设备号minor构建设备号。





另解:

      Linux的设备管理是和文件系统紧密结合的,把设备和文件关联起来,这样系统调用可以直接用操作文件一样的方法来操作设备。各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。
分享到:
评论

相关推荐

    Linux 设备驱动添加及删除 测试

    设备号包括主设备号和次设备号,主设备号标识驱动程序,次设备号区分同一驱动下的不同设备。Linux提供了register_chrdev_region()函数用于静态分配设备号,该函数接受起始设备号、数量和设备名称作为参数。若希望...

    Linux字符设备驱动总结

    5. `dev_t dev`: 设备号,32位,其中高12位为主设备号,低20位为次设备号。 6. `unsigned int count`: 记录cdev实例的引用计数。 设备号可以通过宏`MAJOR(dev_t dev)`和`MINOR(dev_t dev)`获取,也可以使用`MKDEV...

    Linux操作系统设备特性及设备管理分析

    每个设备都有一个唯一的设备文件名,由主设备号和次设备号组成。主设备号定义了设备类型,指示了相应的驱动程序和设备接口,如硬盘(hd/sd)、终端(tty)等。次设备号则标识同类设备中的特定实例。例如,hda和hdb...

    Linux系统下设备驱动程序解析.pdf

    设备文件是Linux中设备的抽象,使用主设备号和次设备号区分不同的设备。创建设备文件通常使用`mknod`命令,它们存储在`/dev`目录下。 驱动程序的核心功能包括设备的打开和关闭。`open()`函数初始化设备,`close()`...

    Linux字符设备驱动架构分析

    主设备号`major`定义了设备类型,而次设备号`minor`则标识了同一类型下的具体设备。全局数组`chrdevs`用于存储`struct char_device_struct`结构体,每个元素对应一个主设备号。`register_chrdev_region()`和`alloc_...

    基于Linux的字符设备驱动程序设计

    `cdev`结构体的`dev_t`成员定义了设备号,为32位,其中高12位为主设备号,低20位为次设备号。Linux提供了宏来获取主次设备号,例如`MAJOR(dev_t dev)`和`MINOR(dev_t dev)`。同时,还提供了宏`MKDEV(int major, int ...

    linux字符设备驱动结构[文].pdf

    可以使用 MAJOR() 和 MINOR() 宏来从 dev_t 获得主设备号和次设备号,反之可以使用 MKDEV() 宏来生产 dev_t。 cdev 结构体的另一个重要成员是 file_operations 结构体,它定义了字符设备驱动提供给虚拟文件系统的...

    嵌入式linux中字符设备的cdev结构体

    - `MKDEV(int major, int minor)`:根据主设备号和次设备号生成设备号。 #### 四、Cdev结构体的操作 针对`cdev`结构体,Linux内核提供了一系列的函数,用于创建、初始化、添加以及删除`cdev`对象: 1. **`void ...

    20200812-Linux设备树介绍及加载过程分析-王萌.pdf

    Linux 设备树介绍及加载过程分析 Linux 设备树是一种特殊的文件,后缀为 *.dtb,Linux 在启动时加载,用于提供硬件平台...Linux 设备树加载过程可以分为三个阶段,包括解析 dtb 文件、构建设备树和绑定设备驱动程序。

    Linux下字符设备驱动程序的结构

    - `dev`: 设备号,用于唯一标识一个设备,其中高12位为主设备号,低20位为次设备号。 - `count`: 引用计数,用于跟踪`cdev`结构体被引用的次数。 2. **结构体`file_operations`**:`file_operations`结构体定义了...

    字符设备驱动程序.pptx

    1. 确定主设备号和次设备号:主设备号标识了驱动程序的类型,同一类型的设备共享一个主设备号,而次设备号则区分同一类型下的不同设备。 2. 实现字符驱动程序:包括设备的初始化、数据读写、中断处理等核心功能。 3....

    Linux设备驱动开发PPT课件.ppt

    - 主设备号识别驱动程序,次设备号区分同一驱动下的多个实例。 - 设备驱动程序通过内核调用来响应用户进程的请求,控制从用户空间切换到内核空间。 5. **Linux设备驱动的关键数据结构**: - `file_operations`...

    把设备驱动程序编译进嵌入式Linux内核

    在/uClinux/romdisk/romdisk/dev目录下创建设备节点,使用mknod命令,如`mknod test c 254 0`,这表示创建一个字符设备(c),主设备号为254,次设备号为0。 最后,在/uClinux/appsrc目录下运行make,生成新的...

    做好Linux硬件实时监控(三)——存储设备、网络设备监控.pdf

    6. Linux 硬件实时监控:做好 Linux 硬件实时监控(三)——存储设备、网络设备监控技术可以避免硬盘故障和网络设备故障的发生,提高系统的稳定性和可靠性。 7. S.M.A.R.T 技术:S.M.A.R.T 技术可以实时监测硬盘的...

    Linux块设备驱动(1)_块设备驱动结构

    /* 主设备号 */ int first_minor; /* 第一个次设备号 */ int minors; /* 最大的次设备数,如果不能分区,则为1 */ char disk_name[32]; /* 设备名称 */ ``` 2. **分区信息:** ```c struct hd_struct** part...

    Linux驱动开发庖丁解牛之三 揭开字符设备驱动程序的面纱

    设备号由主设备号和次设备号组成,用以区分不同的设备类型和实例。 2. **注册字符设备**:通过调用 `register_chrdev` 函数(或其变种 `register_chrdev_region`)完成字符设备的注册。 3. **设置文件操作结构**:...

    字符设备驱动编写流程.pdf

    每个设备文件都有文件属性(字符或块)以及两个设备号(主设备号和从设备号),这些用于标识驱动程序和具体的硬件设备。 编写Linux字符设备驱动程序的基本流程包含以下环节: 1. 编写头文件,这些通常包含了定义...

Global site tag (gtag.js) - Google Analytics