`
bigfirebird
  • 浏览: 128888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

主设备号、次设备号

阅读更多
主设备号、次设备号分配并注册主次设备号
    设备号是在驱动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设备号的管理

    为了更好地管理和区分不同的设备,Linux内核使用了一套设备号机制,通过主设备号(Major Device Number)和次设备号(Minor Device Number)来唯一地标识每一个设备。本篇文章将详细介绍Linux设备号的概念及其管理...

    Linux驱动开发之主设备号找驱动,次设备号找设备

     很久前接触linux驱动知道主设备号找驱动,次设备号找设备。这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理:  二、Linux内核主次设备号的管理  Linux的设备管理是...

    quronghui#Embedded-written-reference#主设备号和次设备号的用途1

    该注册函数是早期的注册函数,major是设备的主设备号,name是驱动程序的名称,而fops是默认的file_operations结构(这是只限于file_op

    Modbus协议模拟主设备工具:ModScan32的详细操作与解析,Modbus协议模拟主设备工具:ModScan32的详细操作与解析,ModScan32用来模拟主设备 它可以发送指令到从机设备(使

    Modbus协议模拟主设备工具:ModScan32的详细操作与解析,Modbus协议模拟主设备工具:ModScan32的详细操作与解析,ModScan32用来模拟主设备。 它可以发送指令到从机设备(使用Modbus协议的智能仪表终端设备)中,从机...

    5G NR无线网络主设备规范—分布式皮站分册.pdf

    在讨论5G NR无线网络主设备规范,特别是分布式皮站分册时,我们需要了解多个与无线通信技术相关的知识点。该文件的标题和描述提到的内容,指出了这是一份由中国移动通信集团有限公司发布的关于5G NR无线网络主设备...

    Linux通过设备号找到设备的方法

    为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号。  一个字符设备或者...

    linux下读取磁盘设备号以其序列号信息

    这个目录下的每个子目录代表一个块设备,如`/sys/class/block/sda`,包含有`device`子目录,其中的`major`和`minor`文件分别表示设备的主设备号和次设备号。通过读取这两个文件,我们可以得到设备的完整标识。 接...

    linux设备号详解.pdf

    每种设备都有一个主设备号(Major Number)和次设备号(Minor Number)。主设备号是用来标识设备类型和其对应的驱动程序,同一主设备号的设备使用同一个驱动。次设备号则用于区分同一类型设备中的不同实例,例如多个...

    linux字符设备驱动学习笔记借鉴.pdf

    Linux 内核中用 dev_t 类型来描述设备号,实际上是一个 unsigned int 32 位整数,其中高 12 位为主设备号,低 20 位为次设备号。可以使用宏 MAJOR(dev_t dev) 解出主设备号,MINOR(dev_t dev) 分解出次设备号。 ...

    Modbus协议模拟主设备工具:ModScan32的通信与数据交互机制,ModScan32用来模拟主设备 它可以发送指令到从机设备(使用Modbus协议的智能仪表终端设备)中,从机响应之后,就可以在

    Modbus协议模拟主设备工具:ModScan32的通信与数据交互机制,ModScan32用来模拟主设备。 它可以发送指令到从机设备(使用Modbus协议的智能仪表终端设备)中,从机响应之后,就可以在界面上返回相应寄存器的数据。 注...

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

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

    Linux设备驱动程序学习

    ### 主设备号和次设备号 在Linux中,每个设备都通过一对数字来标识,即主设备号和次设备号。主设备号用来区分不同的设备类别,如硬盘、鼠标、键盘等,而次设备号则用来区分同一类设备中的不同实例。例如,多个USB...

    _Linux设备驱动程序的开发

    设备号分为两部分:主设备号和次设备号。主设备号(major number)是用来识别设备驱动程序的,它告诉内核应该使用哪个驱动来处理设备文件的请求。不同的主设备号对应不同的驱动程序,这意味着多个设备可以共享同一个...

    linux字符设备驱动[收集].pdf

    本文将深入讲解Linux字符设备驱动的相关知识,主要包括主设备号和次设备号的概念、如何注册和管理设备号,以及驱动程序中涉及的关键数据结构。 一、主设备号和次设备号 主设备号(major number)和次设备号(minor...

    字符设备驱动程序.pptx

    1. **确定主设备号和次设备号**:主设备号用于区分不同类型的设备,次设备号用于在同一类型中区分不同的物理设备。通常,多个由同一内核模块管理的设备会共享一个主设备号,但拥有各自的次设备号。 2. **实现字符...

    3.字符设备驱动基本编程[参照].pdf

    在Linux系统中,字符设备驱动编程是系统级编程的重要组成部分,它涉及到设备文件、主设备号、次设备号等核心概念。 首先,我们来看字符设备驱动的基本操作。在提供的内容中,`scull`是一个用于教学目的的虚拟字符...

    Linux 设备分配清单

    主设备号通常代表设备的类型,而次设备号则区分同一类型的多个设备。下面将详细解释Linux设备分配清单中的主要设备类型及其对应的设备文件。 1. 未命名设备(Unnamed devices) 主设备号0通常保留作为无效设备号,...

    字符设备驱动程序的基本步骤

    设备号主要由两部分组成:主设备号(Major Device Number)和次设备号(Minor Device Number)。 - **主设备号**:用来标识特定类型的设备驱动程序。 - **次设备号**:用来区分具有相同主设备号的不同设备。 在...

    Linux下的设备管理

    在Linux中,设备的识别依靠设备类型、主设备号和次设备号。设备类型区分字符设备和块设备,主设备号对应于驱动程序,次设备号用于区分同一驱动下的不同设备实例。例如,IDE硬盘的主设备号是3,次设备号用于区分不同...

Global site tag (gtag.js) - Google Analytics