Fix bootloader bug, reserve kernel pages in physical memory

This commit is contained in:
notsomeidiot123 2024-10-30 16:49:59 -04:00
parent cfdb33fc77
commit 09259445f5
6 changed files with 24 additions and 6 deletions

View File

@ -404,8 +404,8 @@ paging_en:
mov cr3, eax
;enable recursive paging
mov [eax + 1023], eax
or [eax + 1023], dword 0b0_0001_0000_1001
mov [eax + 1023*4], eax
or [eax + 1023*4], dword 0b0_0000_0000_0011
ret
open_file:

View File

@ -9,7 +9,7 @@ uint8_t pm_map[mmap_count];
uint32_t total_memory;
uint32_t total_memory_usable;
uint32_t last_allocated;
extern uint32_t _start;
uint32_t pm_alloc(){
for(uint32_t i = 0; i < mmap_count; i++){
@ -29,7 +29,7 @@ void pm_reserve(uint32_t address){
int pm_init(kernel_info_t *kernel_info){
mmap_entry_t *mmap = (mmap_entry_t*)(kernel_info->mmap_ptr);
// printf("mmap count: %d", kernel_info->mmap_entry_count);
printf("mmap count: %d\n| start | length |type|\n|--------|--------|----|\n", kernel_info->mmap_entry_count);
for(uint32_t i = 0; i < mmap_count; i++){
pm_map[i] = 0;
}
@ -48,12 +48,21 @@ int pm_init(kernel_info_t *kernel_info){
// printf("%d, %x, %d\n", j >> 3, pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)], mmap[i].type);
// }
}
// printf("|%x|", mmap[i].entry_base);
// printf("%x", mmap[i].entry_length);
// printf("|%d |\n", mmap[i].type);
}
for(uint32_t i = 0; i < 512; i++){
pm_reserve(i * 4096);
}
void *kernel_addr = (void *)_start;
while(get_paddr(kernel_addr)){
printf("%x\n", kernel_addr);
pm_reserve(get_paddr(kernel_addr));
kernel_addr += 0x1000;
}
}
void map(void *vaddr, void *paddr, uint32_t flags){
uint32_t pd_index = (uint32_t)vaddr >> 22;
@ -83,8 +92,10 @@ void unmap(void *vaddr){
}
void map_4mb(void *vaddr, void *paddr, uint32_t flags){
//just wanted to get the prototype out
//!TODO: Finish mapping and unmapping 4mb pages
}
uint32_t get_paddr(void *addr){
//!TODO: Support 4mb pages
uint32_t vaddr = (uint32_t)addr;
uint32_t pd_index = vaddr >> 22;
uint32_t pt_index = vaddr >> 12 & 0x3ff;
@ -93,5 +104,5 @@ uint32_t get_paddr(void *addr){
return 0;
}
uint32_t *pt = (uint32_t *)(0xffc00000 + (0x400 * pd_index));
return pt[pt_index];
return pt[pt_index] & ~(pt[pt_index] & 0xfff);
}

View File

@ -6,5 +6,6 @@
extern void kmain(kernel_info_t *kernel_info){
init_serial();
pm_init(kernel_info);
return;
}

View File

@ -61,5 +61,11 @@ typedef struct memory_map_entry{
}__attribute__((packed))mmap_entry_t;
void map(void *vaddr, void *paddr, uint32_t flags);
void unmap(void *vaddr);
void map_4mb(void *vaddr, void* paddr, uint32_t flags);
uint32_t get_paddr(void *addr);
uint32_t pm_alloc();
void pm_reserve(uint32_t addr);
void pm_free(uint32_t addr);
int pm_init(kernel_info_t *kernel_info);

0
src/kernel/system/vfs.c Normal file
View File

0
src/kernel/system/vfs.h Normal file
View File