SimpleKernel 1.17.0
Loading...
Searching...
No Matches
arch_main.cpp
Go to the documentation of this file.
1
5#include <cpu_io.h>
6
7#include <array>
8#include <cstdint>
9#include <cstring>
10
11#include "basic_info.hpp"
12#include "interrupt.h"
13#include "kernel.h"
14#include "kernel_elf.hpp"
15#include "kernel_log.hpp"
16#include "per_cpu.hpp"
17#include "sipi.h"
18
19namespace {
20
22std::array<cpu_io::GdtrInfo::SegmentDescriptor, cpu_io::GdtrInfo::kMaxCount>
23 kSegmentDescriptors = {
24 // 第一个全 0
25 cpu_io::GdtrInfo::SegmentDescriptor(),
26 // 内核代码段描述符
27 cpu_io::GdtrInfo::SegmentDescriptor(
28 cpu_io::GdtrInfo::SegmentDescriptor::Type::kCodeExecuteRead,
29 cpu_io::GdtrInfo::SegmentDescriptor::S::kCodeData,
30 cpu_io::GdtrInfo::SegmentDescriptor::DPL::kRing0,
31 cpu_io::GdtrInfo::SegmentDescriptor::P::kPresent,
32 cpu_io::GdtrInfo::SegmentDescriptor::AVL::kNotAvailable,
33 cpu_io::GdtrInfo::SegmentDescriptor::L::k64Bit),
34 // 内核数据段描述符
35 cpu_io::GdtrInfo::SegmentDescriptor(
36 cpu_io::GdtrInfo::SegmentDescriptor::Type::kDataReadWrite,
37 cpu_io::GdtrInfo::SegmentDescriptor::S::kCodeData,
38 cpu_io::GdtrInfo::SegmentDescriptor::DPL::kRing0,
39 cpu_io::GdtrInfo::SegmentDescriptor::P::kPresent,
40 cpu_io::GdtrInfo::SegmentDescriptor::AVL::kNotAvailable,
41 cpu_io::GdtrInfo::SegmentDescriptor::L::k64Bit),
42 // 用户代码段描述符
43 cpu_io::GdtrInfo::SegmentDescriptor(
44 cpu_io::GdtrInfo::SegmentDescriptor::Type::kCodeExecuteRead,
45 cpu_io::GdtrInfo::SegmentDescriptor::S::kCodeData,
46 cpu_io::GdtrInfo::SegmentDescriptor::DPL::kRing3,
47 cpu_io::GdtrInfo::SegmentDescriptor::P::kPresent,
48 cpu_io::GdtrInfo::SegmentDescriptor::AVL::kNotAvailable,
49 cpu_io::GdtrInfo::SegmentDescriptor::L::k64Bit),
50 // 用户数据段描述符
51 cpu_io::GdtrInfo::SegmentDescriptor(
52 cpu_io::GdtrInfo::SegmentDescriptor::Type::kDataReadWrite,
53 cpu_io::GdtrInfo::SegmentDescriptor::S::kCodeData,
54 cpu_io::GdtrInfo::SegmentDescriptor::DPL::kRing3,
55 cpu_io::GdtrInfo::SegmentDescriptor::P::kPresent,
56 cpu_io::GdtrInfo::SegmentDescriptor::AVL::kNotAvailable,
57 cpu_io::GdtrInfo::SegmentDescriptor::L::k64Bit),
58};
59
60cpu_io::GdtrInfo::Gdtr gdtr{
61 .limit = (sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
62 cpu_io::GdtrInfo::kMaxCount) -
63 1,
64 .base = kSegmentDescriptors.data(),
65};
66
68auto SetupGdtAndSegmentRegisters() -> void {
69 // 设置 gdt
70 cpu_io::Gdtr::Write(gdtr);
71
72 // 加载内核数据段描述符
73 cpu_io::Ds::Write(sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
74 cpu_io::GdtrInfo::kKernelDataIndex);
75 cpu_io::Es::Write(sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
76 cpu_io::GdtrInfo::kKernelDataIndex);
77 cpu_io::Fs::Write(sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
78 cpu_io::GdtrInfo::kKernelDataIndex);
79 cpu_io::Gs::Write(sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
80 cpu_io::GdtrInfo::kKernelDataIndex);
81 cpu_io::Ss::Write(sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
82 cpu_io::GdtrInfo::kKernelDataIndex);
83 // 加载内核代码段描述符
84 cpu_io::Cs::Write(sizeof(cpu_io::GdtrInfo::SegmentDescriptor) *
85 cpu_io::GdtrInfo::kKernelCodeIndex);
86}
87
88} // namespace
89
90BasicInfo::BasicInfo(int, const char**) {
93
94 kernel_addr = reinterpret_cast<uint64_t>(__executable_start);
95 kernel_size = reinterpret_cast<uint64_t>(end) -
96 reinterpret_cast<uint64_t>(__executable_start);
97
99
100 fdt_addr = 0;
101
102 core_count = cpu_io::cpuid::GetLogicalProcessorCount();
103}
104
105auto ArchInit(int, const char**) -> void {
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}
116
117auto ArchInitSMP(int, const char**) -> void {
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}
130
131auto WakeUpOtherCores() -> void {
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}
142
144 void (*entry)(void*), void* arg, uint64_t stack_top)
145 -> void {
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}
155
157 cpu_io::TrapContext* trap_context_ptr, uint64_t stack_top)
158 -> void {
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}
auto WakeUpOtherCores() -> void
唤醒其余 core
Definition arch_main.cpp:68
auto InitTaskContext(cpu_io::CalleeSavedContext *task_context, void(*entry)(void *), void *arg, uint64_t stack_top) -> void
初始化内核线程的任务上下文(重载1)
Definition arch_main.cpp:77
auto ArchInit(int argc, const char **argv) -> void
体系结构相关初始化
Definition arch_main.cpp:48
auto ArchInitSMP(int argc, const char **argv) -> void
从核的体系结构相关初始化
Definition arch_main.cpp:65
void * end[]
内核结束
void * __executable_start[]
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 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
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
size_t core_count
cpu 核数
uint64_t fdt_addr
fdt 地址
uint64_t physical_memory_addr
physical_memory 地址
uint64_t kernel_addr
kernel 地址
size_t physical_memory_size
physical_memory 大小
BasicInfo()=default
uint64_t elf_addr
elf 地址
size_t kernel_size
kernel 大小
错误类型,用于 std::expected
Definition expected.hpp:343
constexpr auto message() const -> const char *
Definition expected.hpp:358
SIPI 参数结构体
Definition sipi.h:22
uint32_t cr3
Definition sipi.h:23