主次设备号的介绍

本文详细介绍了Linux系统中主设备号和次设备号的作用及其内部表示方法,并解释了如何通过宏操作进行设备号的拆分与组合。此外还介绍了杂项设备的概念及其实现方式。
 

【主设备号与次设备号的功能】

在Linux内核中,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而次设备号则用来标识具体且唯一的某个设备。

比如说在linux的终端打入命令:

**@ubuntu:/dev$ ls –l  
crw-rw----  1 root   root      4,   0 2010-05-25 06:50 tty0
crw-------  1 root   root      4,   1 2010-05-25 06:51 tty1

会出现很多的文件列表,这里举例字符串设备文件【字符串设备的开头表示为c,当然块设备表示为b】,这些文件可以称为文件系统书的节点,都是位于/dev目录下。另外上面2行中的数字,4【紫红表示】,0,1【蓝色表示】分别表示的是该设备的主设备号,次设备号。一个主设备号和一个次设备号就组成了该设备的唯一标识符。虽然现在的linux内核允许多个驱动程序共享主设备号,但是现在大多数的设备仍然按照“一个主设备号对应一个驱动程序”的原则组织。次设备号用来指向驱动程序所实现的设备,内核本身基本上不会去关心关于次设备号的任何其他信息。

【设备编号的内部表达】

设备号的类型是dev_t类型(2.4内核为kdev_t),在<linux/coda.h>中定义。

typedef  unsigned  long        dev_t ;

其中dev_t是一个32位的数,12位表示主设备号,另外20位表示次设备号。

2.6内核把主设备号由8位扩展到12位,而次设备号由8位扩展到20位。

获取主设备号和次设备号的方法如下:

MAJOR(dev_t dev);

MINOR(dev_t dev)

在<linux/kdev_t.h> 中以上宏的定义如下:

#define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))

 

将主设备号和次设备号转换成dev_t的类型,可以使用

MKDEV(int major, int minor);

在<linux/kdev_t.h> 中以上宏的定义如下: #define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))

【杂项设备的介绍】

misc设备,主设备号为10,函数注册的方式也不一样。使用如下:

misc_register(&XXX_miscdev);

misc_deregister(&XXX_miscdev);

上面的函数需指定miscdevice结构体,

在#include <linux/miscdevice.h>中定义:

struct miscdevice

{

      int minor;                        //次设备号

      const char *name;          //设备驱动程序的名称

      struct file_operations *fops;    //file_operation

      struct   miscdevice  *next,  *prev;     //用于内部管理

      devfs_handle_t devfs_handle;        //用于内部管理

}

开发人员必须定义的filed包括:minor ,name 及fops如下:

static struct miscdevice mymisc_dev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "mymisc",
.fops = &mymisc_fops,
};

可以通过#cat /proc/misc来查看misc设备的注册情况。

misc设备主要针对没有多个同类设备的驱动程序。

