mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 09:06:32 +00:00
调整brk系统调用,使得参数、返回值与Linux一致 (#238)
* 新增用于测试relibc的app * 为适配relibc,修改do_execve中关于用户栈的内容的设置 * 调整brk系统调用,使得参数、返回值与Linux一致
This commit is contained in:
@ -461,13 +461,15 @@ ul do_execve(struct pt_regs *regs, char *path, char *argv[], char *envp[])
|
||||
if (tmp < 0)
|
||||
goto exec_failed;
|
||||
|
||||
int argc = 0;
|
||||
char **dst_argv = NULL;
|
||||
// kdebug("stack_start_addr=%#018lx", stack_start_addr);
|
||||
// 拷贝参数列表
|
||||
if (argv != NULL)
|
||||
{
|
||||
int argc = 0;
|
||||
|
||||
// 目标程序的argv基地址指针,最大8个参数
|
||||
char **dst_argv = (char **)(stack_start_addr - (sizeof(char **) << 3));
|
||||
dst_argv = (char **)(stack_start_addr - (sizeof(char **) << 3));
|
||||
uint64_t str_addr = (uint64_t)dst_argv;
|
||||
|
||||
for (argc = 0; argc < 8 && argv[argc] != NULL; ++argc)
|
||||
@ -486,14 +488,29 @@ ul do_execve(struct pt_regs *regs, char *path, char *argv[], char *envp[])
|
||||
}
|
||||
|
||||
// 重新设定栈基址,并预留空间防止越界
|
||||
stack_start_addr = str_addr - 8;
|
||||
current_pcb->mm->stack_start = stack_start_addr;
|
||||
regs->rsp = regs->rbp = stack_start_addr;
|
||||
|
||||
// 传递参数
|
||||
regs->rdi = argc;
|
||||
regs->rsi = (uint64_t)dst_argv;
|
||||
stack_start_addr = str_addr - 8;
|
||||
}
|
||||
|
||||
// kdebug("stack_start_addr=%#018lx", stack_start_addr);
|
||||
// ==== 生成relibc所需的Stack结构体
|
||||
{
|
||||
uint64_t *ptr_stack = (uint64_t *)(stack_start_addr - 8);
|
||||
if (argc == 0)
|
||||
*ptr_stack = 0;
|
||||
else
|
||||
*ptr_stack = (uint64_t)dst_argv;
|
||||
ptr_stack--;
|
||||
*ptr_stack = argc;
|
||||
stack_start_addr -= 16;
|
||||
}
|
||||
|
||||
// 传递参数(旧版libc)
|
||||
regs->rdi = argc;
|
||||
regs->rsi = (uint64_t)dst_argv;
|
||||
// 设置用户栈基地址
|
||||
current_pcb->mm->stack_start = stack_start_addr;
|
||||
regs->rsp = regs->rbp = stack_start_addr;
|
||||
// kdebug("execve ok");
|
||||
// 设置进程的段选择子为用户态可访问
|
||||
regs->cs = USER_CS | 3;
|
||||
@ -539,7 +556,7 @@ ul initial_kernel_thread(ul arg)
|
||||
kinfo("initial proc running...\targ:%#018lx, vruntime=%d", arg, current_pcb->virtual_runtime);
|
||||
int val = 0;
|
||||
val = scm_enable_double_buffer();
|
||||
|
||||
|
||||
rs_init_stdio();
|
||||
// block_io_scheduler_init();
|
||||
ahci_init();
|
||||
|
@ -176,22 +176,14 @@ uint64_t sys_vfork(struct pt_regs *regs)
|
||||
uint64_t sys_brk(struct pt_regs *regs)
|
||||
{
|
||||
uint64_t new_brk = PAGE_2M_ALIGN(regs->r8);
|
||||
|
||||
// kdebug("sys_brk input= %#010lx , new_brk= %#010lx bytes current_pcb->mm->brk_start=%#018lx
|
||||
// current->end_brk=%#018lx", regs->r8, new_brk, current_pcb->mm->brk_start, current_pcb->mm->brk_end);
|
||||
|
||||
if ((int64_t)regs->r8 == -1)
|
||||
{
|
||||
// kdebug("get brk_start=%#018lx", current_pcb->mm->brk_start);
|
||||
return current_pcb->mm->brk_start;
|
||||
}
|
||||
if ((int64_t)regs->r8 == -2)
|
||||
{
|
||||
// kdebug("get brk_end=%#018lx", current_pcb->mm->brk_end);
|
||||
return current_pcb->mm->brk_end;
|
||||
}
|
||||
if (new_brk > current_pcb->addr_limit) // 堆地址空间超过限制
|
||||
return -ENOMEM;
|
||||
struct mm_struct *mm = current_pcb->mm;
|
||||
if (new_brk < mm->brk_start || new_brk> new_brk >= current_pcb->addr_limit)
|
||||
return mm->brk_end;
|
||||
|
||||
if (mm->brk_end == new_brk)
|
||||
return new_brk;
|
||||
|
||||
int64_t offset;
|
||||
if (new_brk >= current_pcb->mm->brk_end)
|
||||
@ -202,7 +194,7 @@ uint64_t sys_brk(struct pt_regs *regs)
|
||||
new_brk = mm_do_brk(current_pcb->mm->brk_end, offset); // 扩展堆内存空间
|
||||
|
||||
current_pcb->mm->brk_end = new_brk;
|
||||
return 0;
|
||||
return mm->brk_end;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user