diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/boot.s | 2 | ||||
| -rw-r--r-- | kernel/kmain.c | 1 | ||||
| -rw-r--r-- | kernel/page.s | 55 | ||||
| -rw-r--r-- | kernel/panic.s | 20 | ||||
| -rw-r--r-- | kernel/traps.s | 13 |
5 files changed, 90 insertions, 1 deletions
diff --git a/kernel/boot.s b/kernel/boot.s index bc42a5d..80f8be9 100644 --- a/kernel/boot.s +++ b/kernel/boot.s @@ -4,6 +4,7 @@ global kboot global register_isr global tss extern kmain +extern paging_init extern syscall_init extern timer_init extern traps_init @@ -24,6 +25,7 @@ kboot: mov esp, 0x80000 ; setup descriptor tables call flush_gdt + call paging_init call flush_idt ; last minute setup, then transfer to kmain call timer_init diff --git a/kernel/kmain.c b/kernel/kmain.c index 4bfd129..ece7012 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -3,7 +3,6 @@ #include <stdint.h> #include <sys/types.h> - uint32_t ticks = 0; extern void userspace_init(void); diff --git a/kernel/page.s b/kernel/page.s new file mode 100644 index 0000000..4e40822 --- /dev/null +++ b/kernel/page.s @@ -0,0 +1,55 @@ +global paging_init + +align 4096 +page_dir: + times 4096 db 0 + +align 4096 +page_tables: + ; two page tables + times 4096 db 0 + times 4096 db 0 +.end: + +; here, we initialize paging. since the IDT +; has yet to be populated, we must take extra +; care as we can't afford to trigger a page +; fault. +paging_init: + push ebp + mov ebp, esp + push ebx + ; populate the page directory + mov eax, page_tables + or eax, 0x007 + mov [page_dir], eax + mov eax, (page_tables+4096) + or eax, 0x007 + mov [page_dir+4], eax + ; populate the page tables + mov ebx, page_tables + mov ecx, ((page_tables.end-page_tables)/4) + mov edx, 0 +.loop: + mov eax, edx + or eax, 0x003 + cmp edx, 0x100000 + jb .skip + or eax, 0x004 +.skip: + mov [ebx], eax + dec ecx + jz .end + add ebx, 4 + add edx, 4096 + jmp .loop +.end: + ; load the page directory and enable paging + mov eax, page_dir + mov cr3, eax + mov eax, cr0 + or eax, 0x80000000 + mov cr0, eax + pop ebx + pop ebp + ret diff --git a/kernel/panic.s b/kernel/panic.s new file mode 100644 index 0000000..f4e0f26 --- /dev/null +++ b/kernel/panic.s @@ -0,0 +1,20 @@ +; +; panic.s - provides panic() which disables +; interrupts and halts the system. currently used +; mainly for debugging, will eventually be expanded +; to display some useful information on the +; console. +; + +global panic +extern printf + +panic: + push ebp + mov ebp, esp + push .msg + call printf + add esp, 4 + cli + hlt +.msg: db "Kernel panic!", 10, 0 diff --git a/kernel/traps.s b/kernel/traps.s index ba9814c..0381ee8 100644 --- a/kernel/traps.s +++ b/kernel/traps.s @@ -7,6 +7,8 @@ global syscall_init global traps_init extern call_table extern idt +extern panic +extern printf extern register_isr %macro SAVE 0 @@ -179,7 +181,18 @@ exc_gprot: exc_pagef: SAVE_ERR + + push ebx + mov ebx, cr2 + push ebx + push .fmt + call printf + add esp, 8 + call panic + RESTORE_ERR +.fmt: + db "Page Fault (illegal memory access: 0x%08x:0x%02x)", 10, 0 exc_mathf: SAVE |
