SimpleKernel 1.17.0
Loading...
Searching...
No Matches
syscall.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <cpu_io.h>
8
9#include <cstddef>
10#include <cstdint>
11
12// 参考 Linux 系统调用号
13#if defined(__riscv) || defined(__aarch64__)
14// RISC-V 64 和 AArch64 使用 asm-generic 编号
15inline constexpr uint64_t kSyscallWrite = 64;
16inline constexpr uint64_t kSyscallExit = 93;
17inline constexpr uint64_t kSyscallYield = 124;
18inline constexpr uint64_t kSyscallClone = 220;
19inline constexpr uint64_t kSyscallGettid = 178;
20inline constexpr uint64_t kSyscallFutex = 98;
21inline constexpr uint64_t kSyscallSetTidAddress = 96;
22inline constexpr uint64_t kSyscallFork = 1220;
23inline constexpr uint64_t kSyscallSleep = 101;
24#elif defined(__x86_64__)
25// x86_64 使用自己的编号
26inline constexpr uint64_t kSyscallWrite = 1;
27inline constexpr uint64_t kSyscallExit = 60;
28inline constexpr uint64_t kSyscallYield = 24;
29inline constexpr uint64_t kSyscallClone = 56;
30inline constexpr uint64_t kSyscallGettid = 186;
31inline constexpr uint64_t kSyscallFutex = 202;
32inline constexpr uint64_t kSyscallSetTidAddress = 218;
33inline constexpr uint64_t kSyscallFork = 57;
34inline constexpr uint64_t kSyscallSleep = 35;
35#else
36#error "Unsupported architecture for syscall numbers"
37#endif
38
39// 由各个架构实现
40auto Syscall(uint64_t cause, cpu_io::TrapContext* context) -> void;
41
42auto syscall_dispatcher(int64_t syscall_id, uint64_t args[6]) -> int;
43
52[[nodiscard]] auto sys_write(int fd, const char* buf, size_t len) -> int;
53
65auto sys_exit(int code) -> int;
66
72[[nodiscard]] auto sys_yield() -> int;
73
80[[nodiscard]] auto sys_sleep(uint64_t ms) -> int;
81
98[[nodiscard]] auto sys_clone(uint64_t flags, void* stack, int* parent_tid,
99 int* child_tid, void* tls) -> int;
100
113[[nodiscard]] auto sys_fork() -> int;
114
123[[nodiscard]] auto sys_gettid() -> int;
124
133[[nodiscard]] auto sys_set_tid_address(int* tidptr) -> int;
134
156[[nodiscard]] auto sys_futex(int* uaddr, int op, int val, const void* timeout,
157 int* uaddr2, int val3) -> int;
158
166[[nodiscard]] auto sys_sched_getaffinity(int pid, size_t cpusetsize,
167 uint64_t* mask) -> int;
168
180[[nodiscard]] auto sys_sched_setaffinity(int pid, size_t cpusetsize,
181 const uint64_t* mask) -> int;
auto sys_sleep(uint64_t ms) -> int
休眠指定毫秒数
Definition syscall.cpp:90
auto sys_set_tid_address(int *tidptr) -> int
设置线程ID地址(用于线程退出时的清理)
Definition syscall.cpp:163
auto sys_sched_getaffinity(int pid, size_t cpusetsize, uint64_t *mask) -> int
获取线程的CPU亲和性
Definition syscall.cpp:245
auto sys_exit(int code) -> int
退出当前进程或线程
Definition syscall.cpp:75
auto sys_sched_setaffinity(int pid, size_t cpusetsize, const uint64_t *mask) -> int
设置线程的CPU亲和性
Definition syscall.cpp:275
auto sys_futex(int *uaddr, int op, int val, const void *timeout, int *uaddr2, int val3) -> int
快速用户空间互斥锁操作(futex)
Definition syscall.cpp:178
auto syscall_dispatcher(int64_t syscall_id, uint64_t args[6]) -> int
Definition syscall.cpp:17
auto sys_gettid() -> int
获取当前线程ID
Definition syscall.cpp:154
auto Syscall(uint64_t cause, cpu_io::TrapContext *context) -> void
AArch64 系统调用处理
Definition syscall.cpp:16
auto sys_fork() -> int
创建新进程(fork)
Definition syscall.cpp:125
auto sys_yield() -> int
主动放弃CPU,让出时间片
Definition syscall.cpp:85
auto sys_write(int fd, const char *buf, size_t len) -> int
向文件描述符写入数据
Definition syscall.cpp:63
auto sys_clone(uint64_t flags, void *stack, int *parent_tid, int *child_tid, void *tls) -> int
创建新线程(或进程)
Definition syscall.cpp:95