памет, картографирана с mmap и използвана с mprotect

Трябва да осигуря региони на памет за нишки и да приложа основни концепции за управление на паметта. Идеята е да създадете Thread Local Storage и да управлявате със запис, четене, клониране и изтриване. Проблемът е, че когато се опитам да премахна защитата с 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, но когато се опитам да защитя страницата с този код (или да премахна защитата, имам същата грешка и е при първия опит)

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);
  }
} 

Методът на защита е същият.

Кодът за грешка е 12.

Оценявам всякакъв вид помощ. Благодаря.


person gadiaz1    schedule 28.05.2012    source източник
comment
Каква ОС и размер на адреса? (Linux x86_64?)   -  person Mat    schedule 29.05.2012
comment
OS: Mac, размер на адреса x64   -  person gadiaz1    schedule 29.05.2012


Отговори (1)


p->address = (unsigned int)map; 

Този актьорски състав е много подозрителен. На повечето 64-битови системи (включително OS X AFAIK), int е 32-битов широк, така че е твърде кратък, за да задържи указател.
Това предаване изпуска 4 байта от 8-те, които съставят указател.

p->address трябва да се декларира като void* и това присвояване изобщо не трябва да се нуждае от преобразуване. Ако трябва да съхраните това като неподписан интегрален тип, използвайте uintptr_t<stdint.h>, C99).

person Mat    schedule 29.05.2012