SimpleKernel 1.17.0
Loading...
Searching...
No Matches
LocalApic Class Reference

Local APIC 驱动类 More...

#include <local_apic.h>

Collaboration diagram for LocalApic:
Collaboration graph

Public Member Functions

auto Init () -> Expected< void >
 初始化 Local APIC
 
auto GetApicVersion () const -> uint32_t
 获取 APIC 版本信息
 
auto SendEoi () const -> void
 发送中断结束信号 (EOI)
 
auto SendIpi (uint32_t destination_apic_id, uint8_t vector) const -> Expected< void >
 发送处理器间中断 (IPI)
 
auto BroadcastIpi (uint8_t vector) const -> Expected< void >
 广播 IPI 到所有其他 CPU
 
auto SetTaskPriority (uint8_t priority) const -> void
 设置任务优先级
 
auto GetTaskPriority () const -> uint8_t
 获取任务优先级
 
auto EnableTimer (uint32_t initial_count, uint32_t divide_value, uint8_t vector, bool periodic=true) const -> void
 启用 Local APIC 定时器
 
auto DisableTimer () const -> void
 禁用 Local APIC 定时器
 
auto GetTimerCurrentCount () const -> uint32_t
 获取定时器当前计数值
 
auto SetupPeriodicTimer (uint32_t frequency_hz, uint8_t vector) const -> void
 设置周期性定时器
 
auto SetupOneShotTimer (uint32_t microseconds, uint8_t vector) const -> void
 设置单次定时器
 
auto SendInitIpi (uint32_t destination_apic_id) const -> void
 发送 INIT IPI
 
auto SendStartupIpi (uint32_t destination_apic_id, uint8_t start_page) const -> void
 发送 SIPI (Startup IPI)
 
auto WakeupAp (uint32_t destination_apic_id, uint8_t start_vector) const -> void
 唤醒应用处理器 (AP)
 
auto ConfigureLvtEntries () const -> void
 配置 Local Vector Table 条目
 
auto ReadErrorStatus () const -> uint32_t
 读取错误状态
 
auto PrintInfo () const -> void
 打印 Local APIC 信息(调试用)
 
构造/析构函数
 LocalApic ()=default
 
 LocalApic (const LocalApic &)=delete
 
 LocalApic (LocalApic &&)=default
 
auto operator= (const LocalApic &) -> LocalApic &=delete
 
auto operator= (LocalApic &&) -> LocalApic &=default
 
 ~LocalApic ()=default
 

Private Member Functions

auto CheckX2ApicSupport () const -> bool
 检查 CPU 是否支持 x2APIC
 
auto EnableXApic () const -> bool
 启用传统 xAPIC 模式
 
auto DisableXApic () const -> bool
 禁用传统 xAPIC 模式
 
auto IsXApicEnabled () const -> bool
 检查传统 xAPIC 是否启用
 
auto EnableX2Apic () const -> bool
 启用 x2APIC 模式
 
auto DisableX2Apic () const -> bool
 禁用 x2APIC 模式
 
auto IsX2ApicEnabled () const -> bool
 检查 x2APIC 是否启用
 

Private Attributes

bool is_x2apic_mode_ {false}
 当前 APIC 模式(true = x2APIC, false = xAPIC)
 
uint64_t apic_base_ {kDefaultApicBase}
 APIC 基地址(仅用于 xAPIC 模式)
 

Static Private Attributes

xAPIC 寄存器偏移量常数

APIC ID 寄存器偏移

static constexpr uint32_t kXApicIdOffset = 0x20
 
static constexpr uint32_t kXApicVersionOffset = 0x30
 版本寄存器偏移
 
static constexpr uint32_t kXApicTprOffset = 0x80
 任务优先级寄存器偏移
 
static constexpr uint32_t kXApicEoiOffset = 0xB0
 EOI 寄存器偏移
 
static constexpr uint32_t kXApicSivrOffset = 0xF0
 虚假中断向量寄存器偏移
 
static constexpr uint32_t kXApicEsrOffset = 0x280
 错误状态寄存器偏移
 
static constexpr uint32_t kXApicIcrLowOffset = 0x300
 ICR 低位寄存器偏移
 
static constexpr uint32_t kXApicIcrHighOffset = 0x310
 ICR 高位寄存器偏移
 
static constexpr uint32_t kXApicLvtTimerOffset = 0x320
 LVT 定时器寄存器偏移
 
static constexpr uint32_t kXApicLvtLint0Offset = 0x350
 LVT LINT0 寄存器偏移
 
static constexpr uint32_t kXApicLvtLint1Offset = 0x360
 LVT LINT1 寄存器偏移
 
static constexpr uint32_t kXApicLvtErrorOffset = 0x370
 LVT 错误寄存器偏移
 
static constexpr uint32_t kXApicTimerInitCountOffset = 0x380
 定时器初始计数寄存器偏移
 
static constexpr uint32_t kXApicTimerCurrCountOffset = 0x390
 定时器当前计数寄存器偏移
 
static constexpr uint32_t kXApicTimerDivideOffset = 0x3E0
 定时器分频寄存器偏移
 
位掩码和位移常数

xAPIC ID 位移

static constexpr uint32_t kApicIdShift = 24
 
static constexpr uint32_t kApicIdMask = 0xFF
 xAPIC ID 掩码
 
static constexpr uint32_t kApicSoftwareEnableBit = 0x100
 APIC 软件启用位
 
static constexpr uint32_t kSpuriousVector = 0xFF
 虚假中断向量
 
static constexpr uint32_t kLvtMaskBit = 0x10000
 LVT 掩码位
 
static constexpr uint32_t kLvtPeriodicMode = 0x20000
 LVT 周期模式位
 
static constexpr uint32_t kIcrDeliveryStatusBit = 0x1000
 ICR 传递状态位
 
static constexpr uint32_t kIcrDestShift = 24
 ICR 目标位移
 
static constexpr uint32_t kIcrBroadcastMode = 0xC0000
 ICR 广播模式位
 
static constexpr uint32_t kInitIpiMode = 0x500
 INIT IPI 模式
 
static constexpr uint32_t kSipiMode = 0x600
 SIPI 模式
 
static constexpr uint32_t kExtIntMode = 0x700
 ExtINT 传递模式
 
static constexpr uint32_t kNmiMode = 0x400
 NMI 传递模式
 
static constexpr uint8_t kErrorVector = 0xEF
 错误中断向量
 
