From 129d24296b5777c709319ed09e1e355c3970e0ed Mon Sep 17 00:00:00 2001 From: fslongjin Date: Thu, 2 Jun 2022 19:22:03 +0800 Subject: [PATCH] =?UTF-8?q?bug=20fix:=20page=5Fnum>=3D25=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=A1=AB=E5=85=A5=E9=A1=B5=E8=A1=A8=E7=9A=84=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E4=B8=8A=E6=98=AF=E5=90=8C=E4=B8=80=E4=B8=AA=E7=89=A9=E7=90=86?= =?UTF-8?q?=E9=A1=B5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/exception/entry.S | 2 +- kernel/mm/mm.c | 31 ++++----------- kernel/process/process.c | 84 ++++++---------------------------------- user/apps/shell/shell.c | 2 +- 4 files changed, 22 insertions(+), 97 deletions(-) diff --git a/kernel/exception/entry.S b/kernel/exception/entry.S index 823034ca..df38194f 100644 --- a/kernel/exception/entry.S +++ b/kernel/exception/entry.S @@ -53,7 +53,7 @@ Restore_all: popq %rax addq $0x10, %rsp // 弹出变量FUNC和errcode - // sti + sti iretq ret_from_exception: diff --git a/kernel/mm/mm.c b/kernel/mm/mm.c index 6d4d1f0f..c9e9eeb4 100644 --- a/kernel/mm/mm.c +++ b/kernel/mm/mm.c @@ -68,7 +68,8 @@ void mm_init() //可用的内存 if (mb2_mem_info->type == 1) Total_Memory += mb2_mem_info->len; - + + kdebug("[i=%d] mb2_mem_info[i].type=%d, mb2_mem_info[i].addr=%#018lx", i, mb2_mem_info[i].type, mb2_mem_info[i].addr); // 保存信息到mms memory_management_struct.e820[i].BaseAddr = mb2_mem_info[i].addr; memory_management_struct.e820[i].Length = mb2_mem_info[i].len; @@ -127,7 +128,7 @@ void mm_init() // 由于暂时无法计算zone结构体的数量,因此先将其设为0 memory_management_struct.count_zones = 0; // zones-struct 成员变量暂时按照5个来计算 - memory_management_struct.zones_struct_len = (5 * sizeof(struct Zone) + sizeof(ul) - 1) & (~(sizeof(ul) - 1)); + memory_management_struct.zones_struct_len = (10 * sizeof(struct Zone) + sizeof(ul) - 1) & (~(sizeof(ul) - 1)); memset(memory_management_struct.zones_struct, 0x00, memory_management_struct.zones_struct_len); // ==== 遍历e820数组,完成成员变量初始化工作 === @@ -456,17 +457,7 @@ void page_table_init() { kinfo("Re-Initializing page table..."); ul *global_CR3 = get_CR3(); - /* - // 由于CR3寄存器的[11..0]位是PCID标志位,因此将低12位置0后,就是PML4页表的基地址 - ul *pml4_addr = (ul *)((ul)phys_2_virt((ul)global_CR3 & (~0xfffUL))); - kdebug("PML4 addr=%#018lx *pml4=%#018lx", pml4_addr, *pml4_addr); - - ul *pdpt_addr = phys_2_virt(*pml4_addr & (~0xfffUL)); - kdebug("pdpt addr=%#018lx *pdpt=%#018lx", pdpt_addr, *pdpt_addr); - - ul *pd_addr = phys_2_virt(*pdpt_addr & (~0xfffUL)); - kdebug("pd addr=%#018lx *pd=%#018lx", pd_addr, *pd_addr); -*/ + int js = 0; ul *tmp_addr; for (int i = 0; i < memory_management_struct.count_zones; ++i) @@ -479,10 +470,12 @@ void page_table_init() for (int j = 0; j < z->count_pages; ++j) { - if (j == 0) - kdebug("(ul)phys_2_virt(p->addr_phys)=%#018lx",(ul)phys_2_virt(p->addr_phys)); + // if (p->addr_phys) + // kdebug("(ul)phys_2_virt(p->addr_phys)=%#018lx",(ul)phys_2_virt(p->addr_phys)); //mm_map_phys_addr((ul)phys_2_virt(p->addr_phys), p->addr_phys, PAGE_2M_SIZE, PAGE_KERNEL_PAGE); mm_map_proc_page_table((uint64_t)get_CR3(), true, (ul)phys_2_virt(p->addr_phys), p->addr_phys, PAGE_2M_SIZE, PAGE_KERNEL_PAGE, false, true); + + ++p; ++js; } } @@ -490,15 +483,7 @@ void page_table_init() flush_tlb(); kinfo("Page table Initialized. Affects:%d", js); - // for(int i=0;i<100;++i) - // { - // struct Page * p=alloc_pages(ZONE_NORMAL, 1, 0); - // kdebug("Testing [%d]: addr_phys=%#018lx", i,p->addr_phys); - // memset((void*)(phys_2_virt(p->addr_phys)), 0, PAGE_2M_SIZE); - // } - // while(1) - // pause(); } /** diff --git a/kernel/process/process.c b/kernel/process/process.c index 487d240e..6019fc5e 100644 --- a/kernel/process/process.c +++ b/kernel/process/process.c @@ -866,92 +866,32 @@ uint64_t process_copy_mm(uint64_t clone_flags, struct process_control_block *pcb for (int k = 0; k < 512; ++k) { - // 获取新的物理页 if (*(current_pdt + k) == 0) continue; - // 跳过栈空间 - if (i == 223 && j == 511 && k == 388) - continue; - // if (i > 10) - // continue; + // 获取新的物理页 uint64_t pa = alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED)->addr_phys; - kdebug("before memset phys_2_virt(pa)=%#018lx", phys_2_virt(pa)); - memset((void*)phys_2_virt(pa), 0, PAGE_2M_SIZE); + memset((void *)phys_2_virt(pa), 0, PAGE_2M_SIZE); - kdebug("[i=%d][j=%d][k=%d] pg->addr_phys=%#018lx", i, j, k, pa); + set_pdt((uint64_t *)(new_pdt + k), mk_pdt(pa, *(current_pdt + k) & 0x1ffUL)); + + // 拷贝数据 + memcpy(phys_2_virt(pa), phys_2_virt((*(current_pdt + k)) & (~0x1ffUL)), PAGE_2M_SIZE); // 计算当前虚拟地址 - uint64_t current_vaddr = 0; - current_vaddr = ((1UL * i) << PAGE_GDT_SHIFT) | ((1UL * j) << PAGE_1G_SHIFT) | ((1UL * k) << PAGE_2M_SHIFT); - kdebug("current_vaddr = %#018lx, pa=%#018lx", current_vaddr, pa); + // uint64_t current_vaddr = 0; + // current_vaddr = ((1UL * i) << PAGE_GDT_SHIFT) | ((1UL * j) << PAGE_1G_SHIFT) | ((1UL * k) << PAGE_2M_SHIFT); - mm_map_proc_page_table((uint64_t)pcb->mm->pgd, true, current_vaddr, pa, PAGE_2M_SIZE, PAGE_USER_PAGE, true, false); - kdebug("before memcpy"); - memcpy((void*)phys_2_virt(pa), (void *)current_vaddr, PAGE_2M_SIZE); + // mm_map_proc_page_table((uint64_t)pcb->mm->pgd, true, current_vaddr, pa, PAGE_2M_SIZE, PAGE_USER_PAGE, true, false); - kdebug("current_pcb->mm->stack_start=%#018lx", current_pcb->mm->stack_start); - // kdebug("*(current_pdt+k)=%#018lx", *(current_pdt + k)); - // set_pdt((new_pdt + k), mk_pdt(pa, PAGE_USER_PAGE)); - // // set_pdt((new_pdt + k), mk_pdt(pg->addr_phys, (*(current_pdt + k)) & 0xfffUL)); - - // // memcpy((void *)phys_2_virt(pg->addr_phys), (void *)phys_2_virt((*(current_pdt + k)) & (~0xfffUL)), PAGE_2M_SIZE); - - // kdebug("phys_2_virt((*(current_pdt + k)) & (~0x1ffUL))=%#018lx",phys_2_virt((*(current_pdt + k)) & (~0x1ffUL))); - // memcpy((void *)phys_2_virt(pa), (void *)phys_2_virt((*(current_pdt + k)) & (~0x1ffUL)), PAGE_2M_SIZE); - // set_pdt((new_pdt + k), mk_pdt(pg->addr_phys, PAGE_USER_PAGE)); - - // *(new_pdt + k) = (pg->addr_phys | (*(current_pdt + k)) & (0xfffUL)); + // memcpy((void *)phys_2_virt(pa), (void *)current_vaddr, PAGE_2M_SIZE); } } - // kdebug("current_pcb->mm->stack_start - PAGE_2M_SIZE * 2=%#018lx",current_pcb->mm->stack_start - PAGE_2M_SIZE * 2); - - // kdebug("i=%d, current pdpt=%#018lx \t (current_pgd + i)->pml4t=%#018lx", i, current_pdpt, *(uint64_t *)(current_pgd + i)); - // // 设置二级页表 - // for (int j = 0; j < 512; ++j) - // { - // if (*(uint64_t *)(current_pdpt + j) == 0) - // continue; - - // kdebug("j=%d *(uint64_t *)(current_pdpt + j)=%#018lx", j, *(uint64_t *)(current_pdpt + j)); - - // // 分配新的三级页表 - // uint64_t *new_pdt = (uint64_t *)kmalloc(PAGE_4K_SIZE, 0); - // memset(new_pdt, 0, PAGE_4K_SIZE); - - // // 在新的二级页表中设置三级页表的表项 - // set_pdpt((uint64_t *)(new_pdpt + j), mk_pdpt(virt_2_phys(new_pdt), (*(uint64_t *)(current_pdpt + j)) & 0xfffUL)); - - // uint64_t *current_pdt = (uint64_t *)phys_2_virt((*(uint64_t *)(current_pdpt + j)) & (~0xfffUL)); - - // // 拷贝内存页 - // for (int k = 0; k < 512; ++k) - // { - // if (*(current_pdt + k) == 0) - // continue; - - // kdebug("k=%d, *(current_pdt + k)=%#018lx", k, *(current_pdt + k)); - // // 获取一个新页 - // struct Page *pg = alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED); - // set_pdt((uint64_t *)(new_pdt + k), mk_pdt(pg->addr_phys, *(current_pdt + k) & 0x1ffUL)); - - // kdebug("k=%d, cpy dest=%#018lx, src=%#018lx", k, phys_2_virt(pg->addr_phys), phys_2_virt((*(current_pdt + k)) & (~0x1ffUL))); - // // 拷贝数据 - // memcpy(phys_2_virt(pg->addr_phys), phys_2_virt((*(current_pdt + k)) & (~0x1ffUL)), PAGE_2M_SIZE); - // } - // } + } - kdebug("mapppping stack mem!!!, pid=%d", pcb->pid); - uint64_t pha = alloc_pages(ZONE_NORMAL, 1, PAGE_PGT_MAPPED)->addr_phys; - mm_map_proc_page_table((uint64_t)pcb->mm->pgd, true, current_pcb->mm->stack_start - PAGE_2M_SIZE * 1, pha, 1 * PAGE_2M_SIZE, PAGE_USER_PAGE, true, false); - // mm_map_proc_page_table((uint64_t)pcb->mm->pgd, true, current_pcb->mm->stack_start - PAGE_2M_SIZE * 1, pha, 1 * PAGE_2M_SIZE, PAGE_USER_PAGE, true, false); - // 清空栈空间 - memset(phys_2_virt(pha), 0, PAGE_2M_SIZE); - kdebug("(current_pcb->mm->stack_start - PAGE_2M_SIZE)=%#018lx", (current_pcb->mm->stack_start - PAGE_2M_SIZE)); - memcpy(phys_2_virt(pha), (void *)(current_pcb->mm->stack_start - PAGE_2M_SIZE), PAGE_2M_SIZE); - kdebug("mapppped stack mem!!!"); + return retval; } diff --git a/user/apps/shell/shell.c b/user/apps/shell/shell.c index f6e135ca..8e202f0c 100644 --- a/user/apps/shell/shell.c +++ b/user/apps/shell/shell.c @@ -42,7 +42,7 @@ void main_loop(int kb_fd) unsigned char input_buffer[INPUT_BUFFER_SIZE] = {0}; - // sbrk(24); + sbrk(24); // brk(0x700000000000 + (1<<21)); pid_t pid = fork(); int retval = 0;