|
SimpleKernel 1.17.0
|
Local APIC 驱动类 More...
#include <local_apic.h>

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 基地址控制位掩码 | |
Local APIC 驱动类
Definition at line 18 of file local_apic.h.
|
default |
|
delete |
|
default |
|
default |
| auto LocalApic::BroadcastIpi | ( | uint8_t | vector | ) | const -> Expected<void> |
广播 IPI 到所有其他 CPU
| vector | 中断向量 |
Definition at line 136 of file local_apic.cpp.
|
private |
检查 CPU 是否支持 x2APIC
Definition at line 462 of file local_apic.cpp.

| auto LocalApic::ConfigureLvtEntries | ( | ) | const -> void |
配置 Local Vector Table 条目
Definition at line 364 of file local_apic.cpp.
| auto LocalApic::DisableTimer | ( | ) | const -> void |
禁用 Local APIC 定时器
Definition at line 227 of file local_apic.cpp.
|
private |
禁用 x2APIC 模式
Definition at line 500 of file local_apic.cpp.

|
private |
禁用传统 xAPIC 模式
Definition at line 474 of file local_apic.cpp.

| auto LocalApic::EnableTimer | ( | uint32_t | initial_count, |
| uint32_t | divide_value, | ||
| uint8_t | vector, | ||
| bool | periodic = true |
||
| ) | const -> void |
启用 Local APIC 定时器
| initial_count | 初始计数值 |
| divide_value | 分频值 |
| vector | 定时器中断向量 |
| periodic | 是否为周期性定时器 |
Definition at line 192 of file local_apic.cpp.
|
private |
启用 x2APIC 模式
Definition at line 486 of file local_apic.cpp.

|
private |
启用传统 xAPIC 模式
Definition at line 466 of file local_apic.cpp.

| auto LocalApic::GetApicVersion | ( | ) | const -> uint32_t |
获取 APIC 版本信息
Definition at line 77 of file local_apic.cpp.

| auto LocalApic::GetTaskPriority | ( | ) | const -> uint8_t |
获取任务优先级
Definition at line 181 of file local_apic.cpp.

| auto LocalApic::GetTimerCurrentCount | ( | ) | const -> uint32_t |
获取定时器当前计数值
Definition at line 245 of file local_apic.cpp.

| auto LocalApic::Init | ( | ) | -> Expected<void> |
初始化 Local APIC
Definition at line 10 of file local_apic.cpp.

|
private |
检查 x2APIC 是否启用
Definition at line 506 of file local_apic.cpp.

|
private |
检查传统 xAPIC 是否启用
Definition at line 480 of file local_apic.cpp.

| auto LocalApic::PrintInfo | ( | ) | const -> void |
打印 Local APIC 信息(调试用)
Definition at line 407 of file local_apic.cpp.


| auto LocalApic::ReadErrorStatus | ( | ) | const -> uint32_t |
读取错误状态
Definition at line 392 of file local_apic.cpp.
| auto LocalApic::SendEoi | ( | ) | const -> void |
发送中断结束信号 (EOI)
Definition at line 88 of file local_apic.cpp.

| auto LocalApic::SendInitIpi | ( | uint32_t | destination_apic_id | ) | const -> void |
发送 INIT IPI
| destination_apic_id | 目标 APIC ID |
Definition at line 294 of file local_apic.cpp.

