syscalls: fix page count for mapping in sys_execve and make caller run coreutils
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user