21 ret =
sys_write(
static_cast<int>(args[0]),
22 reinterpret_cast<const char*
>(args[1]),
23 static_cast<size_t>(args[2]));
26 ret =
sys_exit(
static_cast<int>(args[0]));
32 ret =
sys_clone(args[0],
reinterpret_cast<void*
>(args[1]),
33 reinterpret_cast<int*
>(args[2]),
34 reinterpret_cast<int*
>(args[3]),
35 reinterpret_cast<void*
>(args[4]));
43 case kSyscallSetTidAddress:
48 reinterpret_cast<int*
>(args[0]),
static_cast<int>(args[1]),
49 static_cast<int>(args[2]),
reinterpret_cast<const void*
>(args[3]),
50 reinterpret_cast<int*
>(args[4]),
static_cast<int>(args[5]));
56 klog::Err(
"[Syscall] Unknown syscall id: {}", syscall_id);
63[[nodiscard]]
auto sys_write(
int fd,
const char* buf,
size_t len) ->
int {
65 if (fd == 1 || fd == 2) {
67 for (
size_t i = 0; i < len; ++i) {
70 return static_cast<int>(len);
76 klog::Info(
"[Syscall] Process {} exited with code {}",
77 TaskManagerSingleton::instance().GetCurrentTask()->pid, code);
79 TaskManagerSingleton::instance().Exit(code);
81 klog::Err(
"[Syscall] sys_exit should not return!");
86 TaskManagerSingleton::instance().Schedule();
91 TaskManagerSingleton::instance().Sleep(ms);
95[[nodiscard]]
auto sys_clone(uint64_t flags,
void* stack,
int* parent_tid,
96 int* child_tid,
void* tls) ->
int {
97 auto& task_manager = TaskManagerSingleton::instance();
98 auto current = task_manager.GetCurrentTask();
100 if (!current || !current->trap_context_ptr) {
101 klog::Err(
"[Syscall] sys_clone: Invalid current task or trap context");
106 auto result = task_manager.Clone(flags, stack, parent_tid, child_tid, tls,
107 *current->trap_context_ptr);
109 if (!result.has_value()) {
111 klog::Err(
"[Syscall] sys_clone failed: {}", result.error().message());
115 Pid child_pid = result.value();
116 if (child_pid == 0) {
121 return static_cast<int>(child_pid);
126 auto& task_manager = TaskManagerSingleton::instance();
127 auto current = task_manager.GetCurrentTask();
129 if (!current || !current->trap_context_ptr) {
130 klog::Err(
"[Syscall] sys_fork: Invalid current task or trap context");
135 auto result = task_manager.Clone(0,
nullptr,
nullptr,
nullptr,
nullptr,
136 *current->trap_context_ptr);
138 if (!result.has_value()) {
140 klog::Err(
"[Syscall] sys_fork failed: {}", result.error().message());
144 Pid child_pid = result.value();
145 if (child_pid == 0) {
150 return static_cast<int>(child_pid);
155 auto current = TaskManagerSingleton::instance().GetCurrentTask();
157 klog::Err(
"[Syscall] sys_gettid: No current task");
160 return static_cast<int>(current->pid);
164 auto current = TaskManagerSingleton::instance().GetCurrentTask();
166 klog::Err(
"[Syscall] sys_set_tid_address: No current task");
175 return static_cast<int>(current->pid);
178[[nodiscard]]
auto sys_futex(
int* uaddr,
int op,
int val,
179 [[maybe_unused]]
const void* timeout,
180 [[maybe_unused]]
int* uaddr2,
181 [[maybe_unused]]
int val3) ->
int {
183 static constexpr int kFutexWait = 0;
184 static constexpr int kFutexWake = 1;
185 static constexpr int kFutexRequeue = 3;
190 auto& task_manager = TaskManagerSingleton::instance();
194 klog::Debug(
"[Syscall] FUTEX_WAIT on {:#x} (val={})",
195 static_cast<uint64_t
>(
reinterpret_cast<uintptr_t
>(uaddr)),
199 reinterpret_cast<uintptr_t
>(uaddr));
212 task_manager.Block(futex_id);
217 klog::Debug(
"[Syscall] FUTEX_WAKE on {:#x} (count={})",
218 static_cast<uint64_t
>(
reinterpret_cast<uintptr_t
>(uaddr)),
222 reinterpret_cast<uintptr_t
>(uaddr));
225 task_manager.Wakeup(futex_id);
232 case kFutexRequeue: {
235 klog::Warn(
"[Syscall] FUTEX_REQUEUE not implemented");
240 klog::Err(
"[Syscall] Unknown futex operation: {}", cmd);
246 uint64_t* mask) ->
int {
247 auto& task_manager = TaskManagerSingleton::instance();
252 target = task_manager.GetCurrentTask();
255 target = task_manager.FindTask(
static_cast<Pid>(pid));
257 klog::Err(
"[Syscall] sys_sched_getaffinity: Task {} not found", pid);
267 if (cpusetsize <
sizeof(uint64_t)) {
276 const uint64_t* mask) ->
int {
277 auto& task_manager = TaskManagerSingleton::instance();
281 target = task_manager.GetCurrentTask();
284 target = task_manager.FindTask(
static_cast<Pid>(pid));
286 klog::Err(
"[Syscall] sys_sched_setaffinity: Task {} not found", pid);
296 if (cpusetsize <
sizeof(uint64_t)) {
302 klog::Debug(
"[Syscall] Set CPU affinity for task {} to {:#x}", target->
pid,
auto etl_putchar(int c) -> void
早期控制台字符输出
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
auto Debug(etl::format_string< Args... > fmt, Args &&... args) -> void
以 DEBUG 级别记录日志(SIMPLEKERNEL_MIN_LOG_LEVEL > 0 时编译期消除)
auto Warn(etl::format_string< Args... > fmt, Args &&... args) -> void
以 WARN 级别记录日志
@ kFutex
Futex (快速用户空间互斥锁)
CpuAffinity cpu_affinity
CPU 亲和性位掩码
TaskAuxData * aux
非调度热路径的辅助数据
auto sys_sleep(uint64_t ms) -> int
休眠指定毫秒数
auto sys_set_tid_address(int *tidptr) -> int
设置线程ID地址(用于线程退出时的清理)
auto sys_sched_getaffinity(int pid, size_t cpusetsize, uint64_t *mask) -> int
获取线程的CPU亲和性
auto sys_exit(int code) -> int
退出当前进程或线程
auto sys_sched_setaffinity(int pid, size_t cpusetsize, const uint64_t *mask) -> int
设置线程的CPU亲和性
auto sys_futex(int *uaddr, int op, int val, const void *timeout, int *uaddr2, int val3) -> int
快速用户空间互斥锁操作(futex)
auto sys_gettid() -> int
获取当前线程ID
auto sys_fork() -> int
创建新进程(fork)
auto sys_yield() -> int
主动放弃CPU,让出时间片
auto sys_write(int fd, const char *buf, size_t len) -> int
向文件描述符写入数据
auto sys_clone(uint64_t flags, void *stack, int *parent_tid, int *child_tid, void *tls) -> int
创建新线程(或进程)
auto syscall_dispatcher(int64_t syscall_id, uint64_t args[6]) -> int