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}