2011-02-17 25 views
2

當用戶模式下運行程序時,x86中是否可以使用分段內存?如果是這樣,是否有任何工具(例如C/C++編譯器)來實現這一點?它似乎是一個非常強大的機制,允許程序內運行程序。用戶模式下的x86分段

我聽說Chromium在Native Client中使用分段來實現沙箱化,但我不確定它是如何實現的,或者它是否使用匯編或內置編譯器支持。

回答

2

本機客戶端同時使用編譯器的支持和組件(該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)); 
} 

所以,這是可能的,但比較硬編程。

有一個關於本機客戶端紙:http://nativeclient.googlecode.com/svn/trunk/src/native_client/documentation/nacl_paper.pdf

氯化鈉確實額外的代碼驗證(它不允許不可信代碼重新編程段寄存器),但改變了段本身。這會導致一些問題,......請閱讀論文的第3部分。

分割的另一個用戶是OpenBSD的OS爲W^X技術在i386(CS段限制性的) http://www.openbsd.org/papers/ven05-deraadt/mgp00010.html(整個演示是http://www.openbsd.org/papers/ven05-deraadt/index.html