mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-07-10 18:33:24 +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();
|
||||
|
Reference in New Issue
Block a user