| auto LocalApic::SendIpi | ( | uint32_t | destination_apic_id, |
| uint8_t | vector | ||
| ) | const -> Expected<void> |
发送处理器间中断 (IPI)
| destination_apic_id | 目标 APIC ID |
| vector | 中断向量 |
Definition at line 99 of file local_apic.cpp.
| auto LocalApic::SendStartupIpi | ( | uint32_t | destination_apic_id, |
| uint8_t | start_page | ||
| ) | const -> void |
发送 SIPI (Startup IPI)
| destination_apic_id | 目标 APIC ID |
| start_page | 启动页面地址(4KB 页面) |
Definition at line 329 of file local_apic.cpp.
| auto LocalApic::SetTaskPriority | ( | uint8_t | priority | ) | const -> void |
设置任务优先级
| priority | 优先级值 |
Definition at line 171 of file local_apic.cpp.
| auto LocalApic::SetupOneShotTimer | ( | uint32_t | microseconds, |
| uint8_t | vector | ||
| ) | const -> void |
设置单次定时器
| microseconds | 延时时间(微秒) |
| vector | 定时器中断向量 |
Definition at line 275 of file local_apic.cpp.
| auto LocalApic::SetupPeriodicTimer | ( | uint32_t | frequency_hz, |
| uint8_t | vector | ||
| ) | const -> void |
设置周期性定时器
| frequency_hz | 定时器频率(Hz) |
| vector | 定时器中断向量 |
Definition at line 256 of file local_apic.cpp.
| auto LocalApic::WakeupAp | ( | uint32_t | destination_apic_id, |
| uint8_t | start_vector | ||
| ) | const -> void |
唤醒应用处理器 (AP)
| destination_apic_id | 目标 APIC ID |
| start_vector | 启动向量(启动代码的物理地址 / 4096) |
Definition at line 510 of file local_apic.cpp.
|
private |
|
private |
|
staticconstexprprivate |
APIC 基地址控制位掩码
Definition at line 246 of file local_apic.h.
|
staticconstexprprivate |
APIC 基地址掩码
Definition at line 240 of file local_apic.h.
|
staticconstexprprivate |
APIC 全局启用位
Definition at line 242 of file local_apic.h.
|
staticconstexprprivate |
xAPIC ID 掩码
Definition at line 190 of file local_apic.h.
|
staticconstexprprivate |
Definition at line 188 of file local_apic.h.
|
staticconstexprprivate |
APIC 软件启用位
Definition at line 192 of file local_apic.h.
|
staticconstexprprivate |
校准用的计数值
Definition at line 226 of file local_apic.h.
|
staticconstexprprivate |
校准延时循环次数
Definition at line 228 of file local_apic.h.
|
staticconstexprprivate |
校准倍数 (10ms -> 1s)
Definition at line 230 of file local_apic.h.
|
staticconstexprprivate |
Definition at line 238 of file local_apic.h.
|
staticconstexprprivate |
Definition at line 220 of file local_apic.h.
|
staticconstexprprivate |
错误中断向量
Definition at line 214 of file local_apic.h.
|
staticconstexprprivate |
ExtINT 传递模式
Definition at line 210 of file local_apic.h.
|
staticconstexprprivate |
ICR 广播模式位
Definition at line 204 of file local_apic.h.
|
staticconstexprprivate |
ICR 传递状态位
Definition at line 200 of file local_apic.h.
|
staticconstexprprivate |
ICR 目标位移
Definition at line 202 of file local_apic.h.
|
staticconstexprprivate |
INIT IPI 模式
Definition at line 206 of file local_apic.h.
|
staticconstexprprivate |
LVT 掩码位
Definition at line 196 of file local_apic.h.
|
staticconstexprprivate |
LVT 周期模式位
Definition at line 198 of file local_apic.h.
|
staticconstexprprivate |
每秒微秒数
Definition at line 232 of file local_apic.h.
|
staticconstexprprivate |
NMI 传递模式
Definition at line 212 of file local_apic.h.
|
staticconstexprprivate |
SIPI 模式
Definition at line 208 of file local_apic.h.
|
staticconstexprprivate |
虚假中断向量
Definition at line 194 of file local_apic.h.
|
staticconstexprprivate |
定时器分频 1
Definition at line 222 of file local_apic.h.
|
staticconstexprprivate |
定时器分频 16
Definition at line 224 of file local_apic.h.
|
staticconstexprprivate |
x2APIC 启用位
Definition at line 244 of file local_apic.h.
|
staticconstexprprivate |
EOI 寄存器偏移
Definition at line 160 of file local_apic.h.
|
staticconstexprprivate |
错误状态寄存器偏移
Definition at line 164 of file local_apic.h.
|
staticconstexprprivate |
ICR 高位寄存器偏移
Definition at line 168 of file local_apic.h.
|
staticconstexprprivate |
ICR 低位寄存器偏移
Definition at line 166 of file local_apic.h.
|
staticconstexprprivate |
Definition at line 154 of file local_apic.h.
|
staticconstexprprivate |
LVT 错误寄存器偏移
Definition at line 176 of file local_apic.h.
|
staticconstexprprivate |
LVT LINT0 寄存器偏移
Definition at line 172 of file local_apic.h.
|
staticconstexprprivate |
LVT LINT1 寄存器偏移
Definition at line 174 of file local_apic.h.
|
staticconstexprprivate |
LVT 定时器寄存器偏移
Definition at line 170 of file local_apic.h.
|
staticconstexprprivate |
虚假中断向量寄存器偏移
Definition at line 162 of file local_apic.h.
|
staticconstexprprivate |
定时器当前计数寄存器偏移
Definition at line 180 of file local_apic.h.
|
staticconstexprprivate |
定时器分频寄存器偏移
Definition at line 182 of file local_apic.h.
|
staticconstexprprivate |
定时器初始计数寄存器偏移
Definition at line 178 of file local_apic.h.
|
staticconstexprprivate |
任务优先级寄存器偏移
Definition at line 158 of file local_apic.h.
|
staticconstexprprivate |
版本寄存器偏移
Definition at line 156 of file local_apic.h.