SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtio::DeviceInitializer< TransportImpl > Class Template Reference

Virtio 设备初始化器 More...

#include <device_initializer.hpp>

Collaboration diagram for virtio::DeviceInitializer< TransportImpl >:
Collaboration graph

Public Member Functions

auto Init (uint64_t driver_features) -> Expected< uint64_t >
 执行 virtio 设备初始化序列
 
auto SetupQueue (uint32_t queue_idx, uint64_t desc_phys, uint64_t avail_phys, uint64_t used_phys, uint32_t queue_size) -> Expected< void >
 配置并激活指定的 virtqueue
 
auto Activate () -> Expected< void >
 激活设备,开始正常运行
 
auto transport () -> TransportImpl &
 获取底层传输层引用
 
auto transport () const -> const TransportImpl &
 
构造/析构函数
 DeviceInitializer (TransportImpl &transport)
 构造函数
 
 DeviceInitializer ()=delete
 
 DeviceInitializer (const DeviceInitializer &)=delete
 
 DeviceInitializer (DeviceInitializer &&)=delete
 
auto operator= (const DeviceInitializer &) -> DeviceInitializer &=delete
 
auto operator= (DeviceInitializer &&) -> DeviceInitializer &=delete
 
 ~DeviceInitializer ()=default
 

Private Attributes

TransportImpl & transport_
 底层传输层引用
 

Detailed Description

template<TransportConcept TransportImpl>
class virtio::DeviceInitializer< TransportImpl >

Virtio 设备初始化器

负责编排 virtio 设备的初始化流程,独立于底层传输机制(MMIO、PCI 等)。 实现 virtio 规范定义的标准初始化序列。

主要职责:

  • 执行完整的设备初始化序列(特性协商、状态设置等)
  • 配置和激活 virtqueue
  • 提供设备初始化流程的统一抽象

使用示例:

// 初始化设备并协商特性
auto features_result = initializer.Init(my_driver_features);
if (!features_result) { handle_error(); }
// 配置队列
initializer.SetupQueue(0, desc_phys, avail_phys, used_phys, queue_size);
// 激活设备
initializer.Activate();
Virtio 设备初始化器
auto transport() -> TransportImpl &
获取底层传输层引用
Virtio MMIO 传输层
Definition mmio.hpp:61
Template Parameters
TransportImpl具体传输层类型(如 MmioTransport)
See also
virtio-v1.2#3.1.1 Driver Requirements: Device Initialization

Definition at line 46 of file device_initializer.hpp.

Constructor & Destructor Documentation

◆ DeviceInitializer() [1/4]

template<TransportConcept TransportImpl>
virtio::DeviceInitializer< TransportImpl >::DeviceInitializer ( TransportImpl &  transport)
inlineexplicit

构造函数

Parameters
transport传输层引用(必须在 DeviceInitializer 生命周期内保持有效)
Precondition
transport.IsValid() == true

Definition at line 193 of file device_initializer.hpp.

TransportImpl & transport_
底层传输层引用

◆ DeviceInitializer() [2/4]

template<TransportConcept TransportImpl>
virtio::DeviceInitializer< TransportImpl >::DeviceInitializer ( )
delete

◆ DeviceInitializer() [3/4]

template<TransportConcept TransportImpl>
virtio::DeviceInitializer< TransportImpl >::DeviceInitializer ( const DeviceInitializer< TransportImpl > &  )
delete

◆ DeviceInitializer() [4/4]

template<TransportConcept TransportImpl>
virtio::DeviceInitializer< TransportImpl >::DeviceInitializer ( DeviceInitializer< TransportImpl > &&  )
delete

◆ ~DeviceInitializer()

template<TransportConcept TransportImpl>
virtio::DeviceInitializer< TransportImpl >::~DeviceInitializer ( )
default

Member Function Documentation

◆ Activate()

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::Activate ( ) -> Expected<void>
inline

激活设备,开始正常运行

设置 DRIVER_OK 状态位,完成设备初始化流程(步骤 8)。 必须在所有队列配置完成后调用。 调用后设备开始正常运行,可以处理队列中的请求。

Returns
成功或失败
Precondition
transport_.IsValid() == true
Init() 已成功调用
所有需要的队列已通过 SetupQueue() 配置
See also
virtio-v1.2#3.1.1 Driver Requirements: Device Initialization

Definition at line 153 of file device_initializer.hpp.

153 {
154 if (!transport_.IsValid()) {
155 return std::unexpected(Error{ErrorCode::kTransportNotInitialized});
156 }
157
158 uint32_t current_status = transport_.GetStatus();
159 transport_.SetStatus(
160 current_status |
161 std::to_underlying(Transport::DeviceStatus::kDriverOk));
162
163 uint32_t new_status = transport_.GetStatus();
164 if ((new_status &
165 std::to_underlying(Transport::DeviceStatus::kDeviceNeedsReset)) != 0) {
166 return std::unexpected(Error{ErrorCode::kDeviceError});
167 }
168
169 return {};
170 }
@ kDriverOk
表示驱动程序已准备好驱动设备(特性协商完成)
@ kDeviceNeedsReset
表示设备需要重置
@ kTransportNotInitialized
传输层未正确初始化
@ kDeviceError
通用设备报告错误
错误类型,用于 std::expected
Definition expected.hpp:343
Here is the caller graph for this function:

◆ Init()

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::Init ( uint64_t  driver_features) -> Expected<uint64_t>
inline

执行 virtio 设备初始化序列