<think>好的,我现在需要回答用户关于Linux主设备号次设备号的详细概念及用途的问题。首先,我得仔细理解用户的问题,确保覆盖所有关键点。用户可能希望了解这两个设备号的定义、它们在Linux设备管理中的作用,以及实际应用中的例子。 首先,我应该回忆一下主设备号次设备号的基本概念。主设备号用于标识设备对应的驱动程序,而次设备号由驱动程序用来区分同类设备的不同实例或不同功能。例如,同一块硬盘的不同分区可能共享主设备号,但次设备号不同。 接下来,需要参考用户提供的引用内容。根据引用[1],每个字符设备块设备都必须有主次设备号主设备号相同的设备使用同一个驱动程序。引用[2]提到MAJORMINOR宏用于提取主次设备号,而MKDEV则用于合成设备号。引用[3][4]详细说明了在驱动开发中如何管理设备号,包括cdev结构体注册设备的过程。引用[5]则涉及虚拟终端伪终端的主从设备。 我需要将这些信息组织成一个结构清晰的回答。可能需要分为几个部分:概念定义、作用、管理方式、查看方法示例应用。同时,用户要求生成相关问题,我需要考虑用户可能进一步询问的内容,比如如何查看设备号、动态分配与静态分配的区别、主次设备号的管理等。 需要注意的是,用户提供的引用中有一些关于设备号的具体操作,比如使用cat /proc/devices查看主设备号,以及设备节点的创建。这些内容可以作为实际示例,帮助用户更好地理解。 另外,用户要求使用中文回答,行内公式用$...$,独立公式用$$...$$。虽然这个问题主要涉及设备号,可能不需要太多数学公式,但如果有涉及数值范围或位操作的地方,可能需要使用LaTeX格式。例如,设备号是32位,主设备号占12位,次设备号占20位,可以用数学表达式表示,如主设备号的范围是$0-2^{12}-1$。 在结构上,回答应该先介绍主设备号次设备号的基本概念,然后解释它们的作用,接着讨论如何管理查看设备号,最后给出实际例子。需要确保每个部分都引用正确的来源,例如引用[1]说明主设备号的作用,引用[2]解释设备号的位操作等。 可能还需要注意一些细节,比如设备号的分配方式(静态动态),以及主设备号耗尽的问题。引用中提到内核文档documentation/devices.txt记录了设备号,但较新内核可能路径不同,可能需要指出这一点,避免用户查找时困惑。 最后,生成的相关问题需要与主题相关,例如如何查看设备号主次设备号的管理机制、设备号冲突处理等。确保问题覆盖用户可能感兴趣的方面,帮助用户深入理解。</think>### 主设备号次设备号详解 #### 一、概念定义 1. **主设备号 (Major Number)** 用于标识设备对应的驱动程序。主设备号相同的设备属于同类设备,共享相同的驱动程序[^1]。例如,系统中多个硬盘分区可能共享同一主设备号,由同一驱动程序管理。 2. **次设备号 (Minor Number)** 由驱动程序自行管理,用于区分同类设备的不同实例或功能。例如: - 同一硬盘的多个分区(次设备号不同) - 同一驱动管理的不同硬件接口(如串口设备`/dev/ttyS0`、`/dev/ttyS1`) #### 二、核心作用 1. **设备分类与驱动绑定** - 主设备号决定内核调用哪个驱动程序处理设备请求。 - 次设备号帮助驱动程序区分具体操作对象(如硬盘的第1分区与第2分区)[^1][^3]。 2. **设备号合成与解析** Linux通过`dev_t`类型(32位)存储设备号,其中: - 主设备号占12位(范围:$0 \leq \text{major} \leq 2^{12}-1$) - 次设备号占20位(范围:$0 \leq \text{minor} \leq 2^{20}-1$) 通过宏操作实现设备号的合成与提取: ```c dev_t dev = MKDEV(major, minor); // 合成设备号 int major = MAJOR(dev); // 提取主设备号 int minor = MINOR(dev); // 提取次设备号 ```[^2] #### 三、设备号管理 1. **静态分配** 开发者可手动指定设备号(需避免冲突),参考内核文档`Documentation/admin-guide/devices.txt`[^1]。 2. **动态分配** 调用`alloc_chrdev_region`由内核自动分配主设备号,适用于避免冲突的场景[^3]。 3. **注册与注销** - 驱动程序通过`register_chrdev_region`或`cdev_add`注册设备号[^4]。 - 设备节点由`mknod`命令或`device_create`函数创建,关联设备号与`/dev`目录下的文件[^4]。 #### 四、查看设备号 1. **命令查看** ```bash # 查看已加载设备的主设备号 cat /proc/devices # 查看设备文件信息(含主/次设备号) ls -l /dev/sda1 ``` 输出示例: ``` brw-rw---- 1 root disk 8, 1 6月 10 12:34 /dev/sda1 ``` 其中`8`为主设备号,`1`为次设备号[^1]。 2. **内核文档** 历史设备号分配记录在`documentation/devices.txt`(新内核可能位于`Documentation/admin-guide/devices.txt`)[^1]。 #### 五、实际应用示例 1. **虚拟终端 (tty)** - 主设备号固定为4,次设备号区分不同终端(如`/dev/tty1`、`/dev/tty2`)[^5]。 2. **伪终端 (pty)** - 主设备`ptmx`(主设备号5)与从设备`pts/N`(主设备号136)配合实现终端模拟[^5]。 3. **硬盘分区** - `/dev/sda1`(主设备号8,次设备号1)与`/dev/sda2`(次设备号2)共享同一驱动程序。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值