当您在用户模式下运行程序时,是否可以在 x86 中使用分段内存?如果是这样,是否有任何工具(例如 C/C++ 编译器)来促进这一点?它似乎是一个非常强大的机制,允许在程序中运行程序。
我听说 Chromium 在 Native Client 中使用分段进行沙盒,但我不确定它如何使用,或者它是否使用程序集或内置编译器支持。
当您在用户模式下运行程序时,是否可以在 x86 中使用分段内存?如果是这样,是否有任何工具(例如 C/C++ 编译器)来促进这一点?它似乎是一个非常强大的机制,允许在程序中运行程序。
我听说 Chromium 在 Native Client 中使用分段进行沙盒,但我不确定它如何使用,或者它是否使用程序集或内置编译器支持。
Native Client 使用编译器支持(asm
扩展,这里是 gnu 形式)和程序集来处理段寄存器:
http://www.google.com/codesearch/p?hl=en#IAaH75l62fw/service_runtime/linux/sel_segments.c&l=71
uint16_t NaClGetEs(void)
{
uint16_t seg1;
asm("mov %%es, %0" : "=r" (seg1) : );
return seg1;
}
void NaClSetEs(uint16_t seg1)
{
asm("movw %0, %%es;" : : "r" (seg1));
}
所以,这是可能的,但很难编程。
有一篇关于 Native Client 的论文:http: //nativeclient.googlecode.com/svn/trunk/src/native_client/documentation/nacl_paper.pdf
NaCl 会进行额外的代码验证(它不允许不受信任的代码重新编程段寄存器),但会更改段本身。这会导致一些问题,....阅读本文的第 3 部分。
分段的另一个用户是在 i386 上使用 W^X 技术的 OpenBSD OS(CS 分段限制) http://www.openbsd.org/papers/ven05-deraadt/mgp00010.html(整个演示文稿是http://www.openbsd。 org/papers/ven05-deraadt/index.html)