5.29 Block设备
2026/7/20大约 2 分钟设备驱动驱动Block块设备存储文件系统
5.29 Block设备
📚 本节导读
学习时长: 约 25 分钟
难度级别: ⭐⭐⭐☆☆
前置知识: C 语言基础、存储基础知识、5.1 设备驱动框架、5.27 MTD 设备
🎯 学习目标
- 理解 Block 块设备的概念与设计
- 掌握
os_blk_geometry几何信息结构体 - 掌握
os_blk_ops操作函数表 - 理解 Block 设备与 MTD 设备的关系
一、概述
Block 设备是 OneOS 提供的块存储设备抽象层,以固定大小的块(Block)为单位进行读写操作。它通常作为 MTD 设备的上层封装,为文件系统提供标准的块设备接口。驱动源码位于 drivers/block/ 目录下,核心头文件为 block_device.h。
Block 设备框架的特点:
- 块级操作:以块为单位进行读写,块大小通常为 512 字节
- 几何信息:通过
os_blk_geometry提供块大小和总容量 - 文件系统桥梁:为文件系统(如 FatFs、LittleFS)提供底层块设备支持
- MTD 封装:通常将 MTD 设备封装为 Block 设备
二、核心数据结构
2.1 Block 几何信息 struct os_blk_geometry
struct os_blk_geometry
{
uint32_t block_size; /* 块大小(字节),通常 512 */
uint64_t capacity; /* 总容量(字节) */
};2.2 Block 操作函数表 struct os_blk_ops
struct os_blk_ops
{
int (*read_block)(os_blk_device_t *blk, uint32_t block_addr, uint8_t *buff, uint32_t block_nr);
int (*write_block)(os_blk_device_t *blk, uint32_t block_addr, const uint8_t *buff, uint32_t block_nr);
};2.3 Block 设备结构体
struct os_blk_device
{
struct os_device blk_dev;
struct os_blk_geometry geometry;
const struct os_blk_ops *blk_ops;
void *priv;
};2.4 控制命令
#define OS_DEVICE_CTRL_BLK_GETGEOME IOC_BLOCK(0) /* 获取几何信息 */
#define OS_DEVICE_CTRL_BLK_SYNC IOC_BLOCK(1) /* 同步数据 */
#define OS_DEVICE_CTRL_BLK_AUTOREFRESH IOC_BLOCK(3) /* 自动刷新 */三、关键 API
os_err_t block_device_register(os_blk_device_t *blk_dev, const char *name);
os_err_t block_device_unregister(os_blk_device_t *blk_dev);四、使用示例
#include <block_device.h>
static int my_blk_read(os_blk_device_t *blk, uint32_t addr,
uint8_t *buff, uint32_t nr) { return nr; }
static int my_blk_write(os_blk_device_t *blk, uint32_t addr,
const uint8_t *buff, uint32_t nr) { return nr; }
static const struct os_blk_ops my_blk_ops = {
.read_block = my_blk_read, .write_block = my_blk_write,
};
void block_device_init(void)
{
static os_blk_device_t blk_dev;
blk_dev.geometry.block_size = 512;
blk_dev.geometry.capacity = 128 * 1024 * 1024;
blk_dev.blk_ops = &my_blk_ops;
block_device_register(&blk_dev, "blk0");
}📝 本节小结
本节介绍了 Block 块设备驱动,包括块级操作、几何信息、文件系统桥梁等核心概念。