gpt4 book ai didi

c - 使用 mmap 映射的内存,并与 mprotect 一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:20 41 4
gpt4 key购买 nike

我必须为线程提供内存区域并应用内存管理的基本概念。这个想法是创建一个线程本地存储,并管理写入、读取、克隆和删除。问题是当我尝试使用 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);
}
}

保护方法同上。

errorno 代码是 12。

我感谢任何形式的帮助。谢谢。

最佳答案

p->address = (unsigned int)map; 

这个类型转换非常可疑。在大多数 64 位系统(包括 OS X AFAIK)上,int是 32 位宽,太短了,无法容纳指针。
该转换删除了构成指针的 8 个字节中的 4 个字节。

p->address应声明为 void* ,并且该作业根本不需要强制转换。如果您需要将其存储为无符号整数类型,请使用 uintptr_t (在 <stdint.h> 中,C99)。

关于c - 使用 mmap 映射的内存,并与 mprotect 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790294/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com