From 4ed9674bde6b2a6039f41f82450b17423f5fd2ae Mon Sep 17 00:00:00 2001 From: xiaoyi1212 Date: Fri, 28 Jun 2024 22:43:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BF=9B=E7=A8=8B=E9=A1=B5?= =?UTF-8?q?=E8=A1=A8=E5=88=87=E6=8D=A2reboot=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fs/iso9660.c | 2 +- src/include/memory.h | 4 ++++ src/kernel/kheap.c | 22 +++++++++++++++++----- src/kernel/page.c | 18 +++++++++++++++--- src/kernel/task.c | 4 ++-- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/fs/iso9660.c b/src/fs/iso9660.c index 4810060..c8674ab 100644 --- a/src/fs/iso9660.c +++ b/src/fs/iso9660.c @@ -6,7 +6,7 @@ bool read_sector(l9660_fs *fs, void *buf, uint32_t sector); #define l9660_seekdir(dir, pos) (l9660_seek(&(dir)->file, L9660_SEEK_SET, (pos))) #define l9660_telldir(dir) (l9660_tell(&(dir)->file)) -xi#define get_root_dir(vfs) ((l9660_fs_status_t *)(vfs->cache))->root_dir +#define get_root_dir(vfs) ((l9660_fs_status_t *)(vfs->cache))->root_dir #define SEEK_END L9660_SEEK_END #define SEEK_SET L9660_SEEK_SET diff --git a/src/include/memory.h b/src/include/memory.h index 156d869..54336d0 100644 --- a/src/include/memory.h +++ b/src/include/memory.h @@ -95,4 +95,8 @@ void free_frame(page_t *page); void page_flush(page_directory_t *dir); +void page_switch(page_directory_t *dir); + +uint32_t kmalloc_i_ap(uint32_t size, uint32_t *phys); + #endif //CRASHPOWEROS_MEMORY_H diff --git a/src/kernel/kheap.c b/src/kernel/kheap.c index 2e7f491..80c6d97 100644 --- a/src/kernel/kheap.c +++ b/src/kernel/kheap.c @@ -18,18 +18,30 @@ uint32_t memory_usage(){ return size; } -static uint32_t kmalloc_int(uint32_t sz, uint32_t align, uint32_t *phys) { +uint32_t kmalloc_i_ap(uint32_t size, uint32_t *phys){ + if ((placement_address & 0x00000FFF)) { + placement_address &= 0xFFFFF000; + placement_address += 0x1000; + } + if (phys) *phys = placement_address; + uint32_t tmp = placement_address; + placement_address += size; + + return tmp; +} + +static uint32_t kmalloc_int(size_t sz, uint32_t align, uint32_t *phys) { if (program_break) { // 有内存堆 void *addr = alloc(sz); // 直接malloc,align丢掉了 if (phys) { // 需要物理地址,先找到对应页 page_t *page = get_page((uint32_t) addr, 0, current_directory); - *phys = page->frame * 0x1000 + ((uint32_t) addr & 0xfff); + *phys = page->frame * 0x1000 + ((uint32_t) addr & 0x00000FFF); } return (uint32_t) addr; } - if (align && (placement_address & 0x00000FFF)) { + if (align == 1 && (placement_address & 0x00000FFF)) { placement_address &= 0xFFFFF000; placement_address += 0x1000; } @@ -65,7 +77,7 @@ void *ksbrk(int incr) { } // 寻找一个符合条件的指定大小的空闲内存块 -static header_t *get_free_block(uint32_t size) { +static header_t *get_free_block(size_t size) { header_t *curr = head; while (curr) { if (curr->s.is_free && curr->s.size >= size) return curr; @@ -74,7 +86,7 @@ static header_t *get_free_block(uint32_t size) { return NULL; } -void *alloc(uint32_t size) { +void *alloc(size_t size) { uint32_t total_size; void *block; header_t *header; diff --git a/src/kernel/page.c b/src/kernel/page.c index abd7798..45defeb 100644 --- a/src/kernel/page.c +++ b/src/kernel/page.c @@ -92,9 +92,19 @@ void page_flush(page_directory_t *dir){ //asm volatile("mov %0, %%cr3" : : "r"(&dir->physicalAddr)); } +void page_switch(page_directory_t *dir){ + io_cli(); + current_directory = dir; + logkf("TablePhy: %08x | KERPhy: %08x\n",(&dir->tablesPhysical),kernel_directory->tablesPhysical); + asm volatile("mov %0, %%cr3" : : "r"(&dir->tablesPhysical)); // 设置cr3寄存器切换页表 + logk("Switch directory win!\n"); + io_sti(); +} + void switch_page_directory(page_directory_t *dir) { current_directory = dir; asm volatile("mov %0, %%cr3" : : "r"(&dir->tablesPhysical)); + uint32_t cr0; asm volatile("mov %%cr0, %0" : "=r"(cr0)); cr0 |= 0x80000000; @@ -172,7 +182,7 @@ static page_table_t *clone_table(page_table_t *src, uint32_t *physAddr) { page_directory_t *clone_directory(page_directory_t *src) { uint32_t phys; - page_directory_t *dir = (page_directory_t *) kmalloc_ap(sizeof(page_directory_t), &phys); + page_directory_t *dir = (page_directory_t *) kmalloc_i_ap(sizeof(page_directory_t), &phys); memset(dir, 0, sizeof(page_directory_t)); uint32_t offset = (uint32_t) dir->tablesPhysical - (uint32_t) dir; @@ -200,7 +210,9 @@ void init_page(multiboot_t *mboot) { frames = (uint32_t *) kmalloc(INDEX_FROM_BIT(nframes)); memset(frames, 0, INDEX_FROM_BIT(nframes)); - kernel_directory = (page_directory_t *) kmalloc_a(sizeof(page_directory_t)); //kmalloc: 无分页情况自动在内核后方分配 | 有分页从内核堆分配 + uint32_t physical_addr; + kernel_directory = (page_directory_t *) kmalloc_ap(sizeof(page_directory_t),&physical_addr); //kmalloc: 无分页情况自动在内核后方分配 | 有分页从内核堆分配 + kernel_directory->physicalAddr = physical_addr; memset(kernel_directory, 0, sizeof(page_directory_t)); current_directory = kernel_directory; @@ -225,7 +237,7 @@ void init_page(multiboot_t *mboot) { } register_interrupt_handler(14, page_fault); - switch_page_directory(kernel_directory); + switch_page_directory(clone_directory(kernel_directory)); program_break = (void *) KHEAP_START; program_break_end = (void *) (KHEAP_START + KHEAP_INITIAL_SIZE); diff --git a/src/kernel/task.c b/src/kernel/task.c index 1328ae6..934079f 100644 --- a/src/kernel/task.c +++ b/src/kernel/task.c @@ -158,7 +158,7 @@ void change_task_to(struct task_struct *next) { struct task_struct *prev = current; current = next; - page_flush(current->pgd_dir); + page_switch(current->pgd_dir); set_kernel_stack(current->stack); switch_to(&(prev->context), &(current->context)); } @@ -174,7 +174,7 @@ int32_t kernel_thread(int (*fn)(void *), void *arg,char* name) { new_task->state = TASK_RUNNABLE; new_task->stack = current; new_task->pid = now_pid++; - new_task->pgd_dir = clone_directory(kernel_directory) ; + new_task->pgd_dir = clone_directory(current->pgd_dir) ; new_task->name = name;