os/vfs/devno.rs
1//! 设备号到驱动的硬编码映射
2//!
3//! 冷插拔系统的简化实现:所有设备号到驱动的映射都通过硬编码规则完成。
4
5use crate::device::{BLK_DRIVERS, Driver, RTC_DRIVERS, SERIAL_DRIVERS};
6use crate::vfs::dev::{major, minor};
7use alloc::sync::Arc;
8
9/// 标准字符设备 major 号
10pub mod chrdev_major {
11 pub const MEM: u32 = 1; // /dev/null, /dev/zero 等
12 pub const TTY: u32 = 4; // /dev/tty*, /dev/ttyS*
13 pub const CONSOLE: u32 = 5; // /dev/console
14 pub const MISC: u32 = 10; // /dev/misc/* (rtc=135)
15 pub const INPUT: u32 = 13; // /dev/input/*
16}
17
18/// MISC 设备 minor 号
19pub mod misc_minor {
20 pub const RTC: u32 = 135;
21}
22
23/// 标准块设备 major 号
24pub mod blkdev_major {
25 pub const LOOP: u32 = 7; // /dev/loop*
26 pub const SCSI_DISK: u32 = 8; // /dev/sd*
27 pub const VIRTIO_BLK: u32 = 254; // /dev/vd*
28}
29
30/// 查找字符设备驱动(硬编码规则)
31///
32/// # 参数
33/// - `dev`: 设备号
34///
35/// # 返回
36/// - `Some(driver)`: 找到对应驱动
37/// - `None`: 未找到或不需要驱动(如内存设备)
38pub fn get_chrdev_driver(dev: u64) -> Option<Arc<dyn Driver>> {
39 let maj = major(dev);
40 let min = minor(dev);
41
42 match maj {
43 chrdev_major::MEM => {
44 // 内存设备 (/dev/null, /dev/zero 等)
45 // 在 CharDeviceFile 中直接处理,无需驱动
46 None
47 }
48 chrdev_major::TTY => {
49 // TTY 设备
50 if min >= 64 && min < 128 {
51 // 串口设备:ttyS0-ttyS63 (minor 64-127)
52 let idx = (min - 64) as usize;
53 SERIAL_DRIVERS
54 .read()
55 .get(idx)
56 .map(|d| d.clone() as Arc<dyn Driver>)
57 } else {
58 // 虚拟终端:tty0-tty63 (minor 0-63)
59 // 暂不支持
60 None
61 }
62 }
63 chrdev_major::CONSOLE => {
64 // 控制台设备 (minor 1)
65 // 使用第一个串口作为控制台
66 SERIAL_DRIVERS
67 .read()
68 .first()
69 .map(|d| d.clone() as Arc<dyn Driver>)
70 }
71 chrdev_major::MISC => {
72 // misc 设备
73 if min == misc_minor::RTC {
74 // RTC 设备 (/dev/misc/rtc)
75 RTC_DRIVERS
76 .read()
77 .first()
78 .map(|d| d.clone() as Arc<dyn Driver>)
79 } else {
80 None
81 }
82 }
83 _ => None,
84 }
85}
86
87/// 查找块设备驱动索引(硬编码规则)
88///
89/// # 参数
90/// - `dev`: 设备号
91///
92/// # 返回
93/// - `Some(index)`: BLK_DRIVERS 中的索引
94/// - `None`: 未找到
95pub fn get_blkdev_index(dev: u64) -> Option<usize> {
96 let maj = major(dev);
97 let min = minor(dev);
98
99 match maj {
100 blkdev_major::VIRTIO_BLK => {
101 // VirtIO 块设备:minor 直接对应 BLK_DRIVERS 索引
102 // vda=0, vdb=1, vdc=2, ...
103 Some(min as usize)
104 }
105 blkdev_major::SCSI_DISK => {
106 // SCSI 磁盘:每个磁盘占用 16 个 minor(0-15 为分区)
107 // sda: minor 0-15, sdb: minor 16-31, ...
108 let disk_idx = (min / 16) as usize;
109 Some(disk_idx)
110 }
111 blkdev_major::LOOP => {
112 // 回环设备:暂不支持
113 None
114 }
115 _ => None,
116 }
117}