定时器相关常数

默认 APIC 时钟频率 (100MHz)

static constexpr uint32_t kDefaultApicClockHz = 100000000
 
static constexpr uint32_t kTimerDivideBy1 = 0x0B
 定时器分频 1
 
static constexpr uint32_t kTimerDivideBy16 = 0x03
 定时器分频 16
 
static constexpr uint32_t kCalibrationCount = 0xFFFFFFFF
 校准用的计数值
 
static constexpr uint32_t kCalibrationDelayLoop = 1000000
 校准延时循环次数
 
static constexpr uint32_t kCalibrationMultiplier = 100
 校准倍数 (10ms -> 1s)
 
static constexpr uint32_t kMicrosecondsPerSecond = 1000000
 每秒微秒数
 
APIC 基地址相关常数

默认 APIC 基地址

static constexpr uint64_t kDefaultApicBase = 0xFEE00000
 
static constexpr uint64_t kApicBaseMask = 0xFFFFF000ULL
 APIC 基地址掩码
 
static constexpr uint64_t kApicGlobalEnableBit = 1ULL << 11
 APIC 全局启用位
 
static constexpr uint64_t kX2ApicEnableBit = 1ULL << 10
 x2APIC 启用位
 
static constexpr uint64_t kApicBaseControlMask = 0xFFF
 APIC 基地址控制位掩码
 

Detailed Description

Local APIC 驱动类

Note
支持 xAPIC 和 x2APIC 模式,优先使用 x2APIC

Definition at line 18 of file local_apic.h.

Constructor & Destructor Documentation

◆ LocalApic() [1/3]

LocalApic::LocalApic ( )
default

◆ LocalApic() [2/3]

LocalApic::LocalApic ( const LocalApic )
delete

◆ LocalApic() [3/3]

LocalApic::LocalApic ( LocalApic &&  )
default

◆ ~LocalApic()

LocalApic::~LocalApic ( )
default

Member Function Documentation

◆ BroadcastIpi()

auto LocalApic::BroadcastIpi ( uint8_t  vector) const -> Expected<void>

广播 IPI 到所有其他 CPU

Parameters
vector中断向量
Returns
Expected<void> 广播成功返回空值,失败返回错误

Definition at line 136 of file local_apic.cpp.

