syscalls: fix page count for mapping in sys_execve and make caller run coreutils

This commit is contained in:
2025-10-07 23:41:55 +03:00
parent 88c1936e83
commit 26c8280059
2 changed files with 11 additions and 4 deletions
+9 -2
View File
@@ -323,10 +323,17 @@ int sys_execve(TrapFrame *tf) {
for (int i = 0; i < elf_header->e_phnum; i++) {
Elf32_Phdr *p_header = (Elf32_Phdr *)(file_buffer + elf_header->e_phoff + i * elf_header->e_phentsize);
if (p_header->p_type == PT_LOAD) {
for (uint32_t vaddr = p_header->p_vaddr; vaddr < p_header->p_vaddr + p_header->p_memsz; vaddr += PAGE_SIZE) {
uint32_t start_addr = p_header->p_vaddr;
uint32_t end_addr = start_addr + p_header->p_memsz;
uint32_t start_page = start_addr & ~0xFFF;
uint32_t end_page = (end_addr - 1) & ~0xFFF;
for (uint32_t vaddr = start_page; vaddr <= end_page; vaddr += PAGE_SIZE) {
void* phys_addr = alloc_page();
map_page(phys_addr, (void*)(vaddr & ~0xFFF), PAGE_PRESENT | PAGE_RW | PAGE_USER);
map_page(phys_addr, (void*)vaddr, PAGE_PRESENT | PAGE_RW | PAGE_USER);
}
memcpy((void*)p_header->p_vaddr, file_buffer + p_header->p_offset, p_header->p_filesz);
if (p_header->p_memsz > p_header->p_filesz) {
memset((void*)(p_header->p_vaddr + p_header->p_filesz), 0, p_header->p_memsz - p_header->p_filesz);