From e03cdea153f38d8b46a736b524ba36ae0cba08ab Mon Sep 17 00:00:00 2001 From: fslongjin Date: Mon, 25 Apr 2022 16:13:52 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/exception/irq.c | 2 ++ kernel/exception/irq.h | 4 ++-- kernel/mm/mm.c | 16 +++++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/kernel/exception/irq.c b/kernel/exception/irq.c index 3bf65810..41471351 100644 --- a/kernel/exception/irq.c +++ b/kernel/exception/irq.c @@ -11,6 +11,8 @@ #include "../common/printk.h" #include "gate.h" + + // 保存函数调用现场的寄存器 #define SAVE_ALL_REGS \ "cld; \n\t" \ diff --git a/kernel/exception/irq.h b/kernel/exception/irq.h index 0289f1dc..30fc9ffc 100644 --- a/kernel/exception/irq.h +++ b/kernel/exception/irq.h @@ -126,10 +126,10 @@ typedef struct } irq_desc_t; #define IRQ_NUM 24 +// 这两个表一定要放在这里,否则在HPET初始化后收到中断,会产生page fault irq_desc_t interrupt_desc[IRQ_NUM] = {0}; - -irq_desc_t SMP_IPI_desc[SMP_IRQ_NUM]; +irq_desc_t SMP_IPI_desc[SMP_IRQ_NUM] = {0}; /** * @brief 中断注册函数 diff --git a/kernel/mm/mm.c b/kernel/mm/mm.c index e9cdfb75..116669fe 100644 --- a/kernel/mm/mm.c +++ b/kernel/mm/mm.c @@ -16,10 +16,11 @@ void mm_init() memory_management_struct.kernel_data_end = (ul)&_edata; memory_management_struct.kernel_end = (ul)&_end; - struct multiboot_mmap_entry_t *mb2_mem_info; + struct multiboot_mmap_entry_t mb2_mem_info[512]; int count; - multiboot2_iter(multiboot2_get_memory, mb2_mem_info, &count); + multiboot2_iter(multiboot2_get_memory, mb2_mem_info, &count); + for (int i = 0; i < count; ++i) { //可用的内存 @@ -27,15 +28,15 @@ void mm_init() Total_Memory += mb2_mem_info->len; // 保存信息到mms - memory_management_struct.e820[i].BaseAddr = mb2_mem_info->addr; - memory_management_struct.e820[i].Length = mb2_mem_info->len; - memory_management_struct.e820[i].type = mb2_mem_info->type; + memory_management_struct.e820[i].BaseAddr = mb2_mem_info[i].addr; + memory_management_struct.e820[i].Length = mb2_mem_info[i].len; + memory_management_struct.e820[i].type = mb2_mem_info[i].type; memory_management_struct.len_e820 = i; - ++mb2_mem_info; + // 脏数据 - if (mb2_mem_info->type > 4 || mb2_mem_info->len == 0 || mb2_mem_info->type < 1) + if (mb2_mem_info[i].type > 4 || mb2_mem_info[i].len == 0 || mb2_mem_info[i].type < 1) break; } printk("[ INFO ] Total amounts of RAM : %ld bytes\n", Total_Memory); @@ -200,6 +201,7 @@ void mm_init() kinfo("Memory management unit initialize complete!"); + flush_tlb(); // 初始化slab内存池 slab_init();