fixes and refinements
authorMinep <zelong56@gmail.com>
Sat, 26 Feb 2022 16:34:49 +0000 (16:34 +0000)
committerMinep <zelong56@gmail.com>
Sat, 26 Feb 2022 16:34:49 +0000 (16:34 +0000)
lunaix-os/.gitignore
lunaix-os/arch/x86/boot.S
lunaix-os/kernel/asm/x86/prologue.S
lunaix-os/kernel/k_main.c
lunaix-os/kernel/mm/pmm.c
lunaix-os/kernel/mm/vmm.c
lunaix-os/kernel/tty/tty.c
lunaix-os/linker.ld

index a92c714f805658528d7699b36ac715fbf8401061..b43f0b57c25507390b3d6e16b933610ec2074ed7 100644 (file)
@@ -1,3 +1,4 @@
 build/
 playground/
 .vscode/settings.json
+.VSCodeCounter/
\ No newline at end of file
index bc1eec2758345b99b985c6a86f138480a72d9dbc..5f832aa34038364f2f202e084b379d779a8c1116 100644 (file)
@@ -57,9 +57,7 @@
 
         /*
             _hhk_init用来初始化我们高半核:
-                    1. 设置GDT表
-                    2. 设置IDT表(暂时,以后会拿到 kernel_init 里面)
-                    3. 初始化最简单的PTD与PT(重新映射我们的内核至3GiB处,以及对相应的地方进行Identity Map)
+                1. 初始化最简单的PD与PT(重新映射我们的内核至3GiB处,以及对相应的地方进行Identity Map)
         */
 
         movl $(KPG_SIZE), 4(%esp)
index 4e114e9c50153c1f8d1370aa05521a4129e615dd..0716b4898b76078ba2888be16882ced6d443d117 100644 (file)
         movl $mb_info, (%esp)
         call _kernel_init
 
+        /* 
+            加载新的栈指针,位于0xffbfffff,但因为16字节对齐的需求,低四位清零。
+            为什么不是0xffffffff? 因为0xffc00000 - 0xffffffff 这4MiB的空间用于
+            对页表与页目录的循环映射。
+        */
+        mov $0xffbffff0, %esp
+
+        call _kernel_post_init
+
+        subl $6, %esp
+
         # 加载 IDT
         movl $_idt, 2(%esp)
         movw _idt_limit, %ax
         movw %ax, (%esp)
         lidt (%esp)
 
-        /* 
-            加载新的栈指针,位于0xffbfffff,但因为16字节对齐的需求,低四位清零。
-            为什么不是0xffffffff? 因为0xffc00000 - 0xffffffff 这4MiB的空间用于
-            对页表与页目录的循环映射。
-        */
-        mov $0xffbffff0, %esp     
+        addl $6, %esp
 
         /* 进入内核 */  
         call _kernel_main
index 8634443b3b5d037f18936bf1f97b380cba9ee292..3a7e200f562e1d8ed15e9705c01e7c42dcb82f59 100644 (file)
@@ -33,20 +33,24 @@ _kernel_init(multiboot_info_t* mb_info)
     //   ( )    + 映射 memory map (APCI,APIC,IO映射) (以后)
     //   (v)    + 释放 hhk_init 所占据的空间
 
+#pragma region INIT_MM
     // 初始化物理内存管理器
     pmm_init(MEM_1MB + mb_info->mem_upper << 10);
     vmm_init();
-    tty_init(VGA_BUFFER_PADDR);
+#pragma endregion
 
+    // 初始化VGA
+    tty_init(VGA_BUFFER_PADDR);
     tty_set_theme(VGA_COLOR_GREEN, VGA_COLOR_BLACK);
 
-    printf("[KERNEL] Initializing Memory ...\n");
+    printf("[KERNEL] === Initialization === \n");
     unsigned int map_size =
       mb_info->mmap_length / sizeof(multiboot_memory_map_t);
     printf("[MM] Mem: %d KiB, Extended Mem: %d KiB\n",
            mb_info->mem_lower,
            mb_info->mem_upper);
 
