Kaynağa Gözat

:bug: 创建页表时未清零内存空间

fslongjin 3 yıl önce
ebeveyn
işleme
c2d8e88617

+ 1 - 1
kernel/driver/interrupt/apic/apic.c

@@ -507,7 +507,7 @@ void do_IRQ(struct pt_regs *rsp, ul number)
         kBUG("current_pcb->preempt_count<0! pid=%d", current_pcb->pid); // should not be here
 
     // 检测当前进程是否可被调度
-    if (current_pcb->flags & PROC_NEED_SCHED && proc_current_cpu_id == 1)
+    if (current_pcb->flags & PROC_NEED_SCHED)
     {
         sched_cfs();
     }

+ 1 - 1
kernel/driver/timers/HPET/HPET.c

@@ -59,7 +59,7 @@ void HPET_handler(uint64_t number, uint64_t param, struct pt_regs *regs)
 
         // 将HEPT中断消息转发到ap:1处理器
         ipi_send_IPI(DEST_PHYSICAL, IDLE, ICR_LEVEL_DE_ASSERT, EDGE_TRIGGER, 0xc8,
-                     ICR_APIC_FIXED, ICR_No_Shorthand, true, 1);
+                     ICR_APIC_FIXED, ICR_ALL_EXCLUDE_Self, true, 0);
 
         // 若当前时间比定时任务的时间间隔大,则进入中断下半部
         if (container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list)->expire_jiffies <= timer_jiffies)

+ 2 - 1
kernel/main.c

@@ -147,7 +147,8 @@ void system_initialize()
     
 
     //process_init();
-
+    current_pcb->cpu_id = 0;
+    current_pcb->preempt_count = 0;
     HPET_init();
 
 

+ 17 - 11
kernel/mm/mm.c

@@ -164,8 +164,8 @@ void mm_init()
         if (z->zone_addr_start >= 0x100000000 && (!ZONE_UNMAPPED_INDEX))
             ZONE_UNMAPPED_INDEX = i;
     }
-    //kdebug("ZONE_DMA_INDEX=%d\tZONE_NORMAL_INDEX=%d\tZONE_UNMAPPED_INDEX=%d", ZONE_DMA_INDEX, ZONE_NORMAL_INDEX, ZONE_UNMAPPED_INDEX);
-    // 设置内存页管理结构的地址,预留了一段空间,防止内存越界。
+    // kdebug("ZONE_DMA_INDEX=%d\tZONE_NORMAL_INDEX=%d\tZONE_UNMAPPED_INDEX=%d", ZONE_DMA_INDEX, ZONE_NORMAL_INDEX, ZONE_UNMAPPED_INDEX);
+    //  设置内存页管理结构的地址,预留了一段空间,防止内存越界。
     memory_management_struct.end_of_struct = (ul)((ul)memory_management_struct.zones_struct + memory_management_struct.zones_struct_len + sizeof(long) * 32) & (~(sizeof(long) - 1));
 
     // printk_color(ORANGE, BLACK, "code_start:%#18lx, code_end:%#18lx, data_end:%#18lx, kernel_end:%#18lx, end_of_struct:%#18lx\n",
@@ -174,7 +174,7 @@ void mm_init()
     // 初始化内存管理单元结构所占的物理页的结构体
 
     ul mms_max_page = (virt_2_phys(memory_management_struct.end_of_struct) >> PAGE_2M_SHIFT); // 内存管理单元所占据的序号最大的物理页
-    //kdebug("mms_max_page=%ld", mms_max_page);
+    // kdebug("mms_max_page=%ld", mms_max_page);
 
     struct Page *tmp_page = NULL;
     ul page_num;
@@ -191,20 +191,20 @@ void mm_init()
 
     global_CR3 = get_CR3();
     // root_page_table_phys_addr = global_CR3;
-    //kdebug("global_CR3\t:%#018lx", global_CR3);
-    //kdebug("*global_CR3\t:%#018lx", *phys_2_virt(global_CR3) & (~0xff));
-    //kdebug("**global_CR3\t:%#018lx", *phys_2_virt(*phys_2_virt(global_CR3) & (~0xff)) & (~0xff));
+    // kdebug("global_CR3\t:%#018lx", global_CR3);
+    // kdebug("*global_CR3\t:%#018lx", *phys_2_virt(global_CR3) & (~0xff));
+    // kdebug("**global_CR3\t:%#018lx", *phys_2_virt(*phys_2_virt(global_CR3) & (~0xff)) & (~0xff));
 
-    //kdebug("1.memory_management_struct.bmp:%#018lx\tzone->count_pages_using:%d\tzone_struct->count_pages_free:%d", *memory_management_struct.bmp, memory_management_struct.zones_struct->count_pages_using, memory_management_struct.zones_struct->count_pages_free);
-    //kinfo("Cleaning page table remapping at 0x0000");
+    // kdebug("1.memory_management_struct.bmp:%#018lx\tzone->count_pages_using:%d\tzone_struct->count_pages_free:%d", *memory_management_struct.bmp, memory_management_struct.zones_struct->count_pages_using, memory_management_struct.zones_struct->count_pages_free);
+    // kinfo("Cleaning page table remapping at 0x0000");
 
     kinfo("Memory management unit initialize complete!");
 
     flush_tlb();
     // 初始化slab内存池
     slab_init();
-    init_frame_buffer();
     page_table_init();
