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

This commit is contained in:
fslongjin 2022-04-14 19:26:46 +08:00
parent 53c553c730
commit c2d8e88617
7 changed files with 29 additions and 18 deletions

View File

@ -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();
}

View File

@ -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)

View File

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

View File

@ -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物理页

View File

@ -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;

View File

@ -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:

View File

@ -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)
{