mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 22:36:48 +00:00
bug fix: page_num>=25时,填入页表的实际上是同一个物理页的bug
This commit is contained in:
parent
d64ddfa0b6
commit
129d24296b
@ -53,7 +53,7 @@ Restore_all:
|
|||||||
popq %rax
|
popq %rax
|
||||||
addq $0x10, %rsp // 弹出变量FUNC和errcode
|
addq $0x10, %rsp // 弹出变量FUNC和errcode
|
||||||
|
|
||||||
// sti
|
sti
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
ret_from_exception:
|
ret_from_exception:
|
||||||
|
@ -68,7 +68,8 @@ void mm_init()
|
|||||||
//可用的内存
|
//可用的内存
|
||||||
if (mb2_mem_info->type == 1)
|
if (mb2_mem_info->type == 1)
|
||||||
Total_Memory += mb2_mem_info->len;
|
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
|
// 保存信息到mms
|
||||||
memory_management_struct.e820[i].BaseAddr = mb2_mem_info[i].addr;
|
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].Length = mb2_mem_info[i].len;
|
||||||
@ -127,7 +128,7 @@ void mm_init()
|
|||||||
// 由于暂时无法计算zone结构体的数量,因此先将其设为0
|
// 由于暂时无法计算zone结构体的数量,因此先将其设为0
|
||||||
memory_management_struct.count_zones = 0;
|
memory_management_struct.count_zones = 0;
|
||||||
// zones-struct 成员变量暂时按照5个来计算
|
// 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);
|
memset(memory_management_struct.zones_struct, 0x00, memory_management_struct.zones_struct_len);
|
||||||
|
|
||||||
// ==== 遍历e820数组,完成成员变量初始化工作 ===
|
// ==== 遍历e820数组,完成成员变量初始化工作 ===
|
||||||
@ -456,17 +457,7 @@ void page_table_init()
|
|||||||
{
|
{
|
||||||
kinfo("Re-Initializing page table...");
|
kinfo("Re-Initializing page table...");
|
||||||
ul *global_CR3 = get_CR3();
|
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;
|
int js = 0;
|
||||||
ul *tmp_addr;
|
ul *tmp_addr;
|
||||||
for (int i = 0; i < memory_management_struct.count_zones; ++i)
|
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)
|
for (int j = 0; j < z->count_pages; ++j)
|
||||||
{
|
{
|
||||||
if (j == 0)
|
// if (p->addr_phys)
|
||||||
kdebug("(ul)phys_2_virt(p->addr_phys)=%#018lx",(ul)phys_2_virt(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_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);
|
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;
|
++js;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -490,15 +483,7 @@ void page_table_init()
|
|||||||
flush_tlb();
|
flush_tlb();
|
||||||
|
|
||||||
kinfo("Page table Initialized. Affects:%d", js);
|
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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)
|
for (int k = 0; k < 512; ++k)
|
||||||
{
|
{
|
||||||
|
|
||||||
// 获取新的物理页
|
|
||||||
if (*(current_pdt + k) == 0)
|
if (*(current_pdt + k) == 0)
|
||||||
continue;
|
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;
|
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;
|
// uint64_t current_vaddr = 0;
|
||||||
current_vaddr = ((1UL * i) << PAGE_GDT_SHIFT) | ((1UL * j) << PAGE_1G_SHIFT) | ((1UL * k) << PAGE_2M_SHIFT);
|
// 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);
|
|
||||||
|
|
||||||
mm_map_proc_page_table((uint64_t)pcb->mm->pgd, true, current_vaddr, pa, PAGE_2M_SIZE, PAGE_USER_PAGE, true, false);
|
// 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);
|
|
||||||
|
|
||||||
kdebug("current_pcb->mm->stack_start=%#018lx", current_pcb->mm->stack_start);
|
// memcpy((void *)phys_2_virt(pa), (void *)current_vaddr, PAGE_2M_SIZE);
|
||||||
// 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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 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;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ void main_loop(int kb_fd)
|
|||||||
|
|
||||||
unsigned char input_buffer[INPUT_BUFFER_SIZE] = {0};
|
unsigned char input_buffer[INPUT_BUFFER_SIZE] = {0};
|
||||||
|
|
||||||
// sbrk(24);
|
sbrk(24);
|
||||||
// brk(0x700000000000 + (1<<21));
|
// brk(0x700000000000 + (1<<21));
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user