+    init_frame_buffer();
 }
 
 /**
@@ -497,6 +497,7 @@ void init_frame_buffer()
     if (*tmp == 0)
     {
         ul *virt_addr = kmalloc(PAGE_4K_SIZE, 0);
+        memset(virt_addr, 0, PAGE_4K_SIZE);
         set_pml4t(tmp, mk_pml4t(virt_2_phys(virt_addr), PAGE_KERNEL_PGT));
     }
 
@@ -505,6 +506,7 @@ void init_frame_buffer()
     if (*tmp == 0)
     {
         ul *virt_addr = kmalloc(PAGE_4K_SIZE, 0);
+        memset(virt_addr, 0, PAGE_4K_SIZE);
         set_pdpt(tmp, mk_pdpt(virt_2_phys(virt_addr), PAGE_KERNEL_DIR));
     }
 
@@ -541,6 +543,7 @@ void mm_map_phys_addr(ul virt_addr_start, ul phys_addr_start, ul length, ul flag
     if (*tmp == 0)
     {
         ul *virt_addr = kmalloc(PAGE_4K_SIZE, 0);
+        memset(virt_addr, 0, PAGE_4K_SIZE);
         set_pml4t(tmp, mk_pml4t(virt_2_phys(virt_addr), PAGE_KERNEL_PGT));
     }
 
@@ -549,6 +552,7 @@ void mm_map_phys_addr(ul virt_addr_start, ul phys_addr_start, ul length, ul flag
     if (*tmp == 0)
     {
         ul *virt_addr = kmalloc(PAGE_4K_SIZE, 0);
+        memset(virt_addr, 0, PAGE_4K_SIZE);
         set_pdpt(tmp, mk_pdpt(virt_2_phys(virt_addr), PAGE_KERNEL_DIR));
     }
 
@@ -575,20 +579,22 @@ void mm_map_phys_addr_user(ul virt_addr_start, ul phys_addr_start, ul length, ul
     if (*tmp == 0)
     {
         ul *virt_addr = kmalloc(PAGE_4K_SIZE, 0);
+        memset(virt_addr, 0, PAGE_4K_SIZE);
         set_pml4t(tmp, mk_pml4t(virt_2_phys(virt_addr), PAGE_USER_PGT));
     }
     else
-        kdebug("*tmp != 0!!!    \t tmp = %#018lx\t *tmp = %#018lx",tmp, *tmp);
+        kdebug("*tmp != 0!!!    \t tmp = %#018lx\t *tmp = %#018lx", tmp, *tmp);
 
     tmp = phys_2_virt((ul *)(*tmp & (~0xfffUL)) + ((virt_addr_start >> PAGE_1G_SHIFT) & 0x1ff));
 
     if (*tmp == 0)
     {
         ul *virt_addr = kmalloc(PAGE_4K_SIZE, 0);
+        memset(virt_addr, 0, PAGE_4K_SIZE);
         set_pdpt(tmp, mk_pdpt(virt_2_phys(virt_addr), PAGE_USER_DIR));
     }
     else
-        kdebug("*tmp != 0!!!    \t tmp = %#018lx\t *tmp = %#018lx",tmp, *tmp);
+        kdebug("*tmp != 0!!!    \t tmp = %#018lx\t *tmp = %#018lx", tmp, *tmp);
 
     ul *tmp1;
     // 初始化2M物理页

+ 4 - 2
kernel/process/process.h

@@ -211,7 +211,8 @@ struct process_control_block *get_current_pcb()
 #define switch_proc(prev, next)                                                                     \
 	do                                                                                              \
 	{                                                                                               \
-		__asm__ __volatile__("pushq	%%rbp	\n\t"                                                     \
+		__asm__ __volatile__("cli	\n\t"                                                             \
+							 "pushq	%%rbp	\n\t"                                                     \
 							 "pushq	%%rax	\n\t"                                                     \
 							 "movq	%%rsp,	%0	\n\t"                                                  \
 							 "movq	%2,	%%rsp	\n\t"                                                  \
@@ -222,6 +223,7 @@ struct process_control_block *get_current_pcb()
 							 "1:	\n\t"                                                              \
 							 "popq	%%rax	\n\t"                                                      \
 							 "popq	%%rbp	\n\t"                                                      \
+							 "sti	\n\t"                                                             \
 							 : "=m"(prev->thread->rsp), "=m"(prev->thread->rip)                     \
 							 : "m"(next->thread->rsp), "m"(next->thread->rip), "D"(prev), "S"(next) \
 							 : "memory");                                                           \
@@ -249,7 +251,7 @@ unsigned long do_fork(struct pt_regs *regs, unsigned long clone_flags, unsigned
 
 extern unsigned long head_stack_start; // 导出内核层栈基地址(定义在head.S)
 extern ul _stack_start;
-extern void ret_from_intr(void);   // 导出从中断返回的函数(定义在entry.S)
+extern void ret_from_intr(void); // 导出从中断返回的函数(定义在entry.S)
 
 extern struct tss_struct initial_tss[MAX_CPU_NUM];
 extern struct mm_struct initial_mm;

+ 3 - 1
kernel/sched/sched.c

@@ -50,7 +50,7 @@ void sched_cfs_enqueue(struct process_control_block *pcb)
  */
 void sched_cfs()
 {
-
+    
     current_pcb->flags &= ~PROC_NEED_SCHED;
     struct process_control_block *proc = sched_cfs_dequeue();
 
@@ -107,6 +107,8 @@ void sched_cfs()
  */
 void sched_update_jiffies()
 {
+    if(current_pcb->cpu_id == 0)
+        return;
     switch (current_pcb->priority)
     {
     case 0:

+ 1 - 1
kernel/smp/smp.c

@@ -153,7 +153,7 @@ void smp_ap_start()
     current_pcb->preempt_count = 0;
     sti();
 
-    if (proc_current_cpu_id == 1)
+    if (proc_current_cpu_id == 2)
         process_init();
     while (1)
     {