SimpleKernel 1.17.0
Loading...
Searching...
No Matches
interrupt_main.cpp File Reference
#include <cpu_io.h>
#include "arch.h"
#include "basic_info.hpp"
#include "interrupt.h"
#include "kernel.h"
#include "kernel_log.hpp"
#include "kstd_cstdio"
Include dependency graph for interrupt_main.cpp:

Go to the source code of this file.

Functions

auto InterruptInit (int, const char **) -> void
 体系结构相关中断初始化
 
auto InterruptInitSMP (int, const char **) -> void
 从核的体系结构相关中断初始化
 

Function Documentation

◆ InterruptInit()

auto InterruptInit ( int  argc,
const char **  argv 
) -> void

体系结构相关中断初始化

Parameters
argc在不同体系结构有不同含义,同 _start
argv在不同体系结构有不同含义,同 _start
Precondition
ArchInit 已完成
Postcondition
中断控制器已初始化,中断向量表已设置

Definition at line 82 of file interrupt_main.cpp.

82 {
83 InterruptSingleton::create();
84
85 // 初始化 APIC(从 ArchInit 移至此处)
86 InterruptSingleton::instance().InitApic(
87 BasicInfoSingleton::instance().core_count);
88 InterruptSingleton::instance().apic().InitCurrentCpuLocalApic().or_else(
89 [](Error err) -> Expected<void> {
90 klog::Err("Failed to initialize APIC: {}", err.message());
91 while (true) {
93 }
94 return std::unexpected(err);
95 });
96
97 InterruptSingleton::instance().SetUpIdtr();
98
99 // 注册 APIC Timer 中断处理函数(Local APIC 内部中断,不走 IO APIC)
100 InterruptSingleton::instance().RegisterInterruptFunc(
101 kApicTimerVector, InterruptDelegate::create<ApicTimerHandler>());
102
103 // 通过统一接口注册键盘外部中断(IRQ 1 = PS/2 键盘,先注册 handler 再启用 IO
104 // APIC)
105 static constexpr uint8_t kKeyboardIrq = 1;
106 InterruptSingleton::instance()
107 .RegisterExternalInterrupt(kKeyboardIrq, cpu_io::GetCurrentCoreId(), 0,
108 InterruptDelegate::create<KeyboardHandler>())
109 .or_else([](Error err) -> Expected<void> {
110 klog::Err("Failed to register keyboard IRQ: {}", err.message());
111 return std::unexpected(err);
112 });
113
114 // 启用 Local APIC 定时器
115 InterruptSingleton::instance().apic().SetupPeriodicTimer(
116 kApicTimerFrequencyHz, kApicTimerVector);
117 // 开启中断
118 cpu_io::Rflags::If::Set();
119
120 klog::Info("Hello InterruptInit");
121}
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
auto GetCurrentCoreId() -> size_t
Definition cpu_io.h:26
void Pause()
Definition cpu_io.h:20
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
错误类型,用于 std::expected
Definition expected.hpp:343
constexpr auto message() const -> const char *
Definition expected.hpp:358
Here is the call graph for this function:

◆ InterruptInitSMP()

auto InterruptInitSMP ( int  argc,
const char **  argv 
) -> void

从核的体系结构相关中断初始化

Parameters
argc在不同体系结构有不同含义,同 _start
argv在不同体系结构有不同含义,同 _start
Precondition
主核已完成 InterruptInit
Postcondition
从核的中断控制器已初始化

Definition at line 123 of file interrupt_main.cpp.

123 {
124 InterruptSingleton::instance().SetUpIdtr();
125
126 // 初始化当前 AP 核的 Local APIC
127 InterruptSingleton::instance().apic().InitCurrentCpuLocalApic().or_else(
128 [](Error err) -> Expected<void> {
129 klog::Err("Failed to initialize APIC for AP: {}", err.message());
130 while (true) {
132 }
133 return std::unexpected(err);
134 });
135
136 // 启用 Local APIC 定时器
137 InterruptSingleton::instance().apic().SetupPeriodicTimer(
138 kApicTimerFrequencyHz, kApicTimerVector);
139 cpu_io::Rflags::If::Set();
140 klog::Info("Hello InterruptInit SMP");
141}
Here is the call graph for this function: