我正在写execv(char *program, char **args)
电话Os/161。
因此,我得到了程序和内核空间的 args 中提供的数据用户的副本。然后我创建全新的地址空间,加载带有 args 的程序。
问题是如何找到指向用户空间虚拟内存的适当指针,以便在切换到用户空间之前将数据从内核空间复制到用户空间?
使用堆栈,但确保内存对齐
我也在开发 OS161。这是我的做法。
在销毁当前地址空间之前,将所有参数复制到内核缓冲区中。然后在创建并激活新地址空间后,通过 as_define_stack 获取堆栈指针并将这些参数复制到堆栈中。您需要非常小心地打包它们,否则您的新堆栈将被损坏。此外,正如 James 所说,所有指针(每个参数字符串的开头)必须与 stackptr 一样对齐 4 个字节。在此之后,您需要相应地调整 stackptr 以为这些参数腾出空间。
这是哈佛提供的文档,您可以在第 9 页查看详细信息。
[编辑]
我写了一篇关于 os161 的 execv 系统调用的博客。希望我已经把问题说清楚了。
[/编辑]