diff --git a/kernel/driver/interrupt/apic/apic.c b/kernel/driver/interrupt/apic/apic.c index 14241e8d..da30d044 100644 --- a/kernel/driver/interrupt/apic/apic.c +++ b/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(); } diff --git a/kernel/driver/timers/HPET/HPET.c b/kernel/driver/timers/HPET/HPET.c index a055c84e..fa4a42b4 100644 --- a/kernel/driver/timers/HPET/HPET.c +++ b/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) diff --git a/kernel/main.c b/kernel/main.c index 5ac73e97..7461d5f0 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -147,7 +147,8 @@ void system_initialize() //process_init(); - + current_pcb->cpu_id = 0; + current_pcb->preempt_count = 0; HPET_init(); diff --git a/kernel/mm/mm.c b/kernel/mm/mm.c index 5ad76158..76c2e612 100644 --- a/kernel/mm/mm.c +++ b/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物理页 diff --git a/kernel/process/process.h b/kernel/process/process.h index a7bf3f7e..0c7192a5 100644 --- a/kernel/process/process.h +++ b/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; diff --git a/kernel/sched/sched.c b/kernel/sched/sched.c index ab27bf0b..c43e17db 100644 --- a/kernel/sched/sched.c +++ b/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: diff --git a/kernel/smp/smp.c b/kernel/smp/smp.c index 2c51bb61..dc89b297 100644 --- a/kernel/smp/smp.c +++ b/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) {