Linux系统中,”major“通常指主设备号或内核版本号中的主版本标识,以下是关于如何查看这两种不同场景下的详细说明:
查看设备的主设备号(Major Number)
当涉及硬件驱动开发时,每个设备文件都有一个唯一的标识符,由主设备号(Major)和次设备号(Minor)组成,在/dev
目录下的设备节点会关联到特定的驱动程序,而主设备号决定了使用哪个驱动模块处理该类设备。
方法1:通过 /proc/devices
文件
直接查看系统已分配的所有主/次设备号组合:
cat /proc/devices
输出示例如下:
| 设备类型 | 主设备号 (Major) | 名称 |
|———-|——————|——————–|
| char | 1 | mem |
| block | 8 | sd |
| … | … | … |
此文件中每一行对应一种类型的设备及其对应的主设备号范围,主设备号为8
通常代表SCSI磁盘设备。
方法2:使用宏定义解析现有设备号
若已知某个具体设备的路径(如 /dev/ttyS0
),可通过编程接口提取其主设备号,在C语言中使用内核提供的宏:
#include <linux/kdev_t.h> dev_t dev = MKDEV(int major, int minor); // 合成设备号 unsigned major = MAJOR(dev_t dev); // 提取主设备号 unsigned minor = MINOR(dev_t dev); // 提取次设备号
MKDEV(ma, mi)
将两个数字合并为一个32位整数,高12位存储主设备号,低20位存储次设备号,这种机制允许动态分配和管理设备资源。
方法3:手动检查设备节点属性
对于特定设备文件(如 /dev/null
),可以使用命令行工具获取详细信息:
ls -l /dev/null
虽然不会直接显示数字形式的主设备号,但结合上述工具可进一步分析,驱动程序注册时会调用类似以下的函数来声明支持的主设备号:
register_chrdev_region(dev_t first, unsigned int count, char name);
这里的参数first
即起始的主设备号。
查看Linux内核版本的主版本号(Kernel Major Version)
Linux内核采用语义化版本控制策略,格式为 major.minor.patch-build.desc
,其中的“major”表示重大架构变更后的迭代更新。
常用命令:
-
uname -a
完整输出包含内核版本信息:Linux localhost 5.4.0-91-generic #1 SMP Debian 5.4.78-1 (2020-06-09) x86_64 GNU/Linux
这里的第一个数字
5
就是主版本号,代表这是一个较新的稳定分支。 -
cat /proc/version
显示更详细的编译信息:Linux version 5.4.0-91-generic (buildd@lgvb12n64) (gcc version 9.3.0 (...) ) #1 SMP ...
同样可以看到主版本号为
5
。 -
lsb_release -a
(适用于发行版)
如果需要确认整个系统的发行版是否基于某个特定内核系列,该命令会返回类似结果:Distributor ID: Ubuntu Description: Ubuntu 20.04.4 LTS Release: 20.04 Codename: focal
尽管未直接展示内核细节,但可通过关联推断使用的内核大版本。
应用场景对比
场景 | 目标 | 典型工具 |
---|---|---|
设备驱动开发 | 确定设备的主设备号 | /proc/devices , MAJOR() 宏 |
系统升级兼容性检查 | 识别当前运行的内核主版本 | uname -a , cat /proc/version |
硬件故障排查 | 验证是否正确加载对应驱动模块 | dmesg | grep <主设备号> |
相关问答FAQs
Q1: 如果两个设备具有相同的主设备号会怎样?
答:这是允许的设计模式,相同主设备号的不同设备通过唯一的次设备号区分,多个串口可能共享同一主设备号,但分配不同的次要编号(如 ttyS0~ttyS3
),驱动程序内部会根据次设备号进行多路复用处理。
Q2: 为什么内核版本中的主版本极少变化?
答:根据Linux社区规范,只有发生根本性架构改动(如内存模型重构、调度器重写)才会递增主版本号,这种保守策略确保向后兼容性,避免破坏现有软件生态,从内核4.x升级到5.x意味着重大改进而非简单修复
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/94234.html