我在Os/161写了execv(char *program, char **args)
来电。
因此,我得到了程序中提供的数据用户副本以及内核空间中的args。 然后我创建了一个全新的地址空间,其中加载了带有args的程序。
问题是如何找到适当的指向用户空间虚拟内存的指针,以便在切换到用户空间之前将数据从内核空间复制到用户空间?
答案 0 :(得分:2)
使用堆栈,但确保内存已对齐
答案 1 :(得分:2)
我也在研究OS161。我就是这样做的。
在销毁当前地址空间之前,将所有参数复制到内核缓冲区中。然后在创建并激活新的地址空间后,通过as_define_stack获取堆栈指针并将这些参数复制到堆栈中。您需要非常小心地打包它们,否则您的新堆栈将被破坏。另外,正如James所说,所有指针(每个参数字符串的开头)必须与4个字节以及stackptr对齐。在此之后,您需要相应地调整stackptr以为这些参数腾出空间。
以下是a doc offered by Harvard,您可以查看第9页的详细信息。
[编辑]
我写了a blog about os161's execv system call。希望我在那里明确提出问题。
[/编辑]