当您在用户模式下运行程序时,是否可以在x86中使用分段内存?如果是这样,是否有任何工具(例如C / C ++编译器)来促进这一点?它似乎是一个非常强大的机制,允许在程序中运行程序。
我听说Chromium在Native Client中使用沙盒分段,但我不确定如何,或者它是否使用汇编或内置编译器支持。
答案 0 :(得分:2)
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)