Skip to content

Commit 24227c2

Browse files
实现一些系统状态的 abi 比如 /proc/update
Co-authored-by: wenxuanjun <41050170+wenxuanjun@users.noreply.github.com>
1 parent 1acf4b4 commit 24227c2

File tree

10 files changed

+123
-18
lines changed

10 files changed

+123
-18
lines changed

src/arch/x86_64/include/nr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
#define SYSCALL_SYSLOG 103
8989
#define SYSCALL_GETGID 104
9090
#define SYSCALL_GETSID 124
91+
#define SYSCALL_CAPGET 125
92+
#define SYSCALL_CAPSET 126
9193
#define SYSCALL_SETUID 105
9294
#define SYSCALL_SETGID 106
9395
#define SYSCALL_GETEUID 107

src/arch/x86_64/syscall.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ syscall_t syscall_handlers[MAX_SYSCALLS] = {
200200
[SYSCALL_CHROOT] = (syscall_t)syscall_chroot,
201201
[SYSCALL_SETITIMER] = (syscall_t)syscall_setitimer,
202202
[SYSCALL_KILL] = (syscall_t)syscall_kill,
203+
[SYSCALL_CAPGET] = (syscall_t)syscall_capget,
204+
[SYSCALL_CAPSET] = (syscall_t)syscall_capset,
203205
[SYSCALL_CHOWN] = (syscall_t)syscall_chown,
204206
[SYSCALL_FCHOWN] = (syscall_t)syscall_fchown,
205207
[SYSCALL_LCHOWN] = (syscall_t)syscall_lchown,

src/fs/procfs/proc_dpatch.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ void load_procfs_root() {
5353
create_procfs_node("meminfo", proc_meminfo_read, proc_meminfo_stat);
5454
create_procfs_node("cpuinfo", proc_cpuinfo_read, proc_cpuinfo_stat);
5555
create_procfs_node("stat", proc_stat_read, proc_stat_stat);
56-
56+
create_procfs_node("uptime", proc_uptime_read, proc_uptime_stat);
57+
create_procfs_node("loadavg", proc_loadavg_read, proc_loadavg_stat);
5758
create_procfs_handle("proc_cmdline",proc_pcmdline_read,proc_pcmdline_stat);
5859
create_procfs_handle("proc_maps",proc_pmaps_read,proc_pmaps_stat);
5960
create_procfs_handle("proc_stat",proc_pstat_read,proc_pstat_stat);

src/fs/procfs/proc_stat.c

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,56 @@
22
#include "intctl.h"
33
#include "task/smp.h"
44
#include "string_builder.h"
5+
#include "timer.h"
6+
#include "metadata.h"
57

6-
static bool gen_ctxt_processes(string_builder_t *builder){
7-
size_t all_ctxt = 0;
8-
size_t processes_all = 0;
9-
for (size_t i = 0; i < get_cpu_count(); i++) {
8+
char *proc_gen_stat(size_t *context_len) {
9+
string_builder_t *builder = create_string_builder(4096);
10+
size_t cpu_count = get_cpu_count();
11+
12+
uint64_t total_idle = 0;
13+
uint64_t total_system = 0;
14+
size_t processes_all = 0;
15+
size_t procs_running = 0;
16+
17+
for (size_t i = 0; i < cpu_count; i++) {
1018
cpu_local_t *info = get_cpu_local(i);
11-
if(info == NULL) continue;
12-
all_ctxt += info->jiffies;
19+
if (info == NULL || !info->enable) continue;
20+
total_system += info->jiffies - info->idle_jiffies;
21+
total_idle += info->idle_jiffies;
1322
processes_all += info->task_count;
23+
if (info->current_task && info->current_task->status == T_RUNNING)
24+
procs_running++;
1425
}
15-
bool status = string_builder_append(builder,"ctxt %llu\n",all_ctxt);
16-
status &= string_builder_append(builder,"processes %llu\n",processes_all);
17-
return !status;
18-
}
1926

20-
char *proc_gen_stat(size_t *context_len) {
21-
string_builder_t *builder = create_string_builder(4096);
27+
string_builder_append(builder, "cpu 0 0 %llu %llu 0 0 0 0 0 0\n",
28+
total_system, total_idle);
29+
30+
for (size_t i = 0; i < cpu_count; i++) {
31+
cpu_local_t *info = get_cpu_local(i);
32+
if (info == NULL || !info->enable) continue;
33+
uint64_t sys = info->jiffies - info->idle_jiffies;
34+
uint64_t idle = info->idle_jiffies;
35+
string_builder_append(builder, "cpu%llu 0 0 %llu %llu 0 0 0 0 0 0\n",
36+
(uint64_t)i, sys, idle);
37+
}
38+
39+
string_builder_append(builder, "intr %llu\n", get_all_irq_count());
40+
string_builder_append(builder, "ctxt %llu\n", total_system + total_idle);
41+
42+
int64_t btime = mktime_universal();
43+
if (btime > 0) {
44+
uint64_t uptime_sec = nano_time() / 1000000000ULL;
45+
string_builder_append(builder, "btime %llu\n", (uint64_t)(btime - uptime_sec));
46+
} else {
47+
string_builder_append(builder, "btime 0\n");
48+
}
2249

23-
if(gen_ctxt_processes(builder)) goto end;
50+
string_builder_append(builder, "processes %llu\n", (uint64_t)processes_all);
51+
string_builder_append(builder, "procs_running %llu\n", (uint64_t)procs_running);
52+
string_builder_append(builder, "procs_blocked 0\n");
53+
string_builder_append(builder, "softirq 0 0 0 0 0 0 0 0 0 0 0\n");
2454

25-
end:
2655
*context_len = builder->size;
2756
char *data = builder->data;
2857
free(builder);

src/include/fs/procfs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ size_t proc_cpuinfo_stat(proc_handle_t *handle);
6262
size_t proc_cpuinfo_read(proc_handle_t *handle, void *addr, size_t offset, size_t size);
6363
size_t proc_stat_stat(proc_handle_t *handle);
6464
size_t proc_stat_read(proc_handle_t *handle, void *addr, size_t offset, size_t size);
65+
size_t proc_uptime_stat(proc_handle_t *handle);
66+
size_t proc_uptime_read(proc_handle_t *handle, void *addr, size_t offset, size_t size);
67+
size_t proc_loadavg_stat(proc_handle_t *handle);
68+
size_t proc_loadavg_read(proc_handle_t *handle, void *addr, size_t offset, size_t size);
6569

6670
size_t procfs_node_read(size_t len, size_t offset, size_t size, char *addr, char *contect);
6771

src/include/syscall.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,22 @@ struct tms {
332332
long tms_cstime;
333333
};
334334

335+
// Linux capability 版本号
336+
#define _LINUX_CAPABILITY_VERSION_1 0x19980330
337+
#define _LINUX_CAPABILITY_VERSION_2 0x20071026
338+
#define _LINUX_CAPABILITY_VERSION_3 0x20080522
339+
340+
typedef struct {
341+
uint32_t version;
342+
int pid;
343+
} cap_user_header_t;
344+
345+
typedef struct {
346+
uint32_t effective;
347+
uint32_t permitted;
348+
uint32_t inheritable;
349+
} cap_user_data_t;
350+
335351
void arch_enable_syscall();
336352

337353
// fs syscall
@@ -467,6 +483,8 @@ syscall_(prlimit64, uint64_t pid, int resource, const struct rlimit *new_rlim,
467483
syscall_(getresgid, int *rgid, int *egid, int *sgid);
468484
syscall_(getresuid, int *ruid, int *euid, int *suid);
469485
syscall_(kill, int pid, int sig);
486+
syscall_(capget, cap_user_header_t *header, cap_user_data_t *data);
487+
syscall_(capset, cap_user_header_t *header, cap_user_data_t *data);
470488

471489
// mem syscall
472490
syscall_(mmap, uint64_t addr, size_t length, uint64_t prot, uint64_t flags, int fd,

src/include/task/smp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ typedef struct cpu_local_info {
2121
arch_cpu_t arch_data; // 架构私有数据
2222
size_t task_count; // 任务数量
2323
uint64_t jiffies; // 时钟计数器计数 (不包含 yield)
24+
uint64_t idle_jiffies; // 空闲时钟计数
2425
bool is_yield; // 此次调度是否为 yield
2526
} __attribute__((packed)) cpu_local_t;
2627

src/mod/elf_load.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,7 @@ void launch_init_process() {
196196
"HOME=/root",
197197
"TERM=linux",
198198
"PATH=/bin:/sbin:/usr/bin",
199-
// "PS1=\\[\\e[01;93m\\][\\[\\e[01;34m\\]\\u\\[\\e[01;32m\\]@\\h\\[\\e[00m\\] "
200-
// "\\[\\e[01;33m\\]\\w\\[\\e[01;93m\\]]\\[\\e[01;34m\\]\\$\\[\\e[00m\\] ",
199+
"PS1=\\u@\\h \\w# ",
201200
NULL,
202201
};
203202
size_t envc = (sizeof(init_envp_src) / sizeof(init_envp_src[0])) - 1;

src/task/prsys.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,3 +448,47 @@ syscall_(getrusage, int who, struct rusage *usage) {
448448
if (usage) { memset(usage, 0, sizeof(struct rusage)); }
449449
return EOK;
450450
}
451+
452+
syscall_(capget, cap_user_header_t *header, cap_user_data_t *data) {
453+
if (header == NULL) return SYSCALL_FAULT_(EFAULT);
454+
uint32_t ver = header->version;
455+
if (ver != _LINUX_CAPABILITY_VERSION_1 &&
456+
ver != _LINUX_CAPABILITY_VERSION_2 &&
457+
ver != _LINUX_CAPABILITY_VERSION_3) {
458+
header->version = _LINUX_CAPABILITY_VERSION_3;
459+
return SYSCALL_FAULT_(EINVAL);
460+
}
461+
if (data == NULL) return EOK;
462+
pcb_t process;
463+
if (header->pid == 0) {
464+
process = get_current_task()->process;
465+
} else {
466+
process = found_pcb(header->pid);
467+
if (process == NULL) return SYSCALL_FAULT_(ESRCH);
468+
}
469+
uint32_t all_caps = (process->uid == 0) ? 0xFFFFFFFF : 0;
470+
data[0].effective = all_caps;
471+
data[0].permitted = all_caps;
472+
data[0].inheritable = 0;
473+
if (ver != _LINUX_CAPABILITY_VERSION_1) {
474+
data[1].effective = all_caps;
475+
data[1].permitted = all_caps;
476+
data[1].inheritable = 0;
477+
}
478+
return EOK;
479+
}
480+
481+
syscall_(capset, cap_user_header_t *header, cap_user_data_t *data) {
482+
if (header == NULL) return SYSCALL_FAULT_(EFAULT);
483+
uint32_t ver = header->version;
484+
if (ver != _LINUX_CAPABILITY_VERSION_1 &&
485+
ver != _LINUX_CAPABILITY_VERSION_2 &&
486+
ver != _LINUX_CAPABILITY_VERSION_3) {
487+
header->version = _LINUX_CAPABILITY_VERSION_3;
488+
return SYSCALL_FAULT_(EINVAL);
489+
}
490+
if (data == NULL) return SYSCALL_FAULT_(EFAULT);
491+
pcb_t process = get_current_task()->process;
492+
if (process->uid != 0) return SYSCALL_FAULT_(EPERM);
493+
return EOK;
494+
}

src/task/scheduler.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,12 @@ void scheduler_handler(uint64_t irq_num, void *data, struct pt_regs *regs) {
164164
cpu_local_t *cpu = arch_current_cpu();
165165
if (unlikely(cpu == NULL)) return;
166166

167-
if (!cpu->is_yield) { cpu->jiffies++; }
167+
if (!cpu->is_yield) {
168+
cpu->jiffies++;
169+
if (cpu->current_task == cpu->idle_task) {
170+
cpu->idle_jiffies++;
171+
}
172+
}
168173
cpu->is_yield = false;
169174

170175
tcb_t current_thread = get_current_task();

0 commit comments

Comments
 (0)