From 9d62069fd52fa2108b677ffadc7f6138c7641757 Mon Sep 17 00:00:00 2001 From: Minep Date: Sat, 25 Jun 2022 16:28:16 +0100 Subject: [PATCH] refactor: make the demos into dedicated files fix: issues related to gcc optimization fix: when kernel access user page that lead to pfault, it must not give up without checking the user space address. chore: formatting --- lunaix-os/kernel/asm/x86/pfault.c | 6 +- lunaix-os/kernel/asm/x86/tss.c | 4 +- lunaix-os/kernel/demos/signal_demo.c | 83 ++++++++++++++++++++++++++++ lunaix-os/kernel/ds/semaphore.c | 12 +++- lunaix-os/kernel/lxinit.c | 37 +------------ lunaix-os/kernel/proc0.c | 6 ++ lunaix-os/kernel/signal.c | 4 +- 7 files changed, 108 insertions(+), 44 deletions(-) create mode 100644 lunaix-os/kernel/demos/signal_demo.c diff --git a/lunaix-os/kernel/asm/x86/pfault.c b/lunaix-os/kernel/asm/x86/pfault.c index fcf3739..6df3182 100644 --- a/lunaix-os/kernel/asm/x86/pfault.c +++ b/lunaix-os/kernel/asm/x86/pfault.c @@ -41,17 +41,17 @@ intr_routine_page_fault(const isr_param* param) if (do_kernel(&mapping)) { return; } - goto segv_term; + // 如果不是,那么看看内核是不是需要用户页。 } struct mm_region* hit_region = region_get(&__current->mm.regions, ptr); if (!hit_region) { - // Into the void... + // 当你凝视深渊时…… goto segv_term; } - x86_pte_t* pte = &PTE_MOUNTED(PD_REFERENCED, ptr >> 12); + volatile x86_pte_t* pte = &PTE_MOUNTED(PD_REFERENCED, ptr >> 12); if ((*pte & PG_PRESENT)) { if ((hit_region->attr & COW_MASK) == COW_MASK) { // normal page fault, do COW diff --git a/lunaix-os/kernel/asm/x86/tss.c b/lunaix-os/kernel/asm/x86/tss.c index 74dad78..c871613 100644 --- a/lunaix-os/kernel/asm/x86/tss.c +++ b/lunaix-os/kernel/asm/x86/tss.c @@ -1,7 +1,9 @@ #include #include -struct x86_tss _tss = { .link = 0, .esp0 = KSTACK_TOP, .ss0 = KDATA_SEG }; +volatile struct x86_tss _tss = { .link = 0, + .esp0 = KSTACK_TOP, + .ss0 = KDATA_SEG }; void tss_update_esp(uint32_t esp0) diff --git a/lunaix-os/kernel/demos/signal_demo.c b/lunaix-os/kernel/demos/signal_demo.c new file mode 100644 index 0000000..87b6304 --- /dev/null +++ b/lunaix-os/kernel/demos/signal_demo.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include + +LOG_MODULE("SIGDEMO") + +void __USER__ +sigchild_handler(int signum) +{ + kprintf(KINFO "SIGCHLD received\n"); +} + +void __USER__ +sigsegv_handler(int signum) +{ + pid_t pid = getpid(); + kprintf(KWARN "SIGSEGV received on process %d\n", pid); + _exit(signum); +} + +void __USER__ +sigalrm_handler(int signum) +{ + pid_t pid = getpid(); + kprintf(KWARN "I, pid %d, have received an alarm!\n", pid); +} + +void __USER__ +_signal_demo_main() +{ + signal(_SIGCHLD, sigchild_handler); + signal(_SIGSEGV, sigsegv_handler); + signal(_SIGALRM, sigalrm_handler); + + alarm(5); + + int status; + pid_t p = 0; + + kprintf(KINFO "Child sleep 3s, parent pause.\n"); + if (!fork()) { + sleep(3); + _exit(0); + } + + pause(); + + kprintf("Parent resumed on SIGCHILD\n"); + + for (int i = 0; i < 5; i++) { + pid_t pid = 0; + if (!(pid = fork())) { + signal(_SIGSEGV, sigsegv_handler); + sleep(i); + if (i == 3) { + i = *(int*)0xdeadc0de; // seg fault! + } + kprintf(KINFO "%d\n", i); + _exit(0); + } + kprintf(KINFO "Forked %d\n", pid); + } + + while ((p = wait(&status)) >= 0) { + short code = WEXITSTATUS(status); + if (WIFSIGNALED(status)) { + kprintf(KINFO "Process %d terminated by signal, exit_code: %d\n", + p, + code); + } else if (WIFEXITED(status)) { + kprintf(KINFO "Process %d exited with code %d\n", p, code); + } else { + kprintf(KWARN "Process %d aborted with code %d\n", p, code); + } + } + + kprintf("done\n"); + + spin(); +} \ No newline at end of file diff --git a/lunaix-os/kernel/ds/semaphore.c b/lunaix-os/kernel/ds/semaphore.c index 7b059a6..ab494d2 100644 --- a/lunaix-os/kernel/ds/semaphore.c +++ b/lunaix-os/kernel/ds/semaphore.c @@ -1,18 +1,24 @@ #include #include -void sem_init(struct sem_t *sem, unsigned int initial) { +void +sem_init(struct sem_t* sem, unsigned int initial) +{ sem->counter = ATOMIC_VAR_INIT(initial); } -void sem_wait(struct sem_t *sem) { +void +sem_wait(struct sem_t* sem) +{ while (!atomic_load(&sem->counter)) { schedule(); } atomic_fetch_sub(&sem->counter, 1); } -void sem_post(struct sem_t *sem) { +void +sem_post(struct sem_t* sem) +{ atomic_fetch_add(&sem->counter, 1); // TODO: wake up a thread } \ No newline at end of file diff --git a/lunaix-os/kernel/lxinit.c b/lunaix-os/kernel/lxinit.c index 91a4e50..2ac9342 100644 --- a/lunaix-os/kernel/lxinit.c +++ b/lunaix-os/kernel/lxinit.c @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -19,27 +18,6 @@ LOG_MODULE("INIT") #define WAIT_DEMO #define IN_USER_MODE -void __USER__ -sigchild_handler(int signum) -{ - kprintf(KINFO "SIGCHLD received\n"); -} - -void __USER__ -sigsegv_handler(int signum) -{ - pid_t pid = getpid(); - kprintf(KWARN "SIGSEGV received on process %d\n", pid); - _exit(signum); -} - -void __USER__ -sigalrm_handler(int signum) -{ - pid_t pid = getpid(); - kprintf(KWARN "I, pid %d, have received an alarm!\n", pid); -} - void __USER__ _lxinit_main() { @@ -53,12 +31,6 @@ _lxinit_main() } #endif - signal(_SIGCHLD, sigchild_handler); - signal(_SIGSEGV, sigsegv_handler); - signal(_SIGALRM, sigalrm_handler); - - alarm(5); - int status; #ifdef WAIT_DEMO // 测试wait @@ -69,7 +41,7 @@ _lxinit_main() kprintf("I am child, I am about to terminated\n"); _exit(1); } - pause(); + wait(&status); pid_t child = wait(&status); kprintf("I am parent, my child (%d) terminated normally with code: %d.\n", child, @@ -89,7 +61,6 @@ _lxinit_main() for (size_t i = 0; i < 5; i++) { pid_t pid = 0; if (!(pid = fork())) { - signal(_SIGSEGV, sigsegv_handler); sleep(i); if (i == 3) { i = *(int*)0xdeadc0de; // seg fault! @@ -103,11 +74,7 @@ _lxinit_main() while ((p = wait(&status)) >= 0) { short code = WEXITSTATUS(status); - if (WIFSIGNALED(status)) { - kprintf(KINFO "Process %d terminated by signal, exit_code: %d\n", - p, - code); - } else if (WIFEXITED(status)) { + if (WIFEXITED(status)) { kprintf(KINFO "Process %d exited with code %d\n", p, code); } else { kprintf(KWARN "Process %d aborted with code %d\n", p, code); diff --git a/lunaix-os/kernel/proc0.c b/lunaix-os/kernel/proc0.c index 4cc414c..79ef12e 100644 --- a/lunaix-os/kernel/proc0.c +++ b/lunaix-os/kernel/proc0.c @@ -31,11 +31,17 @@ unlock_reserved_memory(); void __do_reserved_memory(int unlock); +//#define DEMO_SIGNAL + void __USER__ __proc0_usr() { if (!fork()) { +#ifdef DEMO_SIGNAL + asm("jmp _signal_demo_main"); +#else asm("jmp _lxinit_main"); +#endif } while (1) { diff --git a/lunaix-os/kernel/signal.c b/lunaix-os/kernel/signal.c index 19deff2..dd16e24 100644 --- a/lunaix-os/kernel/signal.c +++ b/lunaix-os/kernel/signal.c @@ -17,9 +17,9 @@ default_sighandler_term(int signum) void* default_handlers[_SIG_NUM] = { // TODO: 添加默认handler + [_SIGINT] = default_sighandler_term, [_SIGTERM] = default_sighandler_term, + [_SIGKILL] = default_sighandler_term, [_SIGSEGV] = default_sighandler_term, [_SIGINT] = default_sighandler_term, - [_SIGTERM] = default_sighandler_term, - [_SIGKILL] = default_sighandler_term, }; // Referenced in kernel/asm/x86/interrupt.S -- 2.27.0