rdrive
rdrive 是一个用于裸机操作系统(Bare-metal OS)的动态驱动管理框架,提供设备探测、驱动注册、设备管理等核心功能。
功能特性
- 设备树(FDT)支持:自动从 Flattened Device Tree 解析设备信息并匹配驱动
- PCIe 设备支持:支持 PCI Express 设备的探测和管理
- 动态驱动注册:支持编译时和运行时驱动注册
- 多级探测机制:支持内核前(Pre-kernel)和内核后(Post-kernel)两阶段设备探测
- 优先级管理:驱动按优先级排序,确保依赖设备先初始化
- 线程安全:使用自旋锁保证多核环境下的安全访问
no_std兼容:适用于裸机环境,不依赖标准库
架构概述
┌─────────────────────────────────────────────────────────┐
│ 应用层 (Applications) │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Manager │ │ Probe │ │ Register │ │
│ │ (设备管理器) │ │ (设备探测) │ │ (驱动注册) │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
├─────────────────────────────────────────────────────────┤
│ 平台抽象层 (Platform) │
│ ┌──────────┐ ┌──────────┐ │
│ │ FDT │ │ PCI │ │
│ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────────────┤
│ 驱动接口层 (rdif-*) │
│ rdif-base │ rdif-intc │ rdif-clk │ rdif-pcie ... │
└─────────────────────────────────────────────────────────┘
快速开始
1. 添加依赖
在 Cargo.toml 中添加:
[]
= "0.18"
2. 初始化 rdrive
use NonNull;
use ;
// 从 FDT 地址初始化
let fdt_addr: = /* 设备树地址 */;
init.expect;
3. 注册驱动
use ;
// 定义 FDT 驱动注册信息
static MY_DRIVER_REGISTER: DriverRegister = DriverRegister ;
// 注册驱动
register_add;
4. 执行设备探测
use probe_pre_kernel;
// 在内核初始化前探测设备
probe_pre_kernel.expect;
5. 获取设备实例
use get_device;
use Intc;
// 获取中断控制器设备
let intc: = get_device.expect;
核心模块
Manager(设备管理器)
Manager 是 rdrive 的核心,负责:
- 管理所有注册的驱动
- 存储已探测到的设备实例
- 提供设备查找接口
Probe(设备探测)
支持多种设备探测方式:
- FDT 探测:根据设备树 compatible 字符串匹配驱动
- PCI 探测:扫描 PCI 总线发现设备
探测级别:
PreKernel:内核初始化前探测(如中断控制器、时钟)PostKernel:内核初始化后探测(如存储、网络设备)
Register(驱动注册)
驱动注册支持:
- 编译时静态注册(通过链接器脚本)
- 运行时动态注册
- 优先级排序(数值越小优先级越高)
预定义优先级
pub const CLK: ProbePriority = ProbePriority; // 时钟
pub const INTC: ProbePriority = ProbePriority; // 中断控制器
pub const DEFAULT: ProbePriority = ProbePriority; // 默认
驱动接口(rdif)
rdrive 通过 rdif-* 系列 crate 定义标准驱动接口:
| 接口 | 描述 |
|---|---|
rdif-base |
基础驱动接口和错误类型 |
rdif-intc |
中断控制器接口 |
rdif-clk |
时钟驱动接口 |
rdif-pcie |
PCIe 接口 |
rdif-serial |
串口驱动接口 |
rdif-block |
块设备接口 |
rdif-timer |
定时器接口 |
平台支持
- 架构:AArch64、LoongArch64、RISC-V、x86_64
- 引导方式:FDT (Flattened Device Tree)
- 总线:PCI Express
许可证
本项目采用 MIT 许可证,详见 LICENSE 文件。
相关项目
- sparreal-os - 基于 rdrive 的 Rust 实时操作系统
- rdif - 驱动接口定义
贡献
欢迎提交 Issue 和 PR!请确保代码通过 cargo check 和 cargo clippy 检查。
由 周睿 创建并维护