try to fix page fault

This commit is contained in:
RaphProductions 2025-05-09 15:07:22 +02:00
parent 105a10aba3
commit 4309b666a4
8 changed files with 40 additions and 10 deletions

View file

@ -65,7 +65,7 @@ program_t *elf_load(char *data) {
if (!(phdr[i].p_flags & PF_X)) if (!(phdr[i].p_flags & PF_X))
flags |= VMM_NX; flags |= VMM_NX;
flags |= VMM_USER; // User mode access flags |= VMM_USER;
log("elf - loading ELF program header %u: vaddr 0x%llx - 0x%llx, offset 0x%llx, filesz 0x%llx, size 0x%llx, flags 0x%llx\n", log("elf - loading ELF program header %u: vaddr 0x%llx - 0x%llx, offset 0x%llx, filesz 0x%llx, size 0x%llx, flags 0x%llx\n",
i, vaddr_start, vaddr_end, offset, phdr[i].p_filesz, phdr[i].p_memsz, flags); i, vaddr_start, vaddr_end, offset, phdr[i].p_filesz, phdr[i].p_memsz, flags);
@ -81,7 +81,9 @@ program_t *elf_load(char *data) {
return 0; return 0;
} }
log("elf - vmm_map(%p, %p, %p, %d)\n", pm, vaddr, phys, flags);
vmm_map(pm, vaddr, phys, flags); vmm_map(pm, vaddr, phys, flags);
log("elf - memset(%p, 0, 0x1000)\n", HIGHER_HALF(phys));
memset((void *)HIGHER_HALF(phys), 0, PMM_PAGE_SIZE); memset((void *)HIGHER_HALF(phys), 0, PMM_PAGE_SIZE);
uint64_t file_page_offset = offset + (vaddr - vaddr_start); uint64_t file_page_offset = offset + (vaddr - vaddr_start);
@ -109,6 +111,7 @@ program_t *elf_load(char *data) {
{ {
void *dest = (void *)(HIGHER_HALF(phys) + page_data_offset); void *dest = (void *)(HIGHER_HALF(phys) + page_data_offset);
void *src = (uint8_t *)data + copy_offset; void *src = (uint8_t *)data + copy_offset;
log("elf - memcpy(%p, %p, %d)\n", dest, src, copy_size);
memcpy(dest, src, copy_size); memcpy(dest, src, copy_size);
//log("elf - copied 0x%llx bytes from ELF file offset 0x%llx to vaddr 0x%llx (phys 0x%llx)\n", //log("elf - copied 0x%llx bytes from ELF file offset 0x%llx to vaddr 0x%llx (phys 0x%llx)\n",

View file

@ -174,15 +174,16 @@ uint64_t vmm_get_flags(pagemap_t* pm, uint64_t vaddr) {
uint64_t virt_to_phys(pagemap_t *pagemap, uint64_t virt) uint64_t virt_to_phys(pagemap_t *pagemap, uint64_t virt)
{ {
uint64_t pml1_idx = (virt & (uint64_t)0x1ff << 12) >> 12; uint64_t pml4_idx = (virt >> 39) & 0x1FF;
uint64_t pml2_idx = (virt & (uint64_t)0x1ff << 21) >> 21; uint64_t pml3_idx = (virt >> 30) & 0x1FF;
uint64_t pml3_idx = (virt & (uint64_t)0x1ff << 30) >> 30; uint64_t pml2_idx = (virt >> 21) & 0x1FF;
uint64_t pml4_idx = (virt & (uint64_t)0x1ff << 39) >> 39; uint64_t pml1_idx = (virt >> 12) & 0x1FF;
uint64_t *pml3 = __vmm_get_next_lvl(pagemap->toplevel, pml4_idx, 0); uint64_t *pml3 = __vmm_get_next_lvl(pagemap->toplevel, pml4_idx, 0);
uint64_t *pml2 = __vmm_get_next_lvl(pml3, pml3_idx, 0); uint64_t *pml2 = __vmm_get_next_lvl(pml3, pml3_idx, 0);
uint64_t *pml1 = __vmm_get_next_lvl(pml2, pml2_idx, 0); uint64_t *pml1 = __vmm_get_next_lvl(pml2, pml2_idx, 0);
uint64_t phys_addr = pml1[pml1_idx] & 0x000FFFFFFFFFF000;
uint64_t phys_addr = pml1[pml1_idx] & 0x000FFFFFFFFFF000; // Masque pour obtenir l'adresse physique (en retirant les bits de flags)
return phys_addr; return phys_addr;
} }

View file

@ -1,5 +1,6 @@
//#include "mm/pmm.h" //#include "mm/pmm.h"
//#include "mm/vmm.h" //#include "mm/vmm.h"
#include "mm/pmm.h"
#include "mm/vmm.h" #include "mm/vmm.h"
#include "sched/sched.h" #include "sched/sched.h"
#include "sys/arch/x86_64/pic.h" #include "sys/arch/x86_64/pic.h"
@ -44,8 +45,9 @@ void exception_handler(registers_t *regs) {
if(regs->int_no == 0xe) { if(regs->int_no == 0xe) {
uint64_t cr2; uint64_t cr2;
asm ("mov %%cr2, %0" : "=r"(cr2)); asm ("mov %%cr2, %0" : "=r"(cr2));
log("ints - PF: Faulting location: %p\n", cr2); log("ints - PF: Faulting location: %p (%p)\n", cr2, virt_to_phys(vmm_current_pm, cr2));
log("ints - PF: Faulting page flags: %p\n", vmm_get_flags(vmm_current_pm, cr2)); log("ints - PF: Faulting page flags: %p\n", vmm_get_flags(vmm_current_pm, cr2));
log("ints - PF: Faulting page map: %p\n", PHYSICAL(vmm_current_pm));
} }
// dump_backtrace(regs); // dump_backtrace(regs);

3
testing/build.sh Executable file
View file

@ -0,0 +1,3 @@
nasm -f elf64 test.asm -o test.o
ld -T link.ld -nostdlib --no-dynamic-linker --strip-all test.o -o sk-hello.elf
echo "Test executable has been built successfully."

Binary file not shown.

View file

@ -4,5 +4,7 @@ section .text
_start: _start:
int 0x80 int 0x80
lol: ; tell the kernel to exit the process.
jmp lol mov rax, 10
int 0x80
ret

Binary file not shown.

19
util/get_vaddr_info.py Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/env python3
import sys
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <virtual_address (hex)>")
sys.exit(1)
va = int(sys.argv[1], 16)
def extract_index(name, shift):
return (va >> shift) & 0x1FF
print(f"Virtual address : 0x{va:016x}")
print(f"PML4 index : {extract_index('PML4', 39)}")
print(f"PDPT index : {extract_index('PDPT', 30)}")
print(f" PD index : {extract_index('PD', 21)}")
print(f" PT index : {extract_index('PT', 12)}")
print(f" Offset : {va & 0xFFF}")