SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtio_blk_defs.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <cstddef>
8#include <cstdint>
9
10namespace virtio::blk {
11
20enum class BlkFeatureBit : uint64_t {
22 kSizeMax = 1ULL << 1,
24 kSegMax = 1ULL << 2,
26 kGeometry = 1ULL << 4,
28 kRo = 1ULL << 5,
30 kBlkSize = 1ULL << 6,
32 kFlush = 1ULL << 9,
34 kTopology = 1ULL << 10,
36 kConfigWce = 1ULL << 11,
38 kMq = 1ULL << 12,
40 kDiscard = 1ULL << 13,
42 kWriteZeroes = 1ULL << 14,
44 kLifetime = 1ULL << 15,
46 kSecureErase = 1ULL << 16,
47};
48
59struct [[gnu::packed]] BlkConfig {
61 uint64_t capacity;
63 uint32_t size_max;
65 uint32_t seg_max;
66
68 struct [[gnu::packed]] {
70 uint16_t cylinders;
72 uint8_t heads;
74 uint8_t sectors;
75 } geometry;
76
78 uint32_t blk_size;
79
81 struct [[gnu::packed]] {
87 uint16_t min_io_size;
89 uint32_t opt_io_size;
90 } topology;
91
94 uint8_t writeback;
96 uint8_t unused0[3];
97
104
112 uint8_t unused1[3];
113
120
122 uint16_t num_queues;
124 uint8_t unused2[6];
125};
126
134enum class BlkConfigOffset : uint32_t {
135 kCapacity = 0,
136 kSizeMax = 8,
137 kSegMax = 12,
139 kGeometryHeads = 18,
140 kGeometrySectors = 19,
141 kBlkSize = 20,
146 kWriteback = 32,
148 kMaxDiscardSeg = 40,
156 kNumQueues = 72,
157};
158
166enum class ReqType : uint32_t {
168 kIn = 0,
170 kOut = 1,
172 kFlush = 4,
174 kGetId = 8,
176 kGetLifetime = 10,
178 kDiscard = 11,
180 kWriteZeroes = 13,
182 kSecureErase = 14,
183};
184
191enum class BlkStatus : uint8_t {
193 kOk = 0,
195 kIoErr = 1,
197 kUnsupp = 2,
198};
199
209struct [[gnu::packed]] BlkReqHeader {
211 uint32_t type;
213 uint32_t reserved;
215 uint64_t sector;
216};
217
225struct [[gnu::packed]] BlkDiscardWriteZeroes {
227 uint64_t sector;
229 uint32_t num_sectors;
231 struct [[gnu::packed]] {
234 uint32_t unmap : 1;
236 uint32_t reserved : 31;
237 } flags;
238};
239
247struct [[gnu::packed]] BlkLifetime {
251 enum class PreEolInfo : uint16_t {
253 kUndefined = 0,
255 kNormal = 1,
257 kWarning = 2,
259 kUrgent = 3,
260 };
261
263 uint16_t pre_eol_info;
271};
272
274inline constexpr size_t kSectorSize = 512;
275
278inline constexpr size_t kDeviceIdMaxLen = 20;
279
285 uint64_t bytes_transferred{0};
287 uint64_t kicks_elided{0};
291 uint64_t queue_full_errors{0};
292};
293
294} // namespace virtio::blk
constexpr size_t kDeviceIdMaxLen
ReqType
块设备请求类型
@ kGetLifetime
获取设备生命周期信息 (VIRTIO_BLK_T_GET_LIFETIME)
@ kGetId
获取设备 ID (VIRTIO_BLK_T_GET_ID)
@ kOut
写入 (VIRTIO_BLK_T_OUT)
@ kIn
读取 (VIRTIO_BLK_T_IN)
constexpr size_t kSectorSize
标准扇区大小(字节)
BlkConfigOffset
块设备配置空间字段偏移量
BlkStatus
块设备请求状态
@ kUnsupp
不支持的操作 (VIRTIO_BLK_S_UNSUPP)
@ kIoErr
IO 错误 (VIRTIO_BLK_S_IOERR)
@ kOk
操作成功 (VIRTIO_BLK_S_OK)
BlkFeatureBit
块设备特性位定义
@ kSegMax
设备配置空间中 seg_max 字段有效 (VIRTIO_BLK_F_SEG_MAX)
@ kWriteZeroes
设备支持 write zeroes 命令 (VIRTIO_BLK_F_WRITE_ZEROES)
@ kDiscard
设备支持 discard 命令 (VIRTIO_BLK_F_DISCARD)
@ kTopology
设备配置空间中 topology 字段有效 (VIRTIO_BLK_F_TOPOLOGY)
@ kMq
设备支持多队列 (VIRTIO_BLK_F_MQ)
@ kRo
设备为只读设备 (VIRTIO_BLK_F_RO)
@ kConfigWce
设备可在回写和直写缓存模式间切换 (VIRTIO_BLK_F_CONFIG_WCE)
@ kSizeMax
设备配置空间中 size_max 字段有效 (VIRTIO_BLK_F_SIZE_MAX)
@ kBlkSize
设备配置空间中 blk_size 字段有效 (VIRTIO_BLK_F_BLK_SIZE)
@ kFlush
设备支持缓存刷新命令 (VIRTIO_BLK_F_FLUSH)
@ kSecureErase
设备支持 secure erase 命令 (VIRTIO_BLK_F_SECURE_ERASE)
@ kGeometry
设备配置空间中 geometry 字段有效 (VIRTIO_BLK_F_GEOMETRY)
@ kLifetime
设备支持提供存储生命周期信息 (VIRTIO_BLK_F_LIFETIME)
块设备配置空间布局
uint8_t heads
磁头数
uint32_t max_write_zeroes_seg
write zeroes 命令的最大段数(如果 VIRTIO_BLK_F_WRITE_ZEROES 被协商)
uint32_t max_secure_erase_sectors
secure erase 命令的最大扇区数(如果 VIRTIO_BLK_F_SECURE_ERASE 被协商)
uint32_t size_max
任意单个段的最大字节数(如果 VIRTIO_BLK_F_SIZE_MAX 被协商)
uint16_t min_io_size
建议的最小 I/O 大小(块数)
uint32_t max_write_zeroes_sectors
write zeroes 命令的最大扇区数(如果 VIRTIO_BLK_F_WRITE_ZEROES 被协商)
uint32_t blk_size
块大小(字节),用于性能优化(如果 VIRTIO_BLK_F_BLK_SIZE 被协商)
uint32_t opt_io_size
建议的最优 I/O 大小(块数)
uint64_t capacity
设备容量(以 512 字节扇区为单位)
uint32_t max_discard_seg
discard 命令的最大段数(如果 VIRTIO_BLK_F_DISCARD 被协商)
uint32_t secure_erase_sector_alignment
secure erase 扇区对齐要求(如果 VIRTIO_BLK_F_SECURE_ERASE 被协商)
uint8_t write_zeroes_may_unmap
write zeroes 是否可能导致 unmap(如果 VIRTIO_BLK_F_WRITE_ZEROES 被协商)
uint16_t cylinders
柱面数
uint16_t num_queues
请求队列数(如果 VIRTIO_BLK_F_MQ 被协商)
uint32_t max_discard_sectors
discard 命令的最大扇区数(如果 VIRTIO_BLK_F_DISCARD 被协商)
uint32_t max_secure_erase_seg
secure erase 命令的最大段数(如果 VIRTIO_BLK_F_SECURE_ERASE 被协商)
uint8_t sectors
每磁道扇区数
uint32_t seg_max
单个请求中的最大段数(如果 VIRTIO_BLK_F_SEG_MAX 被协商)
uint32_t discard_sector_alignment
discard 扇区对齐要求(如果 VIRTIO_BLK_F_DISCARD 被协商)
uint8_t physical_block_exp
每个物理块包含的逻辑块数 (log2)
uint8_t alignment_offset
第一个对齐逻辑块的偏移
Discard/Write Zeroes/Secure Erase 请求段
uint32_t reserved
保留位,必须为 0
uint32_t num_sectors
扇区数(以 512 字节为单位)
uint64_t sector
起始扇区(以 512 字节为单位)
设备生命周期信息
uint16_t pre_eol_info
预 EOL (End-Of-Life) 信息
PreEolInfo
Pre-EOL 信息常量
uint64_t sector
起始扇区号(仅对读/写请求有效,其他类型应设为 0)
uint32_t type
请求类型 (ReqType)
uint32_t reserved
保留字段,必须为 0
VirtIO 设备性能监控统计数据
uint64_t interrupts_handled
已处理的中断次数
uint64_t queue_full_errors
队列满导致入队失败的次数
uint64_t kicks_elided
借助 Event Index 省略的 Kick 次数
uint64_t bytes_transferred
已传输字节数
@ kNormal
普通任务