用户模式下的x86分段

时间:2011-02-17 08:54:31

标签: x86 memory-segmentation

当您在用户模式下运行程序时,是否可以在x86中使用分段内存?如果是这样,是否有任何工具(例如C / C ++编译器)来促进这一点?它似乎是一个非常强大的机制,允许在程序中运行程序。

我听说Chromium在Native Client中使用沙盒分段,但我不确定如何,或者它是否使用汇编或内置编译器支持。

1 个答案:

答案 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