完整执行设备初始化流程(步骤 1-6):

  1. 重置设备(写入 0 到 status 寄存器)
  2. 设置 ACKNOWLEDGE 状态位(识别为 virtio 设备)
  3. 设置 DRIVER 状态位(驱动程序知道如何驱动)
  4. 读取设备特性,与 driver_features 取交集后写回
  5. 设置 FEATURES_OK 状态位
  6. 重新读取验证 FEATURES_OK 是否仍被设置(设备可能拒绝某些特性组合)
Parameters
driver_features驱动程序希望启用的特性位(将与设备特性取交集)
Returns
成功时返回实际协商后的特性位;失败返回错误
Precondition
transport_.IsValid() == true(传输层已成功初始化)
Postcondition
初始化成功后,调用者还需配置队列并调用 Activate() 完成激活
See also
virtio-v1.2#3.1.1 Driver Requirements: Device Initialization

Definition at line 65 of file device_initializer.hpp.

65 {
66 if (!transport_.IsValid()) {
67 return std::unexpected(Error{ErrorCode::kTransportNotInitialized});
68 }
69
70 transport_.Reset();
71
72 transport_.SetStatus(
73 std::to_underlying(Transport::DeviceStatus::kAcknowledge));
74
75 transport_.SetStatus(
76 std::to_underlying(Transport::DeviceStatus::kAcknowledge) |
77 std::to_underlying(Transport::DeviceStatus::kDriver));
78
79 uint64_t device_features = transport_.GetDeviceFeatures();
80 uint64_t negotiated_features = device_features & driver_features;
81
82 transport_.SetDriverFeatures(negotiated_features);
83
84 transport_.SetStatus(
85 std::to_underlying(Transport::DeviceStatus::kAcknowledge) |
86 std::to_underlying(Transport::DeviceStatus::kDriver) |
87 std::to_underlying(Transport::DeviceStatus::kFeaturesOk));
88
89 uint32_t status = transport_.GetStatus();
90 if ((status & std::to_underlying(Transport::DeviceStatus::kFeaturesOk)) ==
91 0) {
92 transport_.SetStatus(
93 status | std::to_underlying(Transport::DeviceStatus::kFailed));
94 return std::unexpected(Error{ErrorCode::kFeatureNegotiationFailed});
95 }
96
97 return negotiated_features;
98 }
@ kDriver
表示客户操作系统知道如何驱动该设备
@ kFeaturesOk
表示驱动程序已确认设备提供的所有功能
@ kAcknowledge
表示客户操作系统已找到设备并识别为有效的 virtio 设备
@ kFailed
表示在客户机中出现问题,已放弃该设备
@ kFeatureNegotiationFailed
特性协商失败
Here is the caller graph for this function:

◆ operator=() [1/2]

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::operator= ( const DeviceInitializer< TransportImpl > &  ) -> DeviceInitializer &=delete
delete

◆ operator=() [2/2]

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::operator= ( DeviceInitializer< TransportImpl > &&  ) -> DeviceInitializer &=delete
delete

◆ SetupQueue()

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::SetupQueue ( uint32_t  queue_idx,
uint64_t  desc_phys,
uint64_t  avail_phys,
uint64_t  used_phys,
uint32_t  queue_size 
) -> Expected<void>
inline

配置并激活指定的 virtqueue

设置 virtqueue 的物理地址和大小,然后标记为就绪(步骤 7 的一部分)。 必须在调用 Init() 之后、Activate() 之前完成。

Parameters
queue_idx队列索引(从 0 开始)
desc_phys描述符表的客户机物理地址(必须 16 字节对齐)
avail_physAvailable Ring 的客户机物理地址(必须 2 字节对齐)
used_physUsed Ring 的客户机物理地址(必须 4 字节对齐)
queue_size队列大小(必须 <= transport_.GetQueueNumMax())
Returns
成功或失败
Precondition
transport_.IsValid() == true
Init() 已成功调用
See also
virtio-v1.2#3.1.1 Driver Requirements: Device Initialization

Definition at line 116 of file device_initializer.hpp.

118 {
119 if (!transport_.IsValid()) {
120 return std::unexpected(Error{ErrorCode::kTransportNotInitialized});
121 }
122
123 uint32_t max_size = transport_.GetQueueNumMax(queue_idx);
124 if (max_size == 0) {
125 return std::unexpected(Error{ErrorCode::kQueueNotAvailable});
126 }
127 if (queue_size > max_size) {
128 return std::unexpected(Error{ErrorCode::kQueueTooLarge});
129 }
130
131 transport_.SetQueueNum(queue_idx, queue_size);
132 transport_.SetQueueDesc(queue_idx, desc_phys);
133 transport_.SetQueueAvail(queue_idx, avail_phys);
134 transport_.SetQueueUsed(queue_idx, used_phys);
135 transport_.SetQueueReady(queue_idx, true);
136
137 return {};
138 }
@ kQueueTooLarge
请求的队列大小超过设备支持的最大值
@ kQueueNotAvailable
队列不可用(queue_num_max == 0)
Here is the caller graph for this function:

◆ transport() [1/2]

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::transport ( ) -> TransportImpl&
inline

获取底层传输层引用

允许访问底层传输层的其他功能(如读取配置空间、处理中断等)。

Returns
传输层的引用

Definition at line 179 of file device_initializer.hpp.

179{ return transport_; }

◆ transport() [2/2]

template<TransportConcept TransportImpl>
auto virtio::DeviceInitializer< TransportImpl >::transport ( ) const -> const TransportImpl&
inline

Definition at line 181 of file device_initializer.hpp.

181 {
182 return transport_;
183 }

Member Data Documentation

◆ transport_

template<TransportConcept TransportImpl>
TransportImpl& virtio::DeviceInitializer< TransportImpl >::transport_
private

底层传输层引用

Definition at line 205 of file device_initializer.hpp.


The documentation for this class was generated from the following file: