【问题标题】:x86 Segmentation in User-Mode用户模式下的 x86 分段
【发布时间】:2011-06-28 22:44:17
【问题描述】:

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

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

【问题讨论】:

    标签: x86 memory-segmentation


    【解决方案1】:

    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 部分。

    分段的另一个用户是 OpenBSD OS 在 i386 上使用 W^X 技术(CS 分段限制) http://www.openbsd.org/papers/ven05-deraadt/mgp00010.html(整个演示文稿是http://www.openbsd.org/papers/ven05-deraadt/index.html

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 2018-04-13
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      相关资源
      最近更新 更多