块设备 IO 控制
SylixOS 在”libsylixos/SylixOS/system/device/block/blockIo.c”文件中提供了块设备底层 I/O 接口。该类接口与 I/O 系统无关,供上层文件系统调用,用户仅可见文件系统。
除了上一小节提到的 __blockIoDevCreate 创建函数外,SylixOS 还提供了对应的删除函数,以及读写和控制函数,其中控制函数的函数原型如下:
#include <SylixOS.h>
INT __blockIoDevIoctl (INT iIndex, INT iCmd, LONG lArg);
函数 __blockIoDevIoctl 原型分析:
- 此函数成功返回 ERROR_NONE ,失败返回 ERROR_CODE 。
- 参数 iIndex 是块设备索引。
- 参数 iCmd 是控制命令。
- 参数 lArg 是控制参数。
SylixOS 要求磁盘设备必须支持如下表所示的通用 FIO 命令:
FIO 命令 | 含义 |
---|---|
FIOSYNC | 与 FIOFLUSH 相同 |
FIOFLUSH | 回写磁盘数据到物理磁盘 |
FIOUNMOUNT | 卸载磁盘 |
FIODISKINIT | 初始化磁盘 |
选择使用支持掉电保护的文件系统,需要支持如下表所示 FIO 命令:
FIO 命令 | 含义 |
---|---|
FIOSYNCMETA | 将指定范围的扇区数据完成写入磁盘 |
固态硬盘(SSD)需要支持如下表所示 FIO 命令:
FIO 命令 | 含义 |
---|---|
FIOTRIM | 针对固态硬盘回收指定范围的扇区 |
可移动磁盘介质还需要支持如下表所示 FIO 命令:
FIO 命令 | 含义 |
---|---|
FIODATASYNC | 数据回写,可以与 FIOSYNC 做相同处理 |
FIOCANCEL | 放弃还没有写入磁盘的数据(磁盘介质发生变化) |
FIODISKCHANGE | 磁盘介质发生变化,放弃还没写入磁盘的数据,然后必须将 BLKD_bDiskChange 设置为 LW_TRUE 使操作系统立即停止对相应卷的操作,等待重新挂载 |
除了以上必须支持的命令外,ioctl 还支持如下表所示通用指令(磁盘设备扩展):
通用命令 | 含义 |
---|---|
LW_BLKD_CTRL_POWER | 控制电源设备 |
LW_BLKD_POWER_OFF | 关闭磁盘电源 |
LW_BLKD_POWER_ON | 打开磁盘电源 |
LW_BLKD_CTRL_LOCK | 锁定设备(保留) |
LW_BLKD_CTRL_EJECT | 弹出设备(保留) |
LW_BLKD_GET_SECNUM | 获得设备扇区数量 |
LW_BLKD_GET_SECSIZE | 获得扇区的大小,单位:字节 |
LW_BLKD_GET_BLKSIZE | 获得块大小,单位:字节,可以与扇区大小相同 |
LW_BLKD_CTRL_RESET | 复位磁盘 |
LW_BLKD_CTRL_STATUS | 检查磁盘状态 |
LW_BLKD_CTRL_OEMDISK | 获得对应磁盘文件 OEM 控制块 |
块设备是 I/O 设备中的一类,SyilxOS 下最终会为每一个物理设备创建一个 BLK I/O 设备,在/dev/blk 目录下生成一个块设备文件,如/dev/blk/sata0,应用层可直接对其进行常规的 I/O 操作。相关内容在”libsylixos/SylixOS/fs/oemDisk/oemBlkIo.c”文件中。
BLK I/O 设备除了提供了底层 I/O 的相关控制命令外,还提供关于文件操作的相关命令。如下表所示。
通用命令 | 含义 |
---|---|
FIOSEEK | 文件重定位 |
FIOWHERE | 获得文件当前读写指针 |
FIONREAD | 获得文件剩余字节数 |
FIONREAD64 | 获得文件剩余字节数 |
FIOFSTATGET | 获得文件状态 |