2012-08-24 32 views
-1

許多操作系統都允許一個存儲映射文件,並且懶惰地讀取它們。如果操作系統可以有效地執行此操作,則它可以從thunk創建常規指針。任何操作系統是否允許應用程序員通過thunk創建指針?

任何操作系統是否允許應用程序員從他自己的thunk中創建指針?我知道在一定程度上操作系統已經支持這個功能,因爲可以創建一個管道,將它映射到內存中,並將一個進程連接到管道來完成我正在討論的一些內容,所以這個功能不會似乎不太可能或不合理。

此功能的一個簡單示例是一個指針,它可以計算被解除引用的次數。以下程序將輸出零,然後一個。

static void setter(void* environment, void* input) { 
/* You can't set the counter */ 
} 

static void getter(void* environment, void* output) { 
    *((int*)output) = *((int*)environment)++; 
} 

int main(int argc, char** argv) { 
volatile int counter = 0; 
volatile int * const x = map_special_voodoo_magic(getter, setter, sizeof(*x), 
                &counter); 

printf("%i\n", *x); 
printf("%i\n", *x); 

unmap_special_voodoo_magic(x); 
} 

P.S.揮發性限定符是必需的,因爲x指向的值意外地改變了嗎?另外,編譯器沒有理由認爲解引用x會改變計數器,所以在那裏需要一個volatile。

+2

'如果操作系統可以有效地執行此操作,那麼它就有能力通過thunk創建常規指針。 –

+0

@RobertHarvey thunk是一種懶散評估的數據。內存映射文件被懶惰地讀取。因此,內存映射文件是thunk的流,並且還有一個指向它的指針。 –

+0

你的邏輯有問題。這有點像說狗是男人最好的朋友,每個人都需要一個朋友,所以每個人都應該有一隻狗。 –

回答

1

以下代碼沒有錯誤檢查,也不是完整的實現。但是,下面的代碼確實說明了如何將thunk轉換爲指針的基本思路。特別是,值4是根據需求計算的,而不是先前分配給內存。

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/mman.h> 
#include <signal.h> 

void * value; 

static void catch_function(int signal, siginfo_t* siginfo, 
       void* context) { 
    if (value != siginfo->si_addr) { 
     puts("ERROR: Wrong address!"); 
     exit(1); 
    } 

    mmap(value, sizeof(int), PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED 
         | MAP_ANON, -1, 0); 

    *((int*)value) = 2 * 2; 
} 

int main(void) { 
    struct sigaction new_action; 

    value = mmap(NULL, sizeof(int), PROT_NONE, MAP_ANON | MAP_SHARED, -1, 
        0); 

    sigemptyset(&new_action.sa_mask); 

    new_action.sa_sigaction = catch_function; 
    new_action.sa_flags = SA_SIGINFO; 

    sigaction(SIGBUS, &new_action, NULL); 

    printf("The square of 2 is: %i\n", *((int*)value)); 

    munmap(value, sizeof(int)); 

    return 0; 
} 
相關問題