linux 内核设备号

设备号最大是多少?

设备号(dev_t)是一个 32 位 的整数

设备号 (Major): 占用 12 位,取值范围是 0 ~ 4095。

次设备号 (Minor): 占用 20 位,取值范围是 0 ~ 1,048,575 (2^20 - 1)。

所有驱动都会有一个设备号吗?

不是。只有那些需要通过文件系统接口(即 /dev 下的文件)与用户态交互(open, read, write, ioctl)的驱动才需要设备号。

什么时候驱动会注册设备号?

在加载内核模块时,会请求注册设备号。

为什么网络设备不用在文件系统中注册节点?

硬件接口(eth0)和内核实现的逻辑协议(TCP/IP)之间隔得太远,一个网卡可以同时承载成千上万个 TCP 连接。传统的字符/块设备抽象不适合网络设备。

Linux 使用专门的系统调用 SYS_SOCKET 来处理网络设备,相当于将常规的用户态库移动到了内核态,用高级别封装 API 来使用网路设备。

为什么设备只分为字符设备和块设备

因为两种设备的逻辑差别非常大,字符设备不能随机读写,需要实时性,内核没有缓存;块设备可以随机读写,内核为其设计了一套 Cache 系统用来加速访问。

除了上述两种设备,还有网络设备。

内核识别设备的流程

  1. 内核维护着设备列表和驱动列表
  2. 当设备插入时,总线枚举设备,获取硬件 ID,加入设备列表
  3. 当新的驱动 insmod 时,会加入驱动列表
  4. 当设备列表 or 驱动列表变动时,内核触发 match
  5. 当匹配成功后,执行驱动的 probe 函数
    1. 将驱动向内核注册主次设备号:alloc_chrdev_region
    2. 将设备号与驱动函数绑定:cdev_init, cdev_add, register_blkdev
    3. 在 sys 下创建设备:class_create, device_create
    4. 触发 uevent 事件
  6. udev 接收 uevent 事件,在 /dev 下创建设备节点

如果设备需要在 /dev 下注册节点,才需要注册设备号,否则这不是必须操作。

如果内核期望通过 uevent 创建设备节点,则需要在 sys 下创建设备,否则这不是必须操作。因为驱动开发者可以自定义驱动并只绑定驱动函数,通过 printk 打印出来,之后再手动 mknod 也是可以的。

所有设备都会在 /dev 下注册节点吗?

不会,只有期望通过 read, write, ioctl 接口访问的设备需要在 /dev 下注册节点。

一些没有设备号的设备:

  1. 网络设备:因为有复杂的协议栈,通过 socket 接口访问
  2. 总线控制器:只会在 sys 下提供一些只读的接口
  3. 简单的设备驱动:直接在 sys 下提供接口,读写来控制

如何知道所有设备号

基本上所有设备都在 sys 下注册,如果某个设备有 dev 文件,说明他可以注册了主次设备号,可以在 /dev 下创建节点。

shell 复制代码
$ cat /sys/class/block/sda/dev
8:0

mknod 一定要在 /dev 下吗?

不需要,这只是一种约定。

什么是 devtmpfs

在驱动创建设备时(device_create),会由内核在 /dev 下创建节点。节点名即 device_create 中定义的设备名,与 /sys 下的设备同名。

比如 devtmpfs 先创建 /dev/sda。udev 再创建 /dev/disk/by-uuid/xxxx。

可以在早期创建很多必要的设备节点,比如 /dev/console 等。

相关推荐
AKA__Zas1 小时前
TCP 与 IP 浅显皮毛
服务器·网络·tcp/ip
Lsetea8 小时前
curl指定CA目录仍报证书不受信任:--capath与OpenSSL rehash排查
运维·https·ssl·openssl·curl
夜听莺儿鸣8 小时前
502-002_Linux驱动开发模块化编程
linux·驱动开发·模块化编程
wuminyu9 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
优化Henry9 小时前
LTE 载波频率与频点配置详解
运维·网络·学习·5g·信息与通信
代码方舟9 小时前
数据科学风控实战:基于天远全能消金报告构建自动化信用评估网关
运维·人工智能·自动化
科力锐品牌君10 小时前
应用级灾备 | 海量非结构化数据如何实现高效数据保护
linux·运维·网络·安全·系统安全·数据安全·灾备
KaiwuDB10 小时前
KaiwuDB 运维实战04:DRBD + KaiwuDB——物联网场景下的低成本数据库高可用方案
运维·数据库·物联网·时序数据库·kaiwudb·aiot·多模数据库
zhangrelay10 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
福建佰胜张工10 小时前
A5E00839230西门子工业核心配件详解:参数、安装调试与故障运维全攻略
运维·网络·安全·自动化