X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/8fdcd1575a97862975fa019f09c00453a2a7d8bb..33e7863900e90b0b30e296fa52861965264e2393:/lunaix-os/kernel/asm/x86/pfault.c?ds=sidebyside diff --git a/lunaix-os/kernel/asm/x86/pfault.c b/lunaix-os/kernel/asm/x86/pfault.c index 30fd498..6df3182 100644 --- a/lunaix-os/kernel/asm/x86/pfault.c +++ b/lunaix-os/kernel/asm/x86/pfault.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -40,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 @@ -92,7 +93,8 @@ segv_term: ptr, param->cs, param->eip); - terminate_proc(LXSEGFAULT); + __SIGSET(__current->sig_pending, _SIGSEGV); + schedule(); // should not reach while (1) ;