diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-07 02:52:11 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-07 02:52:11 +0200 |
| commit | 50aaae893611af890a6855158ad0a3e32c7b2c43 (patch) | |
| tree | 53eb05c907949accde8ce29e8ce7d8213a981816 /kernel/src | |
| parent | 36de2495d62c1652236ac1ffcba46b0b12ddabeb (diff) | |
paging in c
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/boot/boot.S | 40 | ||||
| -rw-r--r-- | kernel/src/boot/boot64.S | 1 | ||||
| -rw-r--r-- | kernel/src/devices/keyboard.c | 9 | ||||
| -rw-r--r-- | kernel/src/main.c | 2 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 35 | ||||
| -rw-r--r-- | kernel/src/mem/paging_asm.S | 12 |
6 files changed, 70 insertions, 29 deletions
diff --git a/kernel/src/boot/boot.S b/kernel/src/boot/boot.S index ee35eeb..bf5251b 100644 --- a/kernel/src/boot/boot.S +++ b/kernel/src/boot/boot.S @@ -59,37 +59,25 @@ check_long_mode: ret setup_page_tables: - mov $page_table_lvl3, %eax + mov $pt_lvl3, %eax or $0x3, %eax - mov %eax, page_table_lvl4 + mov %eax, pt_lvl4 - mov $page_table_lvl2, %eax + // 0x00000000 - 0x00200000 : 0x00000000 + mov $pt_lvl2, %eax or $0x3, %eax - mov %eax, page_table_lvl3 - - mov $page_table_lvl2 + 4096, %eax - or $0x3, %eax - mov %eax, page_table_lvl3+8 - - mov $page_table_lvl2 + 8192, %eax - or $0x3, %eax - mov %eax, page_table_lvl3+16 - - mov $page_table_lvl2 + 12288, %eax - or $0x3, %eax - mov %eax, page_table_lvl3+24 - + mov %eax, pt_lvl3 movl $0, %ecx 1: - movl $0x200000, %eax + movl $0x00200000, %eax mul %ecx or $0b10000011, %eax - movl $page_table_lvl2, %edx + movl $pt_lvl2, %edx leal (%edx, %ecx, 8), %edx movl %eax, (%edx) inc %ecx - cmp $512*4, %ecx + cmp $1, %ecx jne 1b ret @@ -106,8 +94,8 @@ enable_paging: or $1<<8, %eax wrmsr - // page_table_lvl4 - mov $page_table_lvl4, %eax + // pt_lvl4 + mov $pt_lvl4, %eax mov %eax, %cr3 // enable paging (+ protected mode if not already enabled) @@ -136,13 +124,13 @@ stack_bottom: stack_top: // page tables -page_table_lvl4: +pt_lvl4: .skip 4096 -page_table_lvl3: +pt_lvl3: .skip 4096 // map first 4GB -page_table_lvl2: - .skip 4096*4 +pt_lvl2: + .skip 4096 // Access bits .section .rodata diff --git a/kernel/src/boot/boot64.S b/kernel/src/boot/boot64.S index be87412..50ee7cd 100644 --- a/kernel/src/boot/boot64.S +++ b/kernel/src/boot/boot64.S @@ -14,6 +14,5 @@ begin_long_mode: popq %rdi popq %rsi - call kernel_main hlt diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c index bf4948d..d4b06b9 100644 --- a/kernel/src/devices/keyboard.c +++ b/kernel/src/devices/keyboard.c @@ -39,6 +39,12 @@ void itos(uint32_t num, char** s) void print_char(char c) { + + if (c == '\n') { + x = 0; + y++; + return; + } if (x * 8 >= fb.width) { x = 0; y++; @@ -76,8 +82,7 @@ void keyboard_handler(void) print_char(' '); x--; } else if (keycode == KEY_ENTER) { - x = 0; - y++; + print_char(keymap[keycode]); } else { if (keymap[keycode] == ' ') return; if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT]) diff --git a/kernel/src/main.c b/kernel/src/main.c index 2653b4d..bea4ed2 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -3,9 +3,11 @@ #include <graphics.h> #include <idt.h> #include <debug.h> +#include <paging.h> int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) { + init_paging(); init_idt(); init_fb(multiboot_bootinfo, multiboot_magic); diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c new file mode 100644 index 0000000..aa7f91e --- /dev/null +++ b/kernel/src/mem/paging.c @@ -0,0 +1,35 @@ +#include <stdint.h> +#include <paging.h> + +void load_pt_lvl4(uint64_t*); + +__attribute__((aligned(4096))) uint64_t page_table_lvl4[512]; +__attribute__((aligned(4096))) uint64_t page_table_lvl3[512]; +__attribute__((aligned(4096))) uint64_t page_table_lvl2_kernel[512]; +__attribute__((aligned(4096))) uint64_t page_table_lvl2_fb[512]; + +#define PAGE_SIZE 0x00200000 +#define FLAG_PRESENT 0x1 +#define FLAG_WRITABLE 0x2 +#define FLAG_HUGE 0x80 + +void init_paging(void) +{ + page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE; + page_table_lvl3[0] = (uint64_t)page_table_lvl2_kernel + FLAG_PRESENT + FLAG_WRITABLE; + page_table_lvl3[3] = (uint64_t)page_table_lvl2_fb + FLAG_PRESENT + FLAG_WRITABLE; + + // 0x00000000 - 0x00400000 : 0x00000000 - 0x00400000 + for (uint64_t i = 0; i < 2; i++) { + page_table_lvl2_kernel[i] = i * PAGE_SIZE + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE; + } + + // TODO: remove initial mapping for fb and instead page on demand + + // 0xe0000000 - 0xffffffff : 0xe0000000 - 0xffffffff + for (uint64_t i = 0; i < 512; i++) { + page_table_lvl2_fb[i] = i * PAGE_SIZE + 0xc0000000 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE; + } + + load_pt_lvl4(page_table_lvl4); +} diff --git a/kernel/src/mem/paging_asm.S b/kernel/src/mem/paging_asm.S new file mode 100644 index 0000000..5a1dcf7 --- /dev/null +++ b/kernel/src/mem/paging_asm.S @@ -0,0 +1,12 @@ +.section .text + +.global load_pt_lvl4 +load_pt_lvl4: + push %rbp + mov %rsp, %rbp + + mov %rdi, %cr3 + + mov %rbp, %rsp + pop %rbp + ret |
