From b7437b24d71bbcb2bfbc4ccbe4cdbdd89104baba Mon Sep 17 00:00:00 2001 From: fslongjin Date: Fri, 6 May 2022 11:44:53 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E9=A1=B5=E8=A1=A8=E6=8B=B7=E8=B4=9D?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/Makefile | 2 +- kernel/mm/mm.c | 7 ++---- kernel/process/process.c | 52 +++++++++++++++++++-------------------- kernel/sched/sched.c | 8 +++--- user/Makefile | 2 +- user/init.c | 5 ++++ user/sys_api_lib | Bin 13264 -> 0 bytes 7 files changed, 38 insertions(+), 38 deletions(-) delete mode 100644 user/sys_api_lib diff --git a/kernel/Makefile b/kernel/Makefile index 759e2ac1..d6b80e2c 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,6 +1,6 @@ SUBDIR_ROOTS := . common DIRS := . $(shell find $(SUBDIR_ROOTS) -type d) -GARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ kernel +GARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ kernel GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS))) DIR_LIB=lib diff --git a/kernel/mm/mm.c b/kernel/mm/mm.c index 6a2b5486..26cfe127 100644 --- a/kernel/mm/mm.c +++ b/kernel/mm/mm.c @@ -20,7 +20,7 @@ void mm_init() int count; multiboot2_iter(multiboot2_get_memory, mb2_mem_info, &count); - + for (int i = 0; i < count; ++i) { //可用的内存 @@ -33,8 +33,6 @@ void mm_init() memory_management_struct.e820[i].type = mb2_mem_info[i].type; memory_management_struct.len_e820 = i; - - // 脏数据 if (mb2_mem_info[i].type > 4 || mb2_mem_info[i].len == 0 || mb2_mem_info[i].type < 1) break; @@ -201,7 +199,6 @@ void mm_init() kinfo("Memory management unit initialize complete!"); - flush_tlb(); // 初始化slab内存池 slab_init(); @@ -624,7 +621,7 @@ void mm_map_phys_addr_user(ul virt_addr_start, ul phys_addr_start, ul length, ul */ void mm_map_proc_page_table(ul proc_page_table_addr, bool is_phys, ul virt_addr_start, ul phys_addr_start, ul length, ul flags, bool user) { - kdebug("proc_page_table_addr=%#018lx",proc_page_table_addr); + // kdebug("proc_page_table_addr=%#018lx", proc_page_table_addr); // 计算线性地址对应的pml4页表项的地址 ul *tmp; if (is_phys) diff --git a/kernel/process/process.c b/kernel/process/process.c index 7cc23bc3..c5f25f5d 100644 --- a/kernel/process/process.c +++ b/kernel/process/process.c @@ -12,7 +12,7 @@ #include spinlock_t process_global_pid_write_lock; // 增加pid的写锁 -long process_global_pid = 0; // 系统中最大的pid +long process_global_pid = 1; // 系统中最大的pid extern void system_call(void); extern void kernel_thread_func(void); @@ -371,7 +371,7 @@ ul do_execve(struct pt_regs *regs, char *path) regs->rflags = 0x200246; regs->rax = 1; regs->es = 0; - + kdebug("do_execve is running..."); // 当前进程正在与父进程共享地址空间,需要创建 @@ -427,15 +427,13 @@ ul do_execve(struct pt_regs *regs, char *path) // 清除进程的vfork标志位 current_pcb->flags &= ~PF_VFORK; + struct vfs_file_t *filp = process_open_exec_file(path); + if ((unsigned long)filp <= 0) + return (unsigned long)filp; - - struct vfs_file_t* filp = process_open_exec_file(path); - if((unsigned long)filp <= 0 ) - return (unsigned long)filp; - memset((void *)code_start_addr, 0, PAGE_2M_SIZE); uint64_t pos = 0; - int retval = filp->file_ops->read(filp, code_start_addr, PAGE_2M_SIZE, &pos); + int retval = filp->file_ops->read(filp, (char *)code_start_addr, PAGE_2M_SIZE, &pos); kdebug("execve ok"); return 0; @@ -587,12 +585,6 @@ void process_init() initial_proc_union.pcb.state = PROC_RUNNING; initial_proc_union.pcb.preempt_count = 0; initial_proc_union.pcb.cpu_id = 0; - // 获取新的进程的pcb - // struct process_control_block *p = container_of(list_next(¤t_pcb->list), struct process_control_block, list); - - // kdebug("Ready to switch..."); - // 切换到新的内核线程 - // switch_proc(current_pcb, p); } /** @@ -613,7 +605,7 @@ unsigned long do_fork(struct pt_regs *regs, unsigned long clone_flags, unsigned // 为新的进程分配栈空间,并将pcb放置在底部 tsk = (struct process_control_block *)kmalloc(STACK_SIZE, 0); - kdebug("struct process_control_block ADDRESS=%#018lx", (uint64_t)tsk); + // kdebug("struct process_control_block ADDRESS=%#018lx", (uint64_t)tsk); if (tsk == NULL) { @@ -799,7 +791,7 @@ uint64_t process_copy_mm(uint64_t clone_flags, struct process_control_block *pcb // 与父进程共享内存空间 if (clone_flags & CLONE_VM) { - kdebug("copy_vm\t\t current_pcb->mm->pgd=%#018lx", current_pcb->mm->pgd); + // kdebug("copy_vm\t current_pcb->mm->pgd=%#018lx", current_pcb->mm->pgd); pcb->mm = current_pcb->mm; return retval; @@ -819,46 +811,52 @@ uint64_t process_copy_mm(uint64_t clone_flags, struct process_control_block *pcb memset(phys_2_virt(new_mms->pgd), 0, PAGE_4K_SIZE / 2); // 拷贝内核空间的页表指针 - memcpy(phys_2_virt(new_mms->pgd) + 256, phys_2_virt(initial_proc[proc_current_cpu_id]) + 256, PAGE_4K_SIZE / 2); + memcpy(phys_2_virt(new_mms->pgd) + 256, phys_2_virt(initial_proc[proc_current_cpu_id]->mm->pgd) + 256, PAGE_4K_SIZE / 2); - pml4t_t *current_pgd = (pml4t_t *)phys_2_virt(current_pcb->mm->pgd); + uint64_t *current_pgd = (uint64_t *)phys_2_virt(current_pcb->mm->pgd); + uint64_t *new_pml4t = (uint64_t *)phys_2_virt(new_mms->pgd); // 迭代地拷贝用户空间 for (int i = 0; i <= 255; ++i) { // 当前页表项为空 - if ((current_pgd + i)->pml4t == 0) + if ((*(uint64_t *)(current_pgd + i)) == 0) continue; // 分配新的二级页表 pdpt_t *new_pdpt = (pdpt_t *)kmalloc(PAGE_4K_SIZE, 0); memset(new_pdpt, 0, PAGE_4K_SIZE); - // 在新的一级页表中设置新的二级页表表项 - set_pml4t((uint64_t *)(current_pgd + i), mk_pml4t(virt_2_phys(new_pdpt), ((current_pgd + i)->pml4t) & 0xfffUL)); - pdpt_t *current_pdpt = (pdpt_t *)phys_2_virt((current_pgd + i)->pml4t & (~0xfffUL)); - // 设置二级页表 + // 在新的一级页表中设置新的二级页表表项 + set_pml4t(new_pml4t + i, mk_pml4t(virt_2_phys(new_pdpt), (*(current_pgd + i)) & 0xfffUL)); + + pdpt_t *current_pdpt = (pdpt_t *)phys_2_virt(*(uint64_t *)(current_pgd + i) & (~0xfffUL)); + + // kdebug("current pdpt=%#018lx \t (current_pgd + i)->pml4t=%#018lx", current_pdpt, *(uint64_t *)(current_pgd+i)); + // 设置二级页表 for (int j = 0; j < 512; ++j) { - if ((current_pdpt + j)->pdpt == 0) + if (*(uint64_t *)(current_pdpt + j) == 0) continue; + // 分配新的三级页表 pdt_t *new_pdt = (pdt_t *)kmalloc(PAGE_4K_SIZE, 0); memset(new_pdt, 0, PAGE_4K_SIZE); // 在新的二级页表中设置三级页表的表项 - set_pdpt((uint64_t *)new_pdpt, mk_pdpt(virt_2_phys(new_pdt), (current_pdpt + j)->pdpt & 0xfffUL)); + set_pdpt((uint64_t *)(new_pdpt + j), mk_pdpt(virt_2_phys(new_pdt), (*(uint64_t *)(current_pdpt + j)) & 0xfffUL)); - pdt_t *current_pdt = (pdt_t *)phys_2_virt((current_pdpt + j)->pdpt & (~0xfffUL)); + pdt_t *current_pdt = (pdt_t *)phys_2_virt((*(uint64_t *)(current_pdpt + j)) & (~0xfffUL)); // 拷贝内存页 for (int k = 0; k < 512; ++k) { if ((current_pdt + k)->pdt == 0) continue; + // 获取一个新页 struct Page *pg = alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED); - set_pdt((uint64_t *)(current_pdt + k), mk_pdt(pg->addr_phys, (current_pdt + k)->pdt & 0x1fffUL)); + set_pdt((uint64_t *)(new_pdt + k), mk_pdt(pg->addr_phys, (current_pdt + k)->pdt & 0x1fffUL)); // 拷贝数据 memcpy(phys_2_virt(pg->addr_phys), phys_2_virt((current_pdt + k)->pdt & (~0x1fffUL)), PAGE_2M_SIZE); diff --git a/kernel/sched/sched.c b/kernel/sched/sched.c index cfa1149a..3d15f1da 100644 --- a/kernel/sched/sched.c +++ b/kernel/sched/sched.c @@ -12,7 +12,7 @@ struct process_control_block *sched_cfs_dequeue() { if (list_empty(&sched_cfs_ready_queue[proc_current_cpu_id].proc_queue.list)) { - kdebug("list empty, count=%d", sched_cfs_ready_queue[proc_current_cpu_id].count); + // kdebug("list empty, count=%d", sched_cfs_ready_queue[proc_current_cpu_id].count); return &initial_proc_union.pcb; } @@ -30,9 +30,9 @@ struct process_control_block *sched_cfs_dequeue() */ void sched_cfs_enqueue(struct process_control_block *pcb) { - struct process_control_block *proc = container_of(list_next(&sched_cfs_ready_queue[proc_current_cpu_id].proc_queue.list), struct process_control_block, list); - if (proc == &initial_proc_union.pcb) + if (pcb == initial_proc[proc_current_cpu_id]) return; + struct process_control_block *proc = container_of(list_next(&sched_cfs_ready_queue[proc_current_cpu_id].proc_queue.list), struct process_control_block, list); if ((list_empty(&sched_cfs_ready_queue[proc_current_cpu_id].proc_queue.list)) == 0) { while (proc->virtual_runtime < pcb->virtual_runtime) @@ -59,7 +59,7 @@ void sched_cfs() if (current_pcb->state == PROC_RUNNING) // 本次切换由于时间片到期引发,则再次加入就绪队列,否则交由其它功能模块进行管理 sched_cfs_enqueue(current_pcb); - + // kdebug("proc->pid=%d, count=%d", proc->pid, sched_cfs_ready_queue[proc_current_cpu_id].count); if (sched_cfs_ready_queue[proc_current_cpu_id].cpu_exec_proc_jiffies <= 0) { switch (proc->priority) diff --git a/user/Makefile b/user/Makefile index b36d0601..7ee73910 100644 --- a/user/Makefile +++ b/user/Makefile @@ -2,7 +2,7 @@ user_sub_dirs = libs SUBDIR_ROOTS := . DIRS := . $(shell find $(SUBDIR_ROOTS) -type d) -GARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ kernel +GARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ sys_api_lib GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS))) diff --git a/user/init.c b/user/init.c index 3a99b454..27e6fa16 100644 --- a/user/init.c +++ b/user/init.c @@ -25,6 +25,11 @@ int main() read(fd, buf, 128); put_string(buf, COLOR_YELLOW, COLOR_BLACK); close(fd); + + pid_t p = fork(); + if(p == 0) + put_string("subproc\n", COLOR_PURPLE, COLOR_BLACK); + else put_string("parent proc\n", COLOR_ORANGE, COLOR_BLACK); while (1) ; diff --git a/user/sys_api_lib b/user/sys_api_lib deleted file mode 100644 index 2ef8834a221629e51035e5536d75ed1e3127cb28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13264 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 J(Q57T{{