簡體   English   中英

用mmap映射的內存,與mprotect一起使用

[英]memory mapped with mmap, and used with mprotect

我必須為線程提供內存區域並應用內存管理的基本概念。 我們的想法是創建一個線程本地存儲,並通過寫入,讀取,克隆和擦除來管理。 問題是當我嘗試使用mprotect與TLS中的線程關聯的頁面取消保護時,這會向我發送錯誤。 這是我的結構:

每頁的分配

int cnt;
for (cnt = 0; cnt < page_num; cnt++) {
    struct page *p;
    p = (struct page *) calloc(1, sizeof(struct page));

    int *map =  mmap(0, page_size, 0, MAP_ANON | MAP_PRIVATE, 0, 0);
    if (map == MAP_FAILED) {
        perror("Error mmapping the file");
        exit(EXIT_FAILURE);
    }

    p->address = (unsigned int)map; 

它由mmap映射,但是當我嘗試使用此代碼保護頁面時(或者unprotect我有相同的錯誤,並且它是我第一次嘗試)

for(int i = 0; i < currentTLS->page_num; i++){
    tls_unprotect(currentTLS->pages[i]);
}

方法tls_unprotect:

void tls_protect(struct page *p){
  if (mprotect((void *) p->address,PAGESIZE, PROT_READ | PROT_WRITE)) {
      fprintf(stderr, "tls_unprotect: could not unprotect page\n");
      exit(errno);
  }
} 

保護方法是一樣的。

errorno代碼是12。

我感謝任何幫助。 謝謝。

p->address = (unsigned int)map; 

演員陣容非常可疑。 在大多數64位系統(包括OS X AFAIK)上, int是32位寬,因此太短而無法容納指針。
該轉換會丟棄組成指針的8個字節。

p->address應該聲明為void* ,並且該賦值應該根本不需要轉換。 如果需要將其存儲為無符號整數類型,請使用uintptr_t (在<stdint.h> ,C99中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM