我必须为线程提供内存区域并应用内存管理的基本概念。这个想法是创建一个线程本地存储,并通过写入、读取和克隆以及擦除来管理。问题是当我尝试使用 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 pagen");
exit(errno);
}
}
保护方法是相同的。
错误无代码为 12。
我感谢任何形式的帮助。谢谢。
p->address = (unsigned int)map;
这个演员阵容非常可疑。在大多数 64 位系统(包括 OS X AFAIK)上,int
的宽度为 32 位,因此太短而无法容纳指针。
该强制转换会丢弃组成指针的 8 个字节中的 4 个字节。
p->address
应该被声明为void*
,并且该赋值根本不需要强制转换。如果需要将其存储为无符号整型,请使用uintptr_t
(在 <stdint.h>
中,C99)。