axdriver_block 技术文档
路径:
components/axdriver_crates/axdriver_block类型:库 crate 分层:组件层 / 块设备类别接口层 版本:0.1.4-preview.3文档依据:Cargo.toml、README.md、src/lib.rs、src/ramdisk.rs、src/ramdisk_static.rs、src/sdmmc.rs、src/bcm2835sdhci.rs、os/arceos/modules/axdriver/src/drivers.rs、platform/axplat-dyn/src/drivers/blk/mod.rs
axdriver_block 不是文件系统,也不是块缓存层。它的真实定位是 ArceOS 驱动栈里的块设备类别接口 crate:一方面定义统一的 BlockDriverOps,另一方面在 feature 打开时提供少量叶子块设备实现,例如 ramdisk、sdmmc、bcm2835-sdhci 和 ahci。上层 ax-driver 负责探测与聚合,ax-fs/ax-fs-ng 才是消费块设备并组织文件系统语义的地方。
1. 架构设计分析
1.1 设计定位
这个 crate 同时承担两类职责:
- 类别接口层:通过
BlockDriverOps统一块设备的容量、块大小、读写和刷盘语义。 - 可选叶子实现层:通过 feature 暴露若干具体块设备实现。
因此它不是纯粹的“trait-only crate”,但也不是系统级块设备管理器。当前真实模块如下:
| 模块 | 启用条件 | 作用 |
|---|---|---|
ramdisk | ramdisk | 基于堆内存的 RAM 盘 |
ramdisk_static | ramdisk-static | 基于静态切片的 RAM 盘 |
sdmmc | sdmmc | 基于 simple_sdmmc::SdMmc 的 SD/MMC 驱动 |
bcm2835sdhci | bcm2835-sdhci | Raspberry Pi 侧的 BCM2835 SDHCI 驱动 |
ahci | ahci | AHCI 控制器驱动实现入口 |
1.2 核心接口
BlockDriverOps 继承 BaseDriverOps,定义了五个关键方法:
num_blocks():返回逻辑块总数。block_size():返回单块大小。read_block():从给定块号开始读取,可跨多块。write_block():从给定块号开始写入,可跨多块。flush():把待刷写数据提交到底层介质。
这里最重要的设计点是:读写接口以“逻辑块设备”视角工作,而不是以文件、分区或页缓存视角工作。
1.3 具体实现的行为差异
ramdisk
ramdisk::RamDisk 用 512 字节对齐的堆内存作为后端:
new(size_hint)会向上按 512 字节对齐。read_block()/write_block()要求缓冲区长度是块大小整数倍。- 超界访问返回
DevError::Io。 flush()为空操作,因为数据本来就在内存中。
sdmmc
sdmmc::SdMmcDriver 是对 simple_sdmmc::SdMmc 的薄封装:
- 构造函数是
unsafe fn new(base: usize)。 - 多块读写通过
as_chunks()/as_chunks_mut()分块循环完成。 - 若缓冲区长度不是块大小整数倍,返回
DevError::InvalidParam。
bcm2835sdhci
bcm2835sdhci::SDHCIDriver 通过 try_new() 初始化控制器:
- 初始化失败直接映射为
DevError::Io。 - 读写要求缓冲区至少覆盖一个块,且需满足
u32对齐要求。 - 将外部
SDHCIError映射回统一的DevError。
1.4 与 ax-driver 聚合层的接线关系
在当前仓库中,真正把这些实现接进系统初始化流程的是 os/arceos/modules/axdriver/src/drivers.rs:
ramdisk通过RamDiskDriver::probe_global()创建固定大小 16 MiB RAM 盘。sdmmc通过SdMmcDriver::new()使用ax_config::devices::SDMMC_PADDR对应寄存器基址。bcm2835-sdhci通过SDHCIDriver::try_new()接入。
需要特别注意一个实现事实:axdriver_block 虽然有 ahci feature 和 ahci 模块,但当前 ax-driver::drivers.rs 并没有把 AHCI 探测逻辑注册进去。 也就是说,打开 feature 并不等于当前 ArceOS 探测路径就会自动发现 AHCI 设备。