0

我正在写execv(char *program, char **args)电话Os/161

因此,我得到了程序和内核空间的 args 中提供的数据用户的副本。然后我创建全新的地址空间,加载带有 args 的程序。

问题是如何找到指向用户空间虚拟内存的适当指针,以便在切换到用户空间之前将数据从内核空间复制到用户空间?

4

2 回答 2

2

使用堆栈,但确保内存对齐

于 2009-10-27T05:03:19.190 回答
2

我也在开发 OS161。这是我的做法。

在销毁当前地址空间之前,将所有参数复制到内核缓冲区中。然后在创建并激活新地址空间后,通过 as_define_stack 获取堆栈指针并将这些参数复制到堆栈中。您需要非常小心地打包它们,否则您的新堆栈将被损坏。此外,正如 James 所说,所有指针(每个参数字符串的开头)必须与 stackptr 一样对齐 4 个字节。在此之后,您需要相应地调整 stackptr 以为这些参数腾出空间。

这是哈佛提供的文档,您可以在第 9 页查看详细信息。

[编辑]

写了一篇关于 os161 的 execv 系统调用的博客。希望我已经把问题说清楚了。

[/编辑]

于 2012-03-07T08:37:23.960 回答