+#pragma region MMAP_SCAN_RESERVING_KERNEL_PGS
     // 按照 Memory map 标识可用的物理页
     for (unsigned int i = 0; i < map_size; i++) {
         multiboot_memory_map_t mmap = map[i];
@@ -68,17 +72,8 @@ _kernel_init(multiboot_info_t* mb_info)
     size_t pg_count = (uintptr_t)(&__kernel_end - &__kernel_start) >> 12;
     pmm_mark_chunk_occupied(V2P(&__kernel_start) >> 12, pg_count);
     printf("[MM] Allocated %d pages for kernel.\n", pg_count);
-
-
-    size_t hhk_init_pg_count = ((uintptr_t)(&__init_hhk_end)) >> 12;
-    printf("[MM] Releaseing %d pages from 0x0.\n", hhk_init_pg_count);
-
-    // 清除 hhk_init 与前1MiB的映射
-    // 从这里开始,到新的vga缓存地址设置前,不能够进行任何的打印操作
-    for (size_t i = 0; i < hhk_init_pg_count; i++) {
-        vmm_unmap_page((i << 12));
-    }
-
+#pragma endregion
+    
     size_t vga_buf_pgs = VGA_BUFFER_SIZE >> 12;
     
     // 首先,标记VGA部分为已占用
@@ -101,7 +96,20 @@ _kernel_init(multiboot_info_t* mb_info)
     }
     printf("[MM] Allocated %d pages for stack start at %p\n", K_STACK_SIZE>>12, K_STACK_START);
 
-    printf("[KERNEL] Done!\n\n");
+    printf("[KERNEL] === Initialization Done === \n\n");
+}
+
+void
+_kernel_post_init() {
+    printf("[KERNEL] === Post Initialization === \n");
+    size_t hhk_init_pg_count = ((uintptr_t)(&__init_hhk_end)) >> 12;
+    printf("[MM] Releaseing %d pages from 0x0.\n", hhk_init_pg_count);
+
+    // 清除 hhk_init 与前1MiB的映射
+    for (size_t i = 0; i < hhk_init_pg_count; i++) {
+        vmm_unmap_page((i << 12));
+    }
+    printf("[KERNEL] === Post Initialization Done === \n\n");
 }
 
 void
index c6b0a25b7dd77cf39fa8f7fd8aa113b52c45a0c8..47087fdd3dad383b518d547137e9a1a68162f67e 100644 (file)
@@ -17,6 +17,8 @@ uint8_t pm_bitmap[PM_BMP_MAX_SIZE];
 
 uintptr_t max_pg;
 
