SimpleKernel 1.17.0
Loading...
Searching...
No Matches
arch.cpp
Go to the documentation of this file.
1
5#include <cassert>
6#include <cstring>
7
8#include "cpu_io.h"
9#include "per_cpu.hpp"
10#include "task_manager.hpp"
12
13extern "C" {
14
17 auto* env_state =
19 assert(env_state &&
20 "TestEnvironmentState not set for current thread. "
21 "Did you forget to call SetCurrentThreadEnvironment()?");
22
23 auto& core_env = env_state->GetCurrentCoreEnv();
24
25 // 从上下文指针查找对应的任务
26 auto* prev_task = env_state->FindTaskByContext(prev_ctx);
27 auto* next_task = env_state->FindTaskByContext(next_ctx);
28
29 // 获取 PerCpu 数据
31
32 // 记录切换事件到环境层
34 event.timestamp = (per_cpu.sched_data ? per_cpu.sched_data->local_tick : 0);
35 event.from = prev_task;
36 event.to = next_task;
37 event.core_id = core_env.core_id;
38 core_env.switch_history.push_back(event);
39
40 // 更新 PerCpu 的当前线程
41 per_cpu.running_task = next_task;
42}
43
45void trap_return(void*) {}
46void trap_entry() {}
47
48} // extern "C"
49
51 void (*entry)(void*), void* arg, uint64_t stack_top) {
52 // 清零上下文
53 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
54
55 task_context->ReturnAddress() =
56 reinterpret_cast<uint64_t>(kernel_thread_entry);
57 task_context->EntryFunction() = reinterpret_cast<uint64_t>(entry);
58 task_context->EntryArgument() = reinterpret_cast<uint64_t>(arg);
59 task_context->StackPointer() = stack_top;
60}
61
63 cpu_io::TrapContext* trap_context_ptr,
64 uint64_t stack_top) {
65 // 清零上下文
66 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
67
68 task_context->ReturnAddress() =
69 reinterpret_cast<uint64_t>(kernel_thread_entry);
70 task_context->EntryFunction() = reinterpret_cast<uint64_t>(trap_return);
71 task_context->EntryArgument() = reinterpret_cast<uint64_t>(trap_context_ptr);
72 task_context->StackPointer() = stack_top;
73}
74
75#include <stdio.h>
76
77extern "C" void etl_putchar(int c) { putchar(c); }
void InitTaskContext(cpu_io::CalleeSavedContext *task_context, void(*entry)(void *), void *arg, uint64_t stack_top)
初始化内核线程的任务上下文(重载1)
Definition arch.cpp:50
void etl_putchar(int c)
早期控制台字符输出
Definition arch.cpp:77
void kernel_thread_entry()
Definition arch.cpp:44
void trap_entry()
Definition arch.cpp:46
void trap_return(void *)
Definition arch.cpp:45
void switch_to(cpu_io::CalleeSavedContext *prev_ctx, cpu_io::CalleeSavedContext *next_ctx)
Definition arch.cpp:15
static auto GetCurrentThreadEnvironment() -> TestEnvironmentState *
获取当前线程的环境实例指针(供 Mock 层调用)
static __always_inline auto GetCurrentCore() -> PerCpu &
获取当前核心的 PerCpu 数据
Definition per_cpu.hpp:55
__always_inline uint64_t & EntryFunction()
Definition cpu_io.h:208
__always_inline uint64_t & EntryArgument()
Definition cpu_io.h:209
__always_inline uint64_t & ReturnAddress()
Definition cpu_io.h:207
__always_inline uint64_t & StackPointer()
Definition cpu_io.h:210