首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux驱动 主设备号

在Linux操作系统中,驱动程序是与硬件设备交互的软件组件。每个硬件设备在Linux系统中都有一个唯一的设备号,用于标识该设备。设备号分为两部分:主设备号和次设备号。

基础概念

  • 主设备号:主设备号用于标识设备的类型或驱动程序。同一个主设备号的设备使用相同的驱动程序。
  • 次设备号:次设备号用于标识同一类型的多个设备实例。例如,多个硬盘或USB设备。

相关优势

  • 模块化:通过主设备号和次设备号,Linux内核可以轻松地加载和管理驱动程序。
  • 灵活性:可以支持多种相同类型的设备,只需不同的次设备号。
  • 可扩展性:新的硬件设备可以通过分配新的主设备号和次设备号来集成到系统中。

类型

  • 字符设备:如键盘、鼠标,主设备号范围通常是1-255。
  • 块设备:如硬盘、USB驱动器,主设备号范围通常是256-512。

应用场景

  • 字符设备:适用于需要按字符流读写的设备,如串口通信、终端等。
  • 块设备:适用于需要随机访问的设备,如硬盘、光盘驱动器等。

遇到的问题及解决方法

问题1:如何查看设备的主设备号和次设备号?

可以使用ls -l /dev命令查看设备文件的详细信息,其中第五列是主设备号和次设备号的组合。

代码语言:txt
复制
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Jan 1 00:00 /dev/sda

在这个例子中,8是主设备号,0是次设备号。

问题2:如何为新的硬件设备分配主设备号?

在编写新的驱动程序时,需要在驱动程序中指定主设备号。可以通过以下几种方式分配:

  1. 静态分配:在驱动程序代码中硬编码主设备号。
  2. 动态分配:使用alloc_chrdev_region函数动态申请主设备号。
代码语言:txt
复制
#include <linux/fs.h>

static int major_number;

static int __init my_driver_init(void) {
    int ret;
    ret = alloc_chrdev_region(&major_number, 0, 1, "my_device");
    if (ret < 0) {
        printk(KERN_ALERT "Failed to allocate major number\n");
        return ret;
    }
    printk(KERN_INFO "Allocated major number %d\n", major_number);
    return 0;
}

static void __exit my_driver_exit(void) {
    unregister_chrdev_region(major_number, 1);
    printk(KERN_INFO "Unregistered major number %d\n", major_number);
}

module_init(my_driver_init);
module_exit(my_driver_exit);

问题3:如何解决主设备号冲突?

  • 检查现有设备:使用lsmodcat /proc/devices命令查看已加载的模块和分配的主设备号。
  • 动态分配:尽量使用动态分配主设备号的方式,避免手动指定导致的冲突。

总结

主设备号是Linux内核管理硬件设备的重要标识,通过合理分配和管理主设备号,可以确保系统的稳定性和可扩展性。在开发和维护驱动程序时,了解和正确使用主设备号是非常关键的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux 常见主设备号设备清单

Linux 常见主设备号设备清单# 在Linux系统中,设备通常通过主设备号和次设备号来标识。主设备号用于区分设备的大类,例如硬盘、字符设备等;次设备号用于在同一大类设备中区分不同的设备。...,如 cdrom、cdrom1 等 sound card 14 音频设备,如 /dev/dsp(数字音频)、/dev/mixer(混音器) 请注意,不同的Linux发行版和不同的设备驱动可能会有所不同...NVMe 设备的主设备号是在设备驱动程序注册到内核时由内核动态分配的,因此,不同的系统,内核版本或配置可能会有所不同。在许多现代 Linux 系统中,NVMe 设备的主设备号可能是 259。...不过,你仍然可以在 NVMe 驱动的源代码中找到关于如何注册设备和处理设备号的代码。NVMe 驱动的源代码通常位于 drivers/nvme/host 目录下。...函数的返回值就是分配给设备的主设备号。 然而,查看驱动程序的源代码并不能直接告诉你在特定系统上的设备号是什么,因为这取决于内核在运行时的动态分配。

75510

一文秒懂|Linux字符设备驱动

一文秒懂|Linux字符设备驱动 image-20231123091238538 1、前言 众所周知,Linux内核主要包括三种驱动模型,字符设备驱动,块设备驱动以及网络设备驱动。...其中,Linux字符设备驱动,可以说是Linux驱动开发中最常见的一种驱动模型。 我们该系列文章,主要为了帮助大家快速入门Linux驱动开发,该篇主要来了解一些字符设备驱动的框架和机制。.../types.h 主要作用:表示字符设备对应的设备号,其中包括主设备号和次设备号。...主设备号:用于标识设备的类型, 次设备号:用于区分同类型的不同设备 简单来说,主设备号用于区分是IIC设备还是SPI设备,而次设备号用于区分IIC设备下,具体哪一个设备,是MPU6050还是EEPROM...alloc_chrdev_region:调用前,未定义主设备号和次设备号;调用后,主设备号以0来表示,以自动分配,并且将自动分配的设备号,同样加入到子系统中,方便系统追踪系统设备号的使用情况。