+//  ... |xxxx xxxx |
+//  ... |-->|
 void
 pmm_mark_page_free(uintptr_t ppn)
 {
@@ -77,7 +79,7 @@ size_t pg_lookup_ptr;
 void
 pmm_init(uintptr_t mem_upper_lim)
 {
-    max_pg = (PG_ALIGN(mem_upper_lim) >> 12) + 1;
+    max_pg = (PG_ALIGN(mem_upper_lim) >> 12);
 
     pg_lookup_ptr = LOOKUP_START;
 
index aaaf54cf6ed245b5891bd658158bbdcc97fc0441..364332e186ee7621ecea955a90f64030c21c5dbc 100644 (file)
@@ -54,11 +54,11 @@ void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
 
     uintptr_t pd_offset = PD_INDEX(va);
     uintptr_t pt_offset = PT_INDEX(va);
-    ptd_t* ptd = PTD_BASE_VADDR;
+    ptd_t* ptd = (ptd_t*)PTD_BASE_VADDR;
 
     // 在页表与页目录中找到一个可用的空位进行映射(位于va或其附近)
     ptd_t* pde = ptd[pd_offset];
-    pt_t* pt = (uintptr_t)(PT_BASE_VADDR | (pd_offset << 12));
+    pt_t* pt = (uintptr_t)PT_VADDR(pd_offset);
     while (pde && pd_offset < 1024) {
         if (pt_offset == 1024) {
             pd_offset++;
@@ -88,8 +88,8 @@ void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
     }
     
     ptd[pd_offset] = PDE(dattr, new_pt_pa);
-    memset((void*)PT_VADDR(pd_offset), 0, PM_PAGE_SIZE);
     
+    memset((void*)PT_VADDR(pd_offset), 0, PM_PAGE_SIZE);
     pt[pt_offset] = PTE(tattr, pa);
 
     return V_ADDR(pd_offset, pt_offset, PG_OFFSET(va));
index cb4e13a1d21954182363b280b2ca84c1d6bf6487..325595edbef5db11f0780fc87a19c46df937cacc 100644 (file)
@@ -69,11 +69,11 @@ void
 tty_scroll_up()
 {
     size_t last_line = TTY_WIDTH * (TTY_HEIGHT - 1);
-    memcpy(tty_vga_buffer, tty_vga_buffer + TTY_WIDTH, last_line);
+    memcpy(tty_vga_buffer, tty_vga_buffer + TTY_WIDTH, last_line * 2);
     for (size_t i = 0; i < TTY_WIDTH; i++) {
         *(tty_vga_buffer + i + last_line) = tty_theme_color;
     }
-    tty_y = tty_y == 0 ? 0 : tty_y - 1;
+    tty_y = tty_y == 0 ? 0 : TTY_HEIGHT - 1;
 }
 
 void
index f0eebd51673bd481992abca7caa72b8d44d65edd..bac8600d93978b4612ff598dde819fe7766f18fa 100644 (file)
@@ -1,10 +1,10 @@
 ENTRY(start_)
 
 /*
-    FUTURE: Use dynamic linker to separate kernel and boot code
+    FUTURE: Use disk reader
     A bit of messy here.
     We will pull our higher half kernel out of this shit
-      and load it separately once we have our dynamic linker ready.
+      and load it separately once we have our disk reader.
 */
 
 SECTIONS {
@@ -29,7 +29,7 @@ SECTIONS {
     .hhk_init_rodata BLOCK(4K) : {
         build/obj/arch/x86/*.o (.rodata)
     }
-    __init_hhk_end = .;
+    __init_hhk_end = ALIGN(4K);
 
     /* Relocation of our higher half kernel */
     . += 0xC0000000;
@@ -38,24 +38,28 @@ SECTIONS {
     .text BLOCK(4K) : AT ( ADDR(.text) - 0xC0000000 ) {
         __kernel_start = .;
         build/obj/kernel/*.o (.text)
+        build/obj/hal/*.o (.text)
     }
 
     .bss BLOCK(4K) : AT ( ADDR(.bss) - 0xC0000000 ) {
         build/obj/kernel/*.o (.bss)
+        build/obj/hal/*.o (.bss)
     }
 
     .data BLOCK(4k) : AT ( ADDR(.data) - 0xC0000000 ) {
         build/obj/kernel/*.o (.data)
+        build/obj/hal/*.o (.data)
     }
 
     .rodata BLOCK(4K) : AT ( ADDR(.rodata) - 0xC0000000 ) {
         build/obj/kernel/*.o (.rodata)
+        build/obj/hal/*.o (.rodata)
     }
 
     .kpg BLOCK(4K) : AT ( ADDR(.kpg) - 0xC0000000 ) {
         build/obj/arch/x86/*.o (.kpg)
     }
 
-    __kernel_end = ALIGN(.);
-    __heap_start = ALIGN(.);    /* 内核结束的地方即堆开始的地方 */
+    __kernel_end = ALIGN(4K);
+    __heap_start = ALIGN(4K);    /* 内核结束的地方即堆开始的地方 */
 }
\ No newline at end of file