136 {
137 if (is_x2apic_mode_) {
138 auto icr = static_cast<uint64_t>(vector);
139 // 目标简写:除自己外的所有 CPU
140 icr |= 0x80000;
141
142 cpu_io::msr::apic::WriteIcr(icr);
143
144 while ((cpu_io::msr::apic::ReadIcr() & kIcrDeliveryStatusBit) != 0) {
145 ;
146 }
147 } else {
148 // 广播到除自己外的所有 CPU(目标简写模式)
149 // ICR_HIGH 设为 0(不使用具体目标 ID)
150 etl::io_port_wo<uint32_t> icr_high_reg{
151 reinterpret_cast<void*>(apic_base_ + kXApicIcrHighOffset)};
152 icr_high_reg.write(0);
153
154 // ICR_LOW:向量 + 目标简写模式(位 18-19 = 11)
155 auto icr_low = static_cast<uint32_t>(vector) | kIcrBroadcastMode;
156 etl::io_port_wo<uint32_t> icr_low_wo{
157 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
158 icr_low_wo.write(icr_low);
159
160 {
161 etl::io_port_ro<uint32_t> icr_low_ro{
162 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
163 while ((icr_low_ro.read() & kIcrDeliveryStatusBit) != 0) {
164 ;
165 }
166 }
167 }
168 return {};
169}
static constexpr uint32_t kIcrBroadcastMode
ICR 广播模式位
Definition local_apic.h:204
uint64_t apic_base_
APIC 基地址(仅用于 xAPIC 模式)
Definition local_apic.h:253
static constexpr uint32_t kXApicIcrLowOffset
ICR 低位寄存器偏移
Definition local_apic.h:166
bool is_x2apic_mode_
当前 APIC 模式(true = x2APIC, false = xAPIC)
Definition local_apic.h:250
static constexpr uint32_t kIcrDeliveryStatusBit
ICR 传递状态位
Definition local_apic.h:200
static constexpr uint32_t kXApicIcrHighOffset
ICR 高位寄存器偏移
Definition local_apic.h:168

◆ CheckX2ApicSupport()

auto LocalApic::CheckX2ApicSupport ( ) const -> bool
private

检查 CPU 是否支持 x2APIC

Returns
true 支持 x2APIC
false 不支持 x2APIC

Definition at line 462 of file local_apic.cpp.

462 {
463 return cpu_io::cpuid::HasX2Apic();
464}
Here is the caller graph for this function:

◆ ConfigureLvtEntries()

auto LocalApic::ConfigureLvtEntries ( ) const -> void

配置 Local Vector Table 条目

Definition at line 364 of file local_apic.cpp.

364 {
365 if (is_x2apic_mode_) {
366 // 配置 LINT0 (通常连接到 8259 PIC 的 INTR)
367 cpu_io::msr::apic::WriteLvtLint0(kExtIntMode);
368
369 // 配置 LINT1 (通常连接到 NMI)
370 cpu_io::msr::apic::WriteLvtLint1(kNmiMode);
371
372 // 配置错误中断
373 cpu_io::msr::apic::WriteLvtError(kErrorVector);
374 } else {
375 // 配置 LINT0 (偏移 0x350)
376 etl::io_port_wo<uint32_t> lint0_reg{
377 reinterpret_cast<void*>(apic_base_ + kXApicLvtLint0Offset)};
378 lint0_reg.write(kExtIntMode);
379
380 // 配置 LINT1 (偏移 0x360)
381 etl::io_port_wo<uint32_t> lint1_reg{
382 reinterpret_cast<void*>(apic_base_ + kXApicLvtLint1Offset)};
383 lint1_reg.write(kNmiMode);
384
385 // 配置错误中断 (偏移 0x370)
386 etl::io_port_wo<uint32_t> error_reg{
387 reinterpret_cast<void*>(apic_base_ + kXApicLvtErrorOffset)};
388 error_reg.write(kErrorVector);
389 }
390}
static constexpr uint32_t kXApicLvtLint0Offset
LVT LINT0 寄存器偏移
Definition local_apic.h:172
static constexpr uint32_t kXApicLvtLint1Offset
LVT LINT1 寄存器偏移
Definition local_apic.h:174
static constexpr uint32_t kExtIntMode
ExtINT 传递模式
Definition local_apic.h:210
static constexpr uint32_t kNmiMode
NMI 传递模式
Definition local_apic.h:212
static constexpr uint32_t kXApicLvtErrorOffset
LVT 错误寄存器偏移
Definition local_apic.h:176
static constexpr uint8_t kErrorVector
错误中断向量
Definition local_apic.h:214

◆ DisableTimer()

auto LocalApic::DisableTimer ( ) const -> void

禁用 Local APIC 定时器

Definition at line 227 of file local_apic.cpp.

227 {
228 if (is_x2apic_mode_) {
229 auto lvt_timer = cpu_io::msr::apic::ReadLvtTimer();
230 lvt_timer |= kLvtMaskBit;
231 cpu_io::msr::apic::WriteLvtTimer(lvt_timer);
232 cpu_io::msr::apic::WriteTimerInitCount(0);
233 } else {
234 etl::io_port_rw<uint32_t> lvt_timer_reg{
235 reinterpret_cast<void*>(apic_base_ + kXApicLvtTimerOffset)};
236 auto lvt_timer = lvt_timer_reg.read();
237 lvt_timer |= kLvtMaskBit;
238 lvt_timer_reg.write(lvt_timer);
239 etl::io_port_wo<uint32_t> init_count_reg{
240 reinterpret_cast<void*>(apic_base_ + kXApicTimerInitCountOffset)};
241 init_count_reg.write(0);
242 }
243}
static constexpr uint32_t kLvtMaskBit
LVT 掩码位
Definition local_apic.h:196
static constexpr uint32_t kXApicTimerInitCountOffset
定时器初始计数寄存器偏移
Definition local_apic.h:178
static constexpr uint32_t kXApicLvtTimerOffset
LVT 定时器寄存器偏移
Definition local_apic.h:170

◆ DisableX2Apic()

auto LocalApic::DisableX2Apic ( ) const -> bool
private

禁用 x2APIC 模式

Returns
true 禁用成功
false 禁用失败或x2APIC未启用

Definition at line 500 of file local_apic.cpp.

500 {
501 // 清除 IA32_APIC_BASE.x2APIC_Enable (位10) = 0
502 cpu_io::msr::apic::DisableX2Apic();
503 return !IsX2ApicEnabled();
504}
auto IsX2ApicEnabled() const -> bool
检查 x2APIC 是否启用
Here is the call graph for this function:

◆ DisableXApic()

auto LocalApic::DisableXApic ( ) const -> bool
private

禁用传统 xAPIC 模式

Returns
true 禁用成功
false 禁用失败或xAPIC未启用

Definition at line 474 of file local_apic.cpp.

474 {
475 // 清除 IA32_APIC_BASE.Global_Enable (位11) = 0
476 cpu_io::msr::apic::DisableGlobally();
477 return !IsXApicEnabled();
478}
auto IsXApicEnabled() const -> bool
检查传统 xAPIC 是否启用
Here is the call graph for this function:

◆ EnableTimer()

auto LocalApic::EnableTimer ( uint32_t  initial_count,
uint32_t  divide_value,
uint8_t  vector,
bool  periodic = true 
) const -> void

启用 Local APIC 定时器

Parameters
initial_count初始计数值
divide_value分频值
vector定时器中断向量
periodic是否为周期性定时器

Definition at line 192 of file local_apic.cpp.

193 {
194 if (is_x2apic_mode_) {
195 cpu_io::msr::apic::WriteTimerDivide(divide_value);
196
197 auto lvt_timer = static_cast<uint32_t>(vector);
198 if (periodic) {
199 lvt_timer |= kLvtPeriodicMode;
200 }
201
202 cpu_io::msr::apic::WriteLvtTimer(lvt_timer);
203 cpu_io::msr::apic::WriteTimerInitCount(initial_count);
204 } else {
205 // 设置分频器(偏移 0x3E0)
206 etl::io_port_wo<uint32_t> divide_reg{
207 reinterpret_cast<void*>(apic_base_ + kXApicTimerDivideOffset)};
208 divide_reg.write(divide_value);
209
210 // 设置 LVT 定时器寄存器(偏移 0x320)
211 auto lvt_timer = static_cast<uint32_t>(vector);
212 if (periodic) {
213 lvt_timer |= kLvtPeriodicMode;
214 }
215
216 etl::io_port_wo<uint32_t> lvt_timer_reg{
217 reinterpret_cast<void*>(apic_base_ + kXApicLvtTimerOffset)};
218 lvt_timer_reg.write(lvt_timer);
219
220 // 设置初始计数值(偏移 0x380)
221 etl::io_port_wo<uint32_t> init_count_reg{
222 reinterpret_cast<void*>(apic_base_ + kXApicTimerInitCountOffset)};
223 init_count_reg.write(initial_count);
224 }
225}
static constexpr uint32_t kXApicTimerDivideOffset
定时器分频寄存器偏移
Definition local_apic.h:182
static constexpr uint32_t kLvtPeriodicMode
LVT 周期模式位
Definition local_apic.h:198

◆ EnableX2Apic()

auto LocalApic::EnableX2Apic ( ) const -> bool
private

启用 x2APIC 模式

Returns
true 启用成功
false 启用失败

Definition at line 486 of file local_apic.cpp.

486 {
487 // 检查 CPU 是否支持 x2APIC
488 if (!CheckX2ApicSupport()) {
489 return false;
490 }
491
492 // 设置 IA32_APIC_BASE.x2APIC_Enable (位10) = 1
493 // 同时确保 IA32_APIC_BASE.Global_Enable (位11) = 1
494 cpu_io::msr::apic::EnableX2Apic();
495
496 // 验证 x2APIC 是否成功启用
497 return IsX2ApicEnabled();
498}
auto CheckX2ApicSupport() const -> bool
检查 CPU 是否支持 x2APIC
Here is the call graph for this function:

◆ EnableXApic()

auto LocalApic::EnableXApic ( ) const -> bool
private

启用传统 xAPIC 模式

Returns
true 启用成功
false 启用失败

Definition at line 466 of file local_apic.cpp.

466 {
467 // 设置 IA32_APIC_BASE.Global_Enable (位11) = 1
468 cpu_io::msr::apic::EnableGlobally();
469 // 清除 IA32_APIC_BASE.x2APIC_Enable (位10) = 0
470 cpu_io::msr::apic::DisableX2Apic();
471 return IsXApicEnabled();
472}
Here is the call graph for this function:

◆ GetApicVersion()

auto LocalApic::GetApicVersion ( ) const -> uint32_t

获取 APIC 版本信息

Returns
uint32_t APIC 版本

Definition at line 77 of file local_apic.cpp.

77 {
78 if (is_x2apic_mode_) {
79 return cpu_io::msr::apic::ReadVersion();
80 } else {
81 // 版本寄存器在偏移 0x30 处
82 etl::io_port_ro<uint32_t> ver_reg{
83 reinterpret_cast<void*>(apic_base_ + kXApicVersionOffset)};
84 return ver_reg.read();
85 }
86}
static constexpr uint32_t kXApicVersionOffset
版本寄存器偏移
Definition local_apic.h:156
Here is the caller graph for this function:

◆ GetTaskPriority()

auto LocalApic::GetTaskPriority ( ) const -> uint8_t

获取任务优先级

Returns
uint8_t 当前任务优先级

Definition at line 181 of file local_apic.cpp.

181 {
182 if (is_x2apic_mode_) {
183 return static_cast<uint8_t>(cpu_io::msr::apic::ReadTpr() & kApicIdMask);
184 } else {
185 etl::io_port_ro<uint32_t> tpr_reg{
186 reinterpret_cast<void*>(apic_base_ + kXApicTprOffset)};
187 auto tpr = tpr_reg.read();
188 return static_cast<uint8_t>(tpr & kApicIdMask);
189 }
190}
static constexpr uint32_t kXApicTprOffset
任务优先级寄存器偏移
Definition local_apic.h:158
static constexpr uint32_t kApicIdMask
xAPIC ID 掩码
Definition local_apic.h:190
Here is the caller graph for this function:

◆ GetTimerCurrentCount()

auto LocalApic::GetTimerCurrentCount ( ) const -> uint32_t

获取定时器当前计数值

Returns
uint32_t 当前计数值

Definition at line 245 of file local_apic.cpp.

245 {
246 if (is_x2apic_mode_) {
247 return cpu_io::msr::apic::ReadTimerCurrCount();
248 } else {
249 // 当前计数寄存器在偏移 0x390 处
250 etl::io_port_ro<uint32_t> curr_count_reg{
251 reinterpret_cast<void*>(apic_base_ + kXApicTimerCurrCountOffset)};
252 return curr_count_reg.read();
253 }
254}
static constexpr uint32_t kXApicTimerCurrCountOffset
定时器当前计数寄存器偏移
Definition local_apic.h:180
Here is the caller graph for this function:

◆ Init()

auto LocalApic::Init ( ) -> Expected<void>

初始化 Local APIC

Returns
Expected<void> 初始化成功返回空值,失败返回错误

Definition at line 10 of file local_apic.cpp.

10 {
11 // 检查 APIC 是否全局启用
12 if (!cpu_io::msr::apic::IsGloballyEnabled()) {
13 cpu_io::msr::apic::EnableGlobally();
14 }
15
16 // 首先尝试启用 x2APIC 模式
17 if (EnableX2Apic()) {
18 is_x2apic_mode_ = true;
19 } else {
20 if (!EnableXApic()) {
21 klog::Err("Failed to enable APIC in any mode");
22 return std::unexpected(Error(ErrorCode::kApicInitFailed));
23 }
24 is_x2apic_mode_ = false;
25 }
26
27 // 启用 Local APIC(通过设置 SIVR)
28 uint32_t sivr;
29 if (is_x2apic_mode_) {
30 sivr = cpu_io::msr::apic::ReadSivr();
31 } else {
32 etl::io_port_ro<uint32_t> sivr_reg{
33 reinterpret_cast<void*>(apic_base_ + kXApicSivrOffset)};
34 sivr = sivr_reg.read();
35 }
36
37 // 设置 APIC Software Enable 位
39 // 设置虚假中断向量为 0xFF
40 sivr |= kSpuriousVector;
41
42 if (is_x2apic_mode_) {
43 cpu_io::msr::apic::WriteSivr(sivr);
44 } else {
45 etl::io_port_wo<uint32_t> sivr_reg{
46 reinterpret_cast<void*>(apic_base_ + kXApicSivrOffset)};
47 sivr_reg.write(sivr);
48 }
49
50 // 清除任务优先级
52
53 // 禁用所有 LVT 条目(设置 mask 位)
54 if (is_x2apic_mode_) {
55 cpu_io::msr::apic::WriteLvtTimer(kLvtMaskBit);
56 cpu_io::msr::apic::WriteLvtLint0(kLvtMaskBit);
57 cpu_io::msr::apic::WriteLvtLint1(kLvtMaskBit);
58 cpu_io::msr::apic::WriteLvtError(kLvtMaskBit);
59 } else {
60 // xAPIC 模式下通过内存映射写入
61 etl::io_port_wo<uint32_t> lvt_timer{
62 reinterpret_cast<void*>(apic_base_ + kXApicLvtTimerOffset)};
63 lvt_timer.write(kLvtMaskBit);
64 etl::io_port_wo<uint32_t> lvt_lint0{
65 reinterpret_cast<void*>(apic_base_ + kXApicLvtLint0Offset)};
66 lvt_lint0.write(kLvtMaskBit);
67 etl::io_port_wo<uint32_t> lvt_lint1{
68 reinterpret_cast<void*>(apic_base_ + kXApicLvtLint1Offset)};
69 lvt_lint1.write(kLvtMaskBit);
70 etl::io_port_wo<uint32_t> lvt_error{
71 reinterpret_cast<void*>(apic_base_ + kXApicLvtErrorOffset)};
72 lvt_error.write(kLvtMaskBit);
73 }
74 return {};
75}
auto EnableXApic() const -> bool
启用传统 xAPIC 模式
static constexpr uint32_t kApicSoftwareEnableBit
APIC 软件启用位
Definition local_apic.h:192
static constexpr uint32_t kXApicSivrOffset
虚假中断向量寄存器偏移
Definition local_apic.h:162
static constexpr uint32_t kSpuriousVector
虚假中断向量
Definition local_apic.h:194
auto EnableX2Apic() const -> bool
启用 x2APIC 模式
auto SetTaskPriority(uint8_t priority) const -> void
设置任务优先级
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
错误类型,用于 std::expected
Definition expected.hpp:343
Here is the call graph for this function:

◆ IsX2ApicEnabled()

auto LocalApic::IsX2ApicEnabled ( ) const -> bool
private

检查 x2APIC 是否启用

Returns
true x2APIC 已启用
false x2APIC 未启用

Definition at line 506 of file local_apic.cpp.

506 {
507 return cpu_io::msr::apic::IsX2ApicEnabled();
508}
Here is the caller graph for this function:

◆ IsXApicEnabled()

auto LocalApic::IsXApicEnabled ( ) const -> bool
private

检查传统 xAPIC 是否启用

Returns
true xAPIC 已启用
false xAPIC 未启用

Definition at line 480 of file local_apic.cpp.

480 {
481 // Global_Enable = 1 && x2APIC_Enable = 0
482 return cpu_io::msr::apic::IsGloballyEnabled() &&
483 !cpu_io::msr::apic::IsX2ApicEnabled();
484}
Here is the caller graph for this function:

◆ operator=() [1/2]

auto LocalApic::operator= ( const LocalApic ) -> LocalApic &=delete
delete

◆ operator=() [2/2]

auto LocalApic::operator= ( LocalApic &&  ) -> LocalApic &=default
default

◆ PrintInfo()

auto LocalApic::PrintInfo ( ) const -> void

打印 Local APIC 信息(调试用)

Definition at line 407 of file local_apic.cpp.

407 {
408 klog::Info("APIC Version: {:#x}", GetApicVersion());
409 klog::Info("Mode: {}", is_x2apic_mode_ ? "x2APIC" : "xAPIC");
410 klog::Info("x2APIC Enabled: {}", IsX2ApicEnabled() ? "Yes" : "No");
411 klog::Info("Task Priority: {:#x}", GetTaskPriority());
412 klog::Info("Timer Current Count: {}", GetTimerCurrentCount());
413
414 // 读取各种寄存器状态
415 if (is_x2apic_mode_) {
416 uint32_t sivr = cpu_io::msr::apic::ReadSivr();
417 klog::Info("SIVR: {:#x} (APIC {})", sivr,
418 (sivr & kApicSoftwareEnableBit) ? "Enabled" : "Disabled");
419
420 uint32_t lvt_timer = cpu_io::msr::apic::ReadLvtTimer();
421 klog::Info("LVT Timer: {:#x}", lvt_timer);
422
423 uint32_t lvt_lint0 = cpu_io::msr::apic::ReadLvtLint0();
424 klog::Info("LVT LINT0: {:#x}", lvt_lint0);
425
426 uint32_t lvt_lint1 = cpu_io::msr::apic::ReadLvtLint1();
427 klog::Info("LVT LINT1: {:#x}", lvt_lint1);
428
429 uint32_t lvt_error = cpu_io::msr::apic::ReadLvtError();
430 klog::Info("LVT Error: {:#x}", lvt_error);
431 } else {
432 etl::io_port_ro<uint32_t> sivr_reg{
433 reinterpret_cast<void*>(apic_base_ + kXApicSivrOffset)};
434 uint32_t sivr = sivr_reg.read();
435 klog::Info("SIVR: {:#x} (APIC {})", sivr,
436 (sivr & kApicSoftwareEnableBit) ? "Enabled" : "Disabled");
437
438 etl::io_port_ro<uint32_t> lvt_timer_reg{
439 reinterpret_cast<void*>(apic_base_ + kXApicLvtTimerOffset)};
440 uint32_t lvt_timer = lvt_timer_reg.read();
441 klog::Info("LVT Timer: {:#x}", lvt_timer);
442
443 etl::io_port_ro<uint32_t> lvt_lint0_reg{
444 reinterpret_cast<void*>(apic_base_ + kXApicLvtLint0Offset)};
445 uint32_t lvt_lint0 = lvt_lint0_reg.read();
446 klog::Info("LVT LINT0: {:#x}", lvt_lint0);
447
448 etl::io_port_ro<uint32_t> lvt_lint1_reg{
449 reinterpret_cast<void*>(apic_base_ + kXApicLvtLint1Offset)};
450 uint32_t lvt_lint1 = lvt_lint1_reg.read();
451 klog::Info("LVT LINT1: {:#x}", lvt_lint1);
452
453 etl::io_port_ro<uint32_t> lvt_error_reg{
454 reinterpret_cast<void*>(apic_base_ + kXApicLvtErrorOffset)};
455 uint32_t lvt_error = lvt_error_reg.read();
456 klog::Info("LVT Error: {:#x}", lvt_error);
457
458 klog::Info("APIC Base Address: {:#x}", apic_base_);
459 }
460}
auto GetApicVersion() const -> uint32_t
获取 APIC 版本信息
auto GetTaskPriority() const -> uint8_t
获取任务优先级
auto GetTimerCurrentCount() const -> uint32_t
获取定时器当前计数值
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReadErrorStatus()

auto LocalApic::ReadErrorStatus ( ) const -> uint32_t

读取错误状态

Returns
uint32_t 错误状态寄存器值

Definition at line 392 of file local_apic.cpp.

392 {
393 if (is_x2apic_mode_) {
394 // x2APIC 模式下没有直接的 ESR 访问方式
395 // 这里返回 0 表示没有错误
396 return 0;
397 } else {
398 // 取 ESR (Error Status Register, 偏移 0x280)
399 // 读取 ESR 之前需要先写入 0
400 etl::io_port_rw<uint32_t> esr_reg{
401 reinterpret_cast<void*>(apic_base_ + kXApicEsrOffset)};
402 esr_reg.write(0);
403 return esr_reg.read();
404 }
405}
static constexpr uint32_t kXApicEsrOffset
错误状态寄存器偏移
Definition local_apic.h:164

◆ SendEoi()

auto LocalApic::SendEoi ( ) const -> void

发送中断结束信号 (EOI)

Definition at line 88 of file local_apic.cpp.

88 {
89 if (is_x2apic_mode_) {
90 cpu_io::msr::apic::WriteEoi(0);
91 } else {
92 // 写入 EOI 寄存器(偏移 0xB0)
93 etl::io_port_wo<uint32_t> eoi_reg{
94 reinterpret_cast<void*>(apic_base_ + kXApicEoiOffset)};
95 eoi_reg.write(0);
96 }
97}
static constexpr uint32_t kXApicEoiOffset
EOI 寄存器偏移
Definition local_apic.h:160
Here is the caller graph for this function:

◆ SendInitIpi()

auto LocalApic::SendInitIpi ( uint32_t  destination_apic_id) const -> void

发送 INIT IPI

Parameters
destination_apic_id目标 APIC ID

Definition at line 294 of file local_apic.cpp.

294 {
295 if (is_x2apic_mode_) {
296 auto icr = kInitIpiMode;
297 icr |= static_cast<uint64_t>(destination_apic_id) << 32;
298
299 cpu_io::msr::apic::WriteIcr(icr);
300
301 while ((cpu_io::msr::apic::ReadIcr() & kIcrDeliveryStatusBit) != 0) {
302 ;
303 }
304 } else {
305 // 设置目标 APIC ID(ICR_HIGH)
306 auto icr_high = (destination_apic_id & kApicIdMask) << kIcrDestShift;
307 etl::io_port_wo<uint32_t> icr_high_reg{
308 reinterpret_cast<void*>(apic_base_ + kXApicIcrHighOffset)};
309 icr_high_reg.write(icr_high);
310
311 // 发送 INIT IPI(ICR_LOW)
312 auto icr_low = kInitIpiMode;
313 etl::io_port_wo<uint32_t> icr_low_wo{
314 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
315 icr_low_wo.write(icr_low);
316
317 {
318 etl::io_port_ro<uint32_t> icr_low_ro{
319 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
320 while ((icr_low_ro.read() & kIcrDeliveryStatusBit) != 0) {
321 ;
322 }
323 }
324 }
325
326 klog::Info("INIT IPI sent to APIC ID {:#x}", destination_apic_id);
327}
static constexpr uint32_t kIcrDestShift
ICR 目标位移
Definition local_apic.h:202
static constexpr uint32_t kInitIpiMode
INIT IPI 模式
Definition local_apic.h:206
Here is the call graph for this function:

◆ SendIpi()

auto LocalApic::SendIpi ( uint32_t  destination_apic_id,
uint8_t  vector 
) const -> Expected<void>

发送处理器间中断 (IPI)

Parameters
destination_apic_id目标 APIC ID
vector中断向量
Returns
Expected<void> 发送成功返回空值,失败返回错误

Definition at line 99 of file local_apic.cpp.

100 {
101 if (is_x2apic_mode_) {
102 auto icr = static_cast<uint64_t>(vector);
103 icr |= static_cast<uint64_t>(destination_apic_id) << 32;
104
105 cpu_io::msr::apic::WriteIcr(icr);
106
107 while ((cpu_io::msr::apic::ReadIcr() & kIcrDeliveryStatusBit) != 0) {
108 ;
109 }
110 } else {
111 // ICR 分为两个 32 位寄存器:ICR_LOW (0x300) 和 ICR_HIGH (0x310)
112
113 // 设置目标 APIC ID(ICR_HIGH 的位 24-31)
114 auto icr_high = (destination_apic_id & kApicIdMask) << kIcrDestShift;
115 etl::io_port_wo<uint32_t> icr_high_reg{
116 reinterpret_cast<void*>(apic_base_ + kXApicIcrHighOffset)};
117 icr_high_reg.write(icr_high);
118
119 // 设置向量和传递模式(ICR_LOW)
120 auto icr_low = static_cast<uint32_t>(vector);
121 etl::io_port_wo<uint32_t> icr_low_wo{
122 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
123 icr_low_wo.write(icr_low);
124
125 {
126 etl::io_port_ro<uint32_t> icr_low_ro{
127 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
128 while ((icr_low_ro.read() & kIcrDeliveryStatusBit) != 0) {
129 ;
130 }
131 }
132 }
133 return {};
134}

◆ SendStartupIpi()

auto LocalApic::SendStartupIpi ( uint32_t  destination_apic_id,
uint8_t  start_page 
) const -> void

发送 SIPI (Startup IPI)

Parameters
destination_apic_id目标 APIC ID
start_page启动页面地址(4KB 页面)

Definition at line 329 of file local_apic.cpp.

330 {
331 if (is_x2apic_mode_) {
332 // SIPI with start page (delivery mode = 110b)
333 auto icr = kSipiMode | start_page;
334 icr |= static_cast<uint64_t>(destination_apic_id) << 32;
335
336 cpu_io::msr::apic::WriteIcr(icr);
337
338 while ((cpu_io::msr::apic::ReadIcr() & kIcrDeliveryStatusBit) != 0) {
339 ;
340 }
341 } else {
342 // 设置目标 APIC ID(ICR_HIGH)
343 uint32_t icr_high = (destination_apic_id & kApicIdMask) << kIcrDestShift;
344 etl::io_port_wo<uint32_t> icr_high_reg{
345 reinterpret_cast<void*>(apic_base_ + kXApicIcrHighOffset)};
346 icr_high_reg.write(icr_high);
347
348 // 发送 SIPI(ICR_LOW)
349 uint32_t icr_low = kSipiMode | start_page;
350 etl::io_port_wo<uint32_t> icr_low_wo{
351 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
352 icr_low_wo.write(icr_low);
353
354 {
355 etl::io_port_ro<uint32_t> icr_low_ro{
356 reinterpret_cast<void*>(apic_base_ + kXApicIcrLowOffset)};
357 while ((icr_low_ro.read() & kIcrDeliveryStatusBit) != 0) {
358 ;
359 }
360 }
361 }
362}
static constexpr uint32_t kSipiMode
SIPI 模式
Definition local_apic.h:208

◆ SetTaskPriority()

auto LocalApic::SetTaskPriority ( uint8_t  priority) const -> void

设置任务优先级

Parameters
priority优先级值

Definition at line 171 of file local_apic.cpp.

171 {
172 if (is_x2apic_mode_) {
173 cpu_io::msr::apic::WriteTpr(static_cast<uint32_t>(priority));
174 } else {
175 etl::io_port_wo<uint32_t> tpr_reg{
176 reinterpret_cast<void*>(apic_base_ + kXApicTprOffset)};
177 tpr_reg.write(static_cast<uint32_t>(priority));
178 }
179}

◆ SetupOneShotTimer()

auto LocalApic::SetupOneShotTimer ( uint32_t  microseconds,
uint8_t  vector 
) const -> void

设置单次定时器

Parameters
microseconds延时时间(微秒)
vector定时器中断向量

Definition at line 275 of file local_apic.cpp.

276 {
277 // 假设 APIC 时钟频率为 100MHz
278
279 // 计算初始计数值(微秒转换为时钟周期)
280 auto initial_count =
282
283 // 选择合适的分频值
284 auto divide_value = kTimerDivideBy1;
285 if (initial_count > 0xFFFFFFFF) {
286 divide_value = kTimerDivideBy16;
287 initial_count =
288 ((kDefaultApicClockHz / 16) / kMicrosecondsPerSecond) * microseconds;
289 }
290
291 EnableTimer(initial_count, divide_value, vector, false);
292}
static constexpr uint32_t kTimerDivideBy1
定时器分频 1
Definition local_apic.h:222
static constexpr uint32_t kMicrosecondsPerSecond
每秒微秒数
Definition local_apic.h:232
auto EnableTimer(uint32_t initial_count, uint32_t divide_value, uint8_t vector, bool periodic=true) const -> void
启用 Local APIC 定时器
static constexpr uint32_t kTimerDivideBy16
定时器分频 16
Definition local_apic.h:224
static constexpr uint32_t kDefaultApicClockHz
Definition local_apic.h:220

◆ SetupPeriodicTimer()

auto LocalApic::SetupPeriodicTimer ( uint32_t  frequency_hz,
uint8_t  vector 
) const -> void

设置周期性定时器

Parameters
frequency_hz定时器频率(Hz)
vector定时器中断向量

Definition at line 256 of file local_apic.cpp.

257 {
258 // 使用 APIC 定时器的典型配置
259 // 假设 APIC 时钟频率为 100MHz(实际应从 CPU 频率计算)
260
261 // 计算初始计数值
262 auto initial_count = kDefaultApicClockHz / frequency_hz;
263
264 // 选择合适的分频值以获得更好的精度
265 auto divide_value = kTimerDivideBy1;
266 if (initial_count > 0xFFFFFFFF) {
267 // 如果计数值太大,使用分频
268 divide_value = kTimerDivideBy16;
269 initial_count = (kDefaultApicClockHz / 16) / frequency_hz;
270 }
271
272 EnableTimer(initial_count, divide_value, vector, true);
273}

◆ WakeupAp()

auto LocalApic::WakeupAp ( uint32_t  destination_apic_id,
uint8_t  start_vector 
) const -> void

唤醒应用处理器 (AP)

Parameters
destination_apic_id目标 APIC ID
start_vector启动向量(启动代码的物理地址 / 4096)
Returns
true 唤醒成功
Note
执行标准的 INIT-SIPI-SIPI 序列来唤醒 AP

Definition at line 510 of file local_apic.cpp.

511 {
512 // 发送 INIT IPI
513 SendInitIpi(destination_apic_id);
514
515 // 等待 10ms (INIT IPI 后的标准等待时间)
516 auto delay = 10 * kCalibrationDelayLoop;
517 while (delay--) {
518 __asm__ volatile("nop");
519 }
520
521 // 发送第一个 SIPI
522 SendStartupIpi(destination_apic_id, start_vector);
523
524 // 等待 200μs (SIPI 后的标准等待时间)
525 delay = 200 * (kCalibrationDelayLoop / 1000);
526 while (delay--) {
527 __asm__ volatile("nop");
528 }
529
530 // 发送第二个 SIPI (为了可靠性)
531 SendStartupIpi(destination_apic_id, start_vector);
532
533 // 等待 200μs
534 delay = 200 * (kCalibrationDelayLoop / 1000);
535 while (delay--) {
536 __asm__ volatile("nop");
537 }
538}
static constexpr uint32_t kCalibrationDelayLoop
校准延时循环次数
Definition local_apic.h:228
auto SendStartupIpi(uint32_t destination_apic_id, uint8_t start_page) const -> void
发送 SIPI (Startup IPI)
auto SendInitIpi(uint32_t destination_apic_id) const -> void
发送 INIT IPI

Member Data Documentation

◆ apic_base_

uint64_t LocalApic::apic_base_ {kDefaultApicBase}
private

APIC 基地址(仅用于 xAPIC 模式)

Definition at line 253 of file local_apic.h.

static constexpr uint64_t kDefaultApicBase
Definition local_apic.h:238

◆ is_x2apic_mode_

bool LocalApic::is_x2apic_mode_ {false}
private

当前 APIC 模式(true = x2APIC, false = xAPIC)

Definition at line 250 of file local_apic.h.

250{false};

◆ kApicBaseControlMask

constexpr uint64_t LocalApic::kApicBaseControlMask = 0xFFF
staticconstexprprivate

APIC 基地址控制位掩码

Definition at line 246 of file local_apic.h.

◆ kApicBaseMask

constexpr uint64_t LocalApic::kApicBaseMask = 0xFFFFF000ULL
staticconstexprprivate

APIC 基地址掩码

Definition at line 240 of file local_apic.h.

◆ kApicGlobalEnableBit

constexpr uint64_t LocalApic::kApicGlobalEnableBit = 1ULL << 11
staticconstexprprivate

APIC 全局启用位

Definition at line 242 of file local_apic.h.

◆ kApicIdMask

constexpr uint32_t LocalApic::kApicIdMask = 0xFF
staticconstexprprivate

xAPIC ID 掩码

Definition at line 190 of file local_apic.h.

◆ kApicIdShift

constexpr uint32_t LocalApic::kApicIdShift = 24
staticconstexprprivate

Definition at line 188 of file local_apic.h.

◆ kApicSoftwareEnableBit

constexpr uint32_t LocalApic::kApicSoftwareEnableBit = 0x100
staticconstexprprivate

APIC 软件启用位

Definition at line 192 of file local_apic.h.

◆ kCalibrationCount

constexpr uint32_t LocalApic::kCalibrationCount = 0xFFFFFFFF
staticconstexprprivate

校准用的计数值

Definition at line 226 of file local_apic.h.

◆ kCalibrationDelayLoop

constexpr uint32_t LocalApic::kCalibrationDelayLoop = 1000000
staticconstexprprivate

校准延时循环次数

Definition at line 228 of file local_apic.h.

◆ kCalibrationMultiplier

constexpr uint32_t LocalApic::kCalibrationMultiplier = 100
staticconstexprprivate

校准倍数 (10ms -> 1s)

Definition at line 230 of file local_apic.h.

◆ kDefaultApicBase

constexpr uint64_t LocalApic::kDefaultApicBase = 0xFEE00000
staticconstexprprivate

Definition at line 238 of file local_apic.h.

◆ kDefaultApicClockHz

constexpr uint32_t LocalApic::kDefaultApicClockHz = 100000000
staticconstexprprivate

Definition at line 220 of file local_apic.h.

◆ kErrorVector

constexpr uint8_t LocalApic::kErrorVector = 0xEF
staticconstexprprivate

错误中断向量

Definition at line 214 of file local_apic.h.

◆ kExtIntMode

constexpr uint32_t LocalApic::kExtIntMode = 0x700
staticconstexprprivate

ExtINT 传递模式

Definition at line 210 of file local_apic.h.

◆ kIcrBroadcastMode

constexpr uint32_t LocalApic::kIcrBroadcastMode = 0xC0000
staticconstexprprivate

ICR 广播模式位

Definition at line 204 of file local_apic.h.

◆ kIcrDeliveryStatusBit

constexpr uint32_t LocalApic::kIcrDeliveryStatusBit = 0x1000
staticconstexprprivate

ICR 传递状态位

Definition at line 200 of file local_apic.h.

◆ kIcrDestShift

constexpr uint32_t LocalApic::kIcrDestShift = 24
staticconstexprprivate

ICR 目标位移

Definition at line 202 of file local_apic.h.

◆ kInitIpiMode

constexpr uint32_t LocalApic::kInitIpiMode = 0x500
staticconstexprprivate

INIT IPI 模式

Definition at line 206 of file local_apic.h.

◆ kLvtMaskBit

constexpr uint32_t LocalApic::kLvtMaskBit = 0x10000
staticconstexprprivate

LVT 掩码位

Definition at line 196 of file local_apic.h.

◆ kLvtPeriodicMode

constexpr uint32_t LocalApic::kLvtPeriodicMode = 0x20000
staticconstexprprivate

LVT 周期模式位

Definition at line 198 of file local_apic.h.

◆ kMicrosecondsPerSecond

constexpr uint32_t LocalApic::kMicrosecondsPerSecond = 1000000
staticconstexprprivate

每秒微秒数

Definition at line 232 of file local_apic.h.

◆ kNmiMode

constexpr uint32_t LocalApic::kNmiMode = 0x400
staticconstexprprivate

NMI 传递模式

Definition at line 212 of file local_apic.h.

◆ kSipiMode

constexpr uint32_t LocalApic::kSipiMode = 0x600
staticconstexprprivate

SIPI 模式

Definition at line 208 of file local_apic.h.

◆ kSpuriousVector

constexpr uint32_t LocalApic::kSpuriousVector = 0xFF
staticconstexprprivate

虚假中断向量

Definition at line 194 of file local_apic.h.

◆ kTimerDivideBy1

constexpr uint32_t LocalApic::kTimerDivideBy1 = 0x0B
staticconstexprprivate

定时器分频 1

Definition at line 222 of file local_apic.h.

◆ kTimerDivideBy16

constexpr uint32_t LocalApic::kTimerDivideBy16 = 0x03
staticconstexprprivate

定时器分频 16

Definition at line 224 of file local_apic.h.

◆ kX2ApicEnableBit

constexpr uint64_t LocalApic::kX2ApicEnableBit = 1ULL << 10
staticconstexprprivate

x2APIC 启用位

Definition at line 244 of file local_apic.h.

◆ kXApicEoiOffset

constexpr uint32_t LocalApic::kXApicEoiOffset = 0xB0
staticconstexprprivate

EOI 寄存器偏移

Definition at line 160 of file local_apic.h.

◆ kXApicEsrOffset

constexpr uint32_t LocalApic::kXApicEsrOffset = 0x280
staticconstexprprivate

错误状态寄存器偏移

Definition at line 164 of file local_apic.h.

◆ kXApicIcrHighOffset

constexpr uint32_t LocalApic::kXApicIcrHighOffset = 0x310
staticconstexprprivate

ICR 高位寄存器偏移

Definition at line 168 of file local_apic.h.

◆ kXApicIcrLowOffset

constexpr uint32_t LocalApic::kXApicIcrLowOffset = 0x300
staticconstexprprivate

ICR 低位寄存器偏移

Definition at line 166 of file local_apic.h.

◆ kXApicIdOffset

constexpr uint32_t LocalApic::kXApicIdOffset = 0x20
staticconstexprprivate

Definition at line 154 of file local_apic.h.

◆ kXApicLvtErrorOffset

constexpr uint32_t LocalApic::kXApicLvtErrorOffset = 0x370
staticconstexprprivate

LVT 错误寄存器偏移

Definition at line 176 of file local_apic.h.

◆ kXApicLvtLint0Offset

constexpr uint32_t LocalApic::kXApicLvtLint0Offset = 0x350
staticconstexprprivate

LVT LINT0 寄存器偏移

Definition at line 172 of file local_apic.h.

◆ kXApicLvtLint1Offset

constexpr uint32_t LocalApic::kXApicLvtLint1Offset = 0x360
staticconstexprprivate

LVT LINT1 寄存器偏移

Definition at line 174 of file local_apic.h.

◆ kXApicLvtTimerOffset

constexpr uint32_t LocalApic::kXApicLvtTimerOffset = 0x320
staticconstexprprivate

LVT 定时器寄存器偏移

Definition at line 170 of file local_apic.h.

◆ kXApicSivrOffset

constexpr uint32_t LocalApic::kXApicSivrOffset = 0xF0
staticconstexprprivate

虚假中断向量寄存器偏移

Definition at line 162 of file local_apic.h.

◆ kXApicTimerCurrCountOffset

constexpr uint32_t LocalApic::kXApicTimerCurrCountOffset = 0x390
staticconstexprprivate

定时器当前计数寄存器偏移

Definition at line 180 of file local_apic.h.

◆ kXApicTimerDivideOffset

constexpr uint32_t LocalApic::kXApicTimerDivideOffset = 0x3E0
staticconstexprprivate

定时器分频寄存器偏移

Definition at line 182 of file local_apic.h.

◆ kXApicTimerInitCountOffset

constexpr uint32_t LocalApic::kXApicTimerInitCountOffset = 0x380
staticconstexprprivate

定时器初始计数寄存器偏移

Definition at line 178 of file local_apic.h.

◆ kXApicTprOffset

constexpr uint32_t LocalApic::kXApicTprOffset = 0x80
staticconstexprprivate

任务优先级寄存器偏移

Definition at line 158 of file local_apic.h.

◆ kXApicVersionOffset

constexpr uint32_t LocalApic::kXApicVersionOffset = 0x30
staticconstexprprivate

版本寄存器偏移

Definition at line 156 of file local_apic.h.


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