]> Zhao Yanbai Git Server - kernel.git/commitdiff
加快bootmem初始化
authoracevest <zhaoyanbai@126.com>
Thu, 4 Nov 2021 15:00:50 +0000 (23:00 +0800)
committeracevest <zhaoyanbai@126.com>
Thu, 4 Nov 2021 15:00:50 +0000 (23:00 +0800)
boot/boot.c
boot/multiboot.S
include/bits.h
include/processor.h
include/stdio.h
include/system.h
kernel/init.c
kernel/setup.c
mm/bootmem.c
scripts/link.ld

index 35b9fc46367f3c2f60d6d0d8f8f99bfdc6e9c284..f8feddc8bb55e2715f59b881a83891d1d6b32fa2 100644 (file)
@@ -60,3 +60,14 @@ void check_kernel(unsigned long addr, unsigned long magic) {
 
     init_boot_params(mbi);
 }
+
+extern void *kernel_begin;
+extern void *kernel_end;
+extern void *bootmem_bitmap_begin;
+void init_system_info() {
+    system.kernel_begin = &kernel_begin;
+    system.kernel_end = &kernel_end;
+    system.bootmem_bitmap_begin = &bootmem_bitmap_begin;
+
+    printk("kernel [%x, %x] bootmem bitmap: %x\n", system.kernel_begin, system.kernel_end, system.bootmem_bitmap_begin);
+}
index 2209b1eab0da306bb46040f3c628987c679cc8ef..e41297baeeaaea44cdc5674401af12063fd6f0a2 100644 (file)
@@ -20,6 +20,7 @@
 .global kernel_entry
 .global main
 .extern check_kernel 
+.extern init_system_info
 .extern setup_kernel
 .extern init_pgd
 .extern init_pgt
@@ -112,10 +113,12 @@ main:
 
     ljmp    $0x08,$Label
 Label:
-
-    call    check_kernel
-    addl    $8,%esp
     movl    $root_task + TASK_SIZE, %esp
+    
+    call    check_kernel
+
+    call    init_system_info
+
     call    setup_kernel
 
     movl    $root_task_entry, %eax
index 50f37fd5de345fd399184a6e656728ef5b3cbea1..c9389933e48ef88b66447b137c40fa51b992957b 100644 (file)
@@ -30,7 +30,7 @@
 
 static inline void btc(unsigned int *v, unsigned int b) { asm("btc %1,%0" : "=m"(*v) : "Ir"(b)); }
 
