SimpleKernel 1.17.0
Loading...
Searching...
No Matches
arch_main.cpp File Reference
#include <cpu_io.h>
#include <array>
#include <cstdint>
#include <cstring>
#include "basic_info.hpp"
#include "interrupt.h"
#include "kernel.h"
#include "kernel_elf.hpp"
#include "kernel_log.hpp"
#include "per_cpu.hpp"
#include "sipi.h"
Include dependency graph for arch_main.cpp:

Go to the source code of this file.

Functions

auto ArchInit (int, const char **) -> void
 体系结构相关初始化
 
auto ArchInitSMP (int, const char **) -> void
 从核的体系结构相关初始化
 
auto WakeUpOtherCores () -> void
 唤醒其余 core
 
auto InitTaskContext (cpu_io::CalleeSavedContext *task_context, void(*entry)(void *), void *arg, uint64_t stack_top) -> void
 初始化内核线程的任务上下文(重载1)
 
auto InitTaskContext (cpu_io::CalleeSavedContext *task_context, cpu_io::TrapContext *trap_context_ptr, uint64_t stack_top) -> void
 初始化用户线程的任务上下文(重载2)
 

Function Documentation

◆ ArchInit()

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

体系结构相关初始化

Parameters
argc在不同体系结构有不同含义,同 _start
argv在不同体系结构有不同含义,同 _start
Precondition
引导程序已完成基本硬件初始化
Postcondition
架构相关硬件(串口、内存、设备树等)已初始化

Definition at line 105 of file arch_main.cpp.

105 {
106 BasicInfoSingleton::create(0, nullptr);
107
108 // 解析内核 elf 信息
109 KernelElfSingleton::create(BasicInfoSingleton::instance().elf_addr);
110
111 // 设置 GDT 和段寄存器
112 SetupGdtAndSegmentRegisters();
113
114 klog::Info("Hello x86_64 ArchInit");
115}
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
Here is the call graph for this function:

◆ ArchInitSMP()

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

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

Parameters
argc在不同体系结构有不同含义,同 _start
argv在不同体系结构有不同含义,同 _start
Precondition
主核已完成 ArchInit
Postcondition
从核的架构相关硬件已初始化

Definition at line 117 of file arch_main.cpp.

117 {
118 // 设置 GDT 和段寄存器
119 SetupGdtAndSegmentRegisters();
120
121 InterruptSingleton::instance().apic().InitCurrentCpuLocalApic().or_else(
122 [](Error err) -> Expected<void> {
123 klog::Err("Failed to initialize APIC for AP: {}", err.message());
124 while (true) {
126 }
127 return std::unexpected(err);
128 });
129}
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
void Pause()
Definition cpu_io.h:20
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
错误类型,用于 std::expected
Definition expected.hpp:343
constexpr auto message() const -> const char *
Definition expected.hpp:358
Here is the call graph for this function:

◆ InitTaskContext() [1/2]

auto InitTaskContext ( cpu_io::CalleeSavedContext task_context,
cpu_io::TrapContext trap_context_ptr,
uint64_t  stack_top 
) -> void

初始化用户线程的任务上下文(重载2)

Parameters
task_context指向任务上下文的指针
trap_context_ptr指向 Trap 上下文的指针
stack_top内核栈顶地址
Precondition
task_context 不为 nullptr,trap_context_ptr 已填充用户态寄存器
Postcondition
task_context 已设置为经由 trap_return 返回用户态的状态
Todo:
x86_64 实现待补充

Definition at line 156 of file arch_main.cpp.

158 {
159 // 清零上下文
160 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
161
163 (void)task_context;
164 (void)trap_context_ptr;
165 (void)stack_top;
166}

◆ InitTaskContext() [2/2]

auto InitTaskContext ( cpu_io::CalleeSavedContext task_context,
void(*)(void *)  entry,
void *  arg,
uint64_t  stack_top 
) -> void

初始化内核线程的任务上下文(重载1)

Parameters
task_context指向任务上下文的指针
entry线程入口函数
arg传递给线程的参数
stack_top内核栈顶地址
Precondition
task_context 不为 nullptr,stack_top 已按架构要求对齐
Postcondition
task_context 已设置为可被 switch_to 恢复的状态
Todo:
x86_64 实现待补充

Definition at line 143 of file arch_main.cpp.

145 {
146 // 清零上下文
147 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
148
150 (void)task_context;
151 (void)entry;
152 (void)arg;
153 (void)stack_top;
154}

◆ WakeUpOtherCores()

auto WakeUpOtherCores ( ) -> void

唤醒其余 core

Precondition
主核已完成初始化
Postcondition
所有从核开始执行 ArchInitSMP

Definition at line 131 of file arch_main.cpp.

131 {
132 // 填充 sipi_params 结构体
133 auto target_sipi_params = reinterpret_cast<SipiParams*>(sipi_params);
134 target_sipi_params->cr3 = cpu_io::Cr3::Read();
135
136 InterruptSingleton::instance().apic().StartupAllAps(
137 reinterpret_cast<uint64_t>(ap_start16),
138 reinterpret_cast<size_t>(ap_start64_end) -
139 reinterpret_cast<size_t>(ap_start16),
141}
void * ap_start16[]
Definition sipi.h:15
void * ap_start64_end[]
Definition sipi.h:16
void * sipi_params[]
Definition sipi.h:17
constexpr uint64_t kDefaultAPBase
启动 APs 的默认地址
Definition sipi.h:13
SIPI 参数结构体
Definition sipi.h:22
uint32_t cr3
Definition sipi.h:23