1.7K11
  • 【i.MX6ULL】驱动开发2——新字符设备开发模板

    目前Linux内核推荐的新字符设备驱动API函数,使得驱动的使用更加自动化,本篇就来一起研究下。...先看目录: 1 旧字符设备驱动的弊端 使用register_chrdev函数注册字符设备,需要指定一个设备号,这就造成: 需要事先确定好哪些主设备号没有使用 会将一个主设备号下的所有次设备号都使用掉,...2 新字符设备驱动原理 2.1 分配和释放设备号 使用设备号的时候向Linux内核申请,需要几个就申请几个,由Linux内核分配设备可以使用的设备号。...dev_t from, unsigned count) 新字符设备驱动下,设备号分配示例代码如下: int major; /*主设备号*/ int minor; /*次设备号*...加载驱动 驱动加载成功后,可以看到自动申请到的主设备号和次设备号,如下图,主设备号为249。

    62120

    i.MX283开发板第一个Linux驱动-LED驱动

    4.注册与注销字符设备 静态分配主设备号: 上面已经做好了驱动的准备工作,但是内核还不知道这个设备,所以接下来需要“告诉”内核我们编写的这个设备驱动,也就是向内核注册设备。...为了方便管理,Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。...应用程序对设备文件进行读写操作时,都是通过主设备号找到这个设备的驱动文件,然后在驱动文件里取得具体操作的函数,最后再进行相关操作。...: register_chrdev函数第一个参数为0,则表示需要内核动态分配主设备号,其合法返回值(大于0)就是分配的主设备号。...//格式 mknod /dev/xxx 设备类型 主设备号 次设备号 //主设备号是cat /proc/devices里看到的 次设备号需要我们手动填写这里设置为0 最大255 mknod /dev

    6100

    linux字符设备驱动基本框架

    作为Linux特有的抽象方式,将所有的硬件抽象成文件的读写。 (2)设备类型 字符设备、块设备、网络设备 (3)设备文件、主设备号、从设备号 有了设备类型的划分,还需要进行进一步明确。...所以驱动设备会生成字符节点,以文件的方式存放在/dev目录下,操作时可抽象成文件操作即可。每个设备节点有主设备号和次设备号,用一个32位来表示,前12位表示主设备号,后20位表示次设备号。...主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。...4:第四个参数:驱动的名字 由于每个设备只有一个主设备号,所以如果用静态分配设备号时,有可能会导致分配不成功,所以采用动态分配的方式。...用户进程利用在对设备文件进行诸如read/write操作的时候,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数,这是Linux的设备驱动程序工作的基本原理

    6K53

    i.MX283开发板第一个Linux驱动-LED驱动改进

    上一个博客i.MX283开发板第一个Linux驱动讲的是最简单的LED驱动的编写,但是其中还有一些不足。...2.改进注册与注销字符设备函数 register_chrdev()的弊端在于它仅仅由一个主设备号就确定了一个设备驱动,因为register_chrdev()的入口参数只有主设备号major和fops结构体...,Linux内核最多支持255个字符设备,假设我有255个不同的字符设备需要控制,那么就需要255个主设备号,一下子用光了所有的设备号,这是很不合理的!...首先看下/dev下有么有LED设备节点 此时没有任何LED设备节点,然后再加载驱动。 驱动加载成功,我们再到/dev下看看 已经自动生成了设备设备节点,主设备号250,次设备号0....=3.write调用也是类似的情况,这样驱动程序只要根据不同的次设备号对相应的LED进行操作,就可以实现同一套驱动控制多个同类设备,且没有占用多个主设备号。

    3600

    Linux设备驱动之字符设备(一)

    Linux中设备驱动的分类 从上图可以看到Linux系统将各异的设备分为三大类:字符设备,块设备和网络设备。内核针对每一类设备都提供了对应驱动模型架构,包括基本的内核设施和文件系统接口。...对于红色区域来说,1是主设备号,11是次设备号。 对于绿色区域来说,7是主设备号,0-7代表是次设备号。...主设备号用来标识对于的设备驱动程序,而次设备号则由驱动程序使用,用来标识它所管理的若干同类设备。 设备号的表示 在linux系统中,设备号用dev_t表示。这是个32位的无符号整数。...随着Linux系统的演变,上述的主次设备号的分发可能在将来会发生变化,所以设备驱动程序开发者应该避免直接使用主次设备号所占的位宽来获得对于的主设备号或次设备号。...是在主设备号不知情的情况下,让系统给分配设备号。

    7.2K52

    从单片机到ARM Linux驱动——Linux驱动入门篇

    , Linux 下每个设备都有一个设备号,设备号分为主设备号和次设备号两部分,关于设备号后面会详细讲解。...设备号的组成 设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。...这 32 位的数据构成了主设备号和次设备号两部分,其中高 12 位为主设备号,第 20 位为次设备号。...因此 Linux系统中主设备号范围为0~4095,所以大家在选择主设备号的时候一定不要超过这个范围。...设备号的分配 1、静态分配设备号 注册字符设备的时候需要给设备指定一个设备号,这个设备号可以是驱动开发者静态的指定一个设备号,比如选择 200 这个主设备号。

    4.5K11

    Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?

    ,使用这个主设备号; 参数2 name:设备名称; 参数3 fops:file_operations 类型的指针变量,用于操作设备; 如果是动态分配,那么这个函数的返回值就是:操作系统动态分配给这个设备的主设备号...这是静态指定的,例如:MKDEV(200, 0) 表示起始主设备号 200, 起始次设备号为 0; 参数2 count: 驱动程序指定连续注册的次设备号的个数,例如:起始次设备号是 0,count 为...0 ~ 9 这 10 个次设备号; 参数4 name:设备名称; 补充一下关于设备号的内容: 这里的结构体 dev_t,用来保存设备号,包括主设备号和次设备号。...它本质上是一个 32 位的数,其中的 12 位用来表示主设备号,而其余 20 位用来表示次设备号。...系统中定义了3宏,来实现dev_t变量、主设备号、次设备号之间的转换: MAJOR(dev_t dev): 从 dev_t 类型中获取主设备号; MINOR(dev_t dev): 从 dev_t

    1.9K20

    字符设备驱动程序接口

    返回值:成功返回主设备号, 失败返回一个负值 内核中有一个数组要来存储注册的字符设备驱动,register_chrdev注册的字符设备驱动的信息主要就存在这个数组的相应位置,该数组的下标就是主设备号,...major:主设备号(1 - 255),传递0则由内核自动分配一个合适的空闲的主设备号 **const char *name**:设备名称 字符设备驱动新接口 主次设备号 在老接口中使用register_chrdev...函数来注册字符设备驱动,但是设备号只有major(主设备号),而新接口中提供了minor(次设备号),内核中通过dev_t类型描述设备号,其实质是unsigned int类型,其中高12位为设备号,低20.../* linux/kdev_t.h */ // 传入两个参数生成设备号(dev_t),分别为主设备号和次设备号 MKDEV(ma, mi) // 传入设备号(dev_t),返回主设备号 MAJOR(...(主设备号 + 次设备号) unsigned int count; // 文件引用计数 }; cdev_alloc 为cdev指针分配内存 /* linux/cdev.h

    1.5K30

    嵌入式Linux驱动开发——字符设备驱动框架入门

    1 提到了关于Linux的设备驱动,那么在Linux中I/O设备可以分为两类:块设备和字符设备。...mknod命令,第一个参数是设备文件的名字,这个名字要和测试程序中的打开的相一致 第二参数c代表的是字符设备 55代表的是主设备号 0代表的是次设备号 驱动程序测试通过了,当我们不需要驱动程序的时候,我们应该将他卸载掉...首先关于第一个问题的解决方案很简单,注册驱动程序的时候,如果传入的major为0,那么系统将会自动为这个驱动程序分配主设备号,同时这个程序也会返回所分配的主设备号。...0,同时把用设备号来接收函数的返回值,实际该函数会返回自动创建的主设备号 third_class = class_create(THIS_MODULE, "third_drv"); //初始化...252的设备,名字为third_driver,而实际代码中并没有指定对应的主设备号,那么也就是说明该设备号是由系统自动创建的。

    3.2K20

    2.制作第一个驱动程序

    ,函数的返回值是主设备号*/ register_chrdev (111, “first_drv”, &first_drv_fops); //111:主设备号,”first_drv”:设备名 /* register_chrdev...4.然后开发板通过nfs网络文件系统来加载frist_drv.ko 加载之前首先通过 cat /proc/devices来查看字符主设备号111是否被占用 ?...0,1,2都已经被控制台占用了,所以从3开始 7.改进底层驱动,使用动态装载: 除了静态装载驱动外,还可以动态装载,让系统自动为我们驱动设备自动分配设备号 7.1 修改first_drv_init入口函数和...设置major为0,由内核动态分配主设备号,函数的返回值是主设备号*/ major =register_chrdev (0, “first_drv”, &first_drv_fops); return...,通过动态分配得出它的主设备号是252,然后重创252的测试程序 ?

    1.1K50

    Linux驱动实践:一步一步编写字符设备驱动程序

    目录 API 函数 编写驱动程序 编写应用程序 卸载驱动模块 小结 今天我们继续讨论: Linux 中字符设备的驱动程序。 在上一篇文章中Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?...静态注册:由我们的驱动程序来指定主设备号,即参数1:from; 动态注册:由操作系统来分配,驱动程序提供一个变量来接收该设备号,即参数1: dev 指针; 另外,在Linux 2.6后期的内核版本中,引入了...$ cat /proc/devices /proc/devices 文件: 列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。...来查看一下 /proc/devices 目录下显示的设备号: $ cat /proc/devices 设备已经注册了,主设备号是: 244 。...继续用dmesg命令查看一下: 卸载驱动模块 卸载指令: $ sudo rmmod driver2 此时,/proc/devices 下主设备号 244 的 driver2 已经不存在了。

    3.7K30

    linux设备驱动第三篇:如何写一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动。...首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作。 1、主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的。...那么主设备号和次设备号分别代表什么意义呢?一般情况下,可以这样理解,主设备号标识设备对应的驱动程序,也就是说1个主设备号对应一个驱动程序。当然,现在也有多个驱动程序共享主设备号的情况。...1.1、设备编号的表达 在内核中,dev_t用来保存设备编号,包括主设备号和次设备号。在2.6的内核版本种,dev_t是一个32位的数,其中12位用来表示主设备号,其余20位用来标识次设备号。...通过dev_t获取主设备号和次设备号使用下面的宏: MAJOR(dev_t dev); MINOR(dev_t dev); 相反,通过主设备号和次设备号转换为dev_t类型使用: MKDEV(int major

    2.1K150

    linux 字符设备驱动

    Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备。 设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。...Linux下设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。...一般“一个主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示。同一驱动下的实例编号,用于确定设备文件所指的设备。 文件名:设备文件名字。...struct file_operations *i_fop;在生成设备文件的时候,这个文件操作成员被赋予一个默认值; 从inode中获得主设备号和次设备号的宏: * unsigned int iminor...在模块的入口函数中,申请设备号,初始化并注册一个cdev结构; 在模块的出口函数中,注销cdev结构,注销设备号; 可以通过文件 /proc/devices 查看设备信息,找到动态分配的主设备号 手动建立设备文件通过

    9.6K45

    linux字符设备驱动

    Linux设备驱动概述 操作系统内核是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备。 设备驱动程序是操作系统内核和机器硬件之间的接口,系统调用是操作系统内核和应用程序之间的接口。...Linux下设备的属性 设备的类型:字符设备、块设备、网络设备; 主设备号:标识设备对应的驱动程序。...一般“一个主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个硬件实例,这些硬件实例则由次设备号来表示。同一驱动下的实例编号,用于确定设备文件所指的设备。 文件名:设备文件名字。...struct file_operations *i_fop;在生成设备文件的时候,这个文件操作成员被赋予一个默认值; 从inode中获得主设备号和次设备号的宏: * unsigned int iminor...在模块的入口函数中,申请设备号,初始化并注册一个cdev结构; 在模块的出口函数中,注销cdev结构,注销设备号; 可以通过文件 /proc/devices 查看设备信息,找到动态分配的主设备号 手动建立设备文件通过

    10.7K65

    Linux驱动框架与杂项字符设备框架介绍

    Linux下驱动框架介绍 1.1 驱动框架分类 Linux下驱动框架分为3大类型: 字符设备 --------- 块设备 存储设备 SD 硬盘 网络设备 网卡 无线 有线 字符设备和块设备都会生成设备节点在...、蜂鸣器 驱动都是使用字符设备框架编写 1.2 驱动框架代码模板 示例代码: #include linux/kernel.h> #include linux/module.h> static...杂项设备框架 2.1 框架结构介绍 杂项字符设备的主设备号固定: 10 主设备号: 0 ~ 255 次设备号范围: 0 ~ 255 Linux内核寻找驱动节点是依靠设备号寻找的。...设备号: 主设备号(区分类型)、次设备号(区分同类型的具体设备) 主设备号: 10 ,240 下面是查看串口设备节点、MMC设备节点的详细信息: 下面是杂项设备的模型图: Linux下把无法分类的一些设备都归类为杂项设备...杂项设备的主设备?

    3.2K30
    领券