-static inline int test_and_set_bit(long nr, volatile unsigned long *addr) {
+static inline int test_and_set_bit(unsigned int nr, volatile unsigned long *addr) {
     int oldbit;
 
     asm("bts %2,%1\n\t"
@@ -40,7 +40,7 @@ static inline int test_and_set_bit(long nr, volatile unsigned long *addr) {
     return oldbit;
 }
 
-static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) {
+static inline int test_and_clear_bit(unsigned int nr, volatile unsigned long *addr) {
     int oldbit;
 
     asm volatile(
index a35db2cd4a8db663491504f184a413b7c50dea6f..eda56f25d3a14bc29ab689592ea8b23960af2b91 100644 (file)
@@ -102,10 +102,7 @@ extern Desc gdt[NGDT];
 #define TRAP_GATE 0x0F  // Keep  'IF' bit.
 #define TSS_DESC 0x09
 
-static inline void _init_desc(pDesc desc) {
-    if (0xc010a1c8 == (unsigned long)desc) asm("xchg %bx,%bx");
-    memset((char *)desc, 0, sizeof(Desc));
-}
+static inline void _init_desc(pDesc desc) { memset((char *)desc, 0, sizeof(Desc)); }
 
 static inline Desc _create_seg(u8 type, u8 DPL) {
     Desc d;
index b6ba90ddde350b7118ab53351110cacd3c3d255c..042c2690f2ff37d49950f2431256d565dd035a95 100644 (file)
@@ -24,9 +24,6 @@ static inline int printf(const char *fmt, ...) {
     char ptfbuf[512];
     char *args = (char *)(((char *)&fmt) + 4);
     vsprintf(ptfbuf, fmt, args);
-
-    // asm("xchg %bx,%bx;");
-
     return write(0, ptfbuf, strlen(ptfbuf));
 }
 
index 8c0de389d87affd45a0775cd706332b73954427f..8ce574abccb4dc2a39553c900dbe4cb28eaf414c 100644 (file)
@@ -143,7 +143,9 @@ typedef struct system {
     u32 *pte_start;
     u32 *pte_end;
 
-    u32 kernel_end;
+    void *kernel_begin;
+    void *kernel_end;
+    void *bootmem_bitmap_begin;
 
     // +-------+-------+-------+-------+
     // | drive | part1 | part2 | part3 |
index 3a6dd76b3f6fbd99f81f2429b5b3ffbeb7d06aec..e3dfa51715f73172a19412b6a50c0ec6323282ec 100644 (file)
@@ -28,7 +28,7 @@ char idtr[6] __attribute__((__aligned__(4)));
 #define __ring3bss__ __attribute__((__section__(".ring3.bss"), __aligned__(PAGE_SIZE)))
 
 char __ring3data__ ring3_stack[PAGE_SIZE] = {0};
-char __ring3bss__ ring3_stack[PAGE_SIZE];
+char __ring3bss__ ring3_bss[PAGE_SIZE + 1234];
 int ring3_sysctest();
 void __ring3text__ __attribute__((__aligned__(PAGE_SIZE))) ring3_entry() {
     while (1) {
@@ -61,7 +61,6 @@ void user_task_entry() {
     unsigned long *pt_bss_page = (unsigned long *)(alloc_one_page(0));
     unsigned long *p = (unsigned long *)(pa2va(current->cr3));
 
-    // asm volatile("xchg %%bx, %%bx;mov %%eax, %%ebx;xchg %%bx, %%bx;"::"a"(p));
     printk("page dir : %x %x %x %x\n", p, pt_text_page, ring3_text_page);
     printk("pt bss page %x %x", pt_bss_page, ring3_bss_page);
 
@@ -85,7 +84,6 @@ void user_task_entry() {
     // 现在要准备返回用户态
     // eip --> edx
     // esp --> ecx
-    asm volatile("xchg %bx, %bx");
     asm volatile("sysexit;" ::"d"(0x08000000), "c"(0x30000000 + PAGE_SIZE - 100));
 }
 
index fcddc9d8ff1859443bd41346683d8935d919901b..606192e9a274a9f1e7ca4156c31b54ef0f3aeaa2 100644 (file)
@@ -56,14 +56,12 @@ const char *version = "Kernel version " VERSION " @ " BUILDER
                       "\n";
 
 void setup_kernel() {
-    extern char kernel_begin, kernel_end;
-
     vga_init();
 
-    printk("kernel: %08x - %08x\n", &kernel_begin, &kernel_end);
-
     init_mm();
 
+    // printk("kernel: %08x - %08x\n", system.kernel_begin, system.kernel_end);
+
     setup_gdt();
     setup_idt();
     setup_gate();
index 99c52e544a5e798fc9ea67e2c615195d3b0d2cad..597a593769f4d44dd4016e9d0fd02bae107ec319 100644 (file)
@@ -9,10 +9,9 @@
 #include <boot.h>
 #include <mm.h>
 #include <printk.h>
+#include <string.h>
 #include <system.h>
 
-extern char kernel_begin, kernel_end;
-
 static void e820_print_type(unsigned long type) {
     switch (type) {
     case E820_RAM:
@@ -36,6 +35,32 @@ static void e820_print_type(unsigned long type) {
     }
 }
 
+// op: 0 clear bit, 1 set bit
+void fast_init_bootmem_bitmap(unsigned long bgn_pfn, unsigned long end_pfn, int op) {
+    int (*bit_func)(unsigned int, volatile unsigned long *);
+
+    bit_func = op == 0 ? test_and_clear_bit : test_and_set_bit;
+
+    u8 data = op == 0 ? 0x00 : 0xFF;
+
+    // 先设置头部不是从单个字节开始的比特
+    unsigned int i = 0;  // 这个变更不能放到for循环里定义
+    for (i = bgn_pfn; i < end_pfn && (i % 8 != 0); i++) {
+        bit_func(i, bootmem_data.bitmap);
+    }
+
+    // 算出中间的整字节数
+    unsigned int bytes = (end_pfn - i) / 8;
+
+    // 直接清零
+    memset((char *)(bootmem_data.bitmap) + (i / 8), data, bytes);
+
+    // 最后设置尾部不是整字节的比特
+    for (i += bytes * 8; i < end_pfn; i++) {
+        bit_func(i, bootmem_data.bitmap);
+    }
+}
+
 void e820_print_map() {
     unsigned int i = 0;
 
@@ -108,22 +133,7 @@ void register_bootmem_pages() {
 
 #if 1
         // 用一个相对快的方式
-        // 先设置头部不是从单个字节开始的比特
-        unsigned int j = 0;  // 这个变更不能放到for循环里定义
-        for (j = bgn_pfn; j < end_pfn && (j % 8 != 0); j++) {
-            test_and_clear_bit(j, bootmem_data.bitmap);
-        }
-
-        // 算出中间的整字节数
-        unsigned int bytes = (end_pfn - j) / 8;
-
-        // 直接清零
-        memset((char *)(bootmem_data.bitmap) + (j / 8), 0x00, bytes);
-
-        // 最后设置尾部不是整字节的比特
-        for (j += bytes * 8; j < end_pfn; j++) {
-            test_and_clear_bit(j, bootmem_data.bitmap);
-        }
+        fast_init_bootmem_bitmap(bgn_pfn, end_pfn, 0);
 #else
         for (unsigned int j = bgn_pfn; j < end_pfn; j++) {
             test_and_clear_bit(j, bootmem_data.bitmap);
@@ -133,18 +143,18 @@ void register_bootmem_pages() {
 }
 
 void reserve_bootmem(unsigned long bgn_pfn, unsigned long end_pfn) {
-    // printk("reserve %d %d\n", bgn_pfn, end_pfn);
-
+#if 1
+    // 用一个相对快的方式
+    fast_init_bootmem_bitmap(bgn_pfn, end_pfn, 1);
+#else
     int i = 0;
     for (i = bgn_pfn; i < end_pfn; ++i) {
         test_and_set_bit(i, bootmem_data.bitmap);
     }
+#endif
 }
 
-void reserve_kernel_pages() {
-    reserve_bootmem(PFN_DW(va2pa(&kernel_begin)), PFN_UP(va2pa(&kernel_end)));
-    // reserve_bootmem(0, PFN_UP(va2pa(&kernel_end)));
-}
+void reserve_kernel_pages() { reserve_bootmem(PFN_DW(va2pa(system.kernel_begin)), PFN_UP(va2pa(system.kernel_end))); }
 
 void reserve_bootmem_bitmap() {
     unsigned long bgn_pfn = PFN_DW(va2pa(bootmem_data.bitmap));
@@ -157,7 +167,7 @@ void reserve_bootmem_bitmap() {
 void init_bootmem_allocator() {
     int mapsize = (bootmem_data.max_pfn + 7) / 8;
 
-    bootmem_data.bitmap = &kernel_end;
+    bootmem_data.bitmap = system.bootmem_bitmap_begin;
     bootmem_data.mapsize = mapsize;
 
     memset(bootmem_data.bitmap, 0xFF, mapsize);
index 1f9d6f08b555b8a9438804d9b77967707633f0d5..df9ce8067949796fd665bbb7454bfbe2ba3b8411 100644 (file)
@@ -53,30 +53,24 @@ SECTIONS
     .ring3.text : AT(phys_addr) ALIGN(0x1000)
     {
         phys_addr = . - kernel_virtual_addr_start;
-       *(.ring3.text);
+           *(.ring3.text);
     }
 
     .ring3.data : AT(phys_addr) ALIGN(0x1000)
     {
         phys_addr = . - kernel_virtual_addr_start;
-       *(.ring3.data);
+           *(.ring3.data);
     }
 
     .ring3.bss : AT(phys_addr) ALIGN(0x1000)
     {
         phys_addr = . - kernel_virtual_addr_start;
-       *(.ring3.bss);
-    }
-
-
-    .init.data : AT(phys_addr) ALIGN(0x1000)
-    {
-        initdata = .;
-        phys_addr = . - kernel_virtual_addr_start;
-        *(.init.data);
+           *(.ring3.bss);
     }
 
     end = .;
     _end = .;
-    kernel_end = ALIGN(0x1000);
+    kernel_end = .;
+
+    bootmem_bitmap_begin = ALIGN(0x1000);
 }