运行以下代码时出现分段错误...

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0 );

x[0] = 42; // <--- Segmentation fault happens due to this

怎么了

===============>>#1 票数:9

您指定了不正确的标志和文件描述符。 看起来您想要的是匿名(没有文件支持)映射。 如果是这样,正确的调用将是:

x = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

您需要使用MAP_ANONYMOUS标志来告诉Linux没有文件。 并且您应该为文件描述符传递-1 ,而不是0。

===============>>#2 票数:1

好,我知道了。 我忘了放MAP_ANONYMOUS了 ,所以应该是这样的...

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 
  0, 0 );

它以这种方式工作。

===============>>#3 票数:1

man mmap说:

On success, mmap() returns a pointer to the mapped area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropriately

检查x == MAP_FAILED是否x == MAP_FAILED 可能是这种情况。

===============>>#4 票数:0

而且,您应始终检查mmap的结果是否不是MAP_FAILED (即(void *) -1 ),并在这种情况下使用errno获取错误代码。

您的mmap可能会失败(例如,由于使用setrlimit设置的资源限制或交换空间已满)。

  ask by MetallicPriest translate from so

未解决问题?本站智能推荐:

3回复

如果禁用ASLR,mmap是否确定?

如果禁用地址空间布局随机化(ASLR),我们是否会有确定性的mmap ? 通过确定性,我的意思是如果我使用相同的输入一次又一次地运行相同的应用程序,我将获得mmap返回的相同地址吗? 我最感兴趣的是匿名mmaps。
4回复

posix_memalign与mmap有何不同

对齐大小为4096字节的posix_memalign与mmap有何不同? 它在内部使用mmap还是其他某种机制?
3回复

带有MAP_NORESERVE的mmap是否会保留物理内存?

mmap文档说明关于标志MAP_NORESERVE。 不要为此映射保留交换空间。 保留交换空间时,可以保证可以修改映射。 如果没有保留交换空间,如果没有可用的物理内存,则可能在写入时获得SIGSEGV。 实际上我想要的只是保留虚拟内存地址而不是分配实际的物理内存。 可以使
2回复

带/ dev / zero的mmap

假设我使用/ dev / zero为mmap分配一个大内存(40MB),如下所示。 我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我认为现代Linux内核使用Demand分页 )。 因此,例如,当第一页被触摸并因此被带入物理存储器时,内核将其所有4096字节初始化为零,然
1回复

使用mmap和madvise用于大页面

我想在Linux机器使用的大页面上分配内存。 我看到有两种方法可以做到这一点,使用mmap和madvise 。 也就是说,使用带有mmap调用的MAP_HUGETLB标志 - 带有madvise呼叫的MADV_HUGEPAGE标志 - 有人可以解释两者之间的区别吗?
1回复

mmap返回无法分配内存,即使有足够的内存

我正在用leveldb进行压力测试。 在util/env_poisx.cc : NewRandomAccessFile() 在插入300万个数据(每个100k)之后。 errno说Cannot allocate memory 。 为什么? 更多细节: 最佳:
5回复

使用mmap和munmap实现自己的malloc / free

我已经通过自己的malloc实现并免费使用mmap 。 现在,由于与free不同, munmap也将length作为参数,因此我将length作为附加信息放在映射的内存中。 我的malloc和free的代码如下所示。 我想问一下,如果这段代码是好的还是我仍然遗漏任何东西或以错误的方式做
3回复

如果我使用mmap而不是malloc分配内存怎么办?

使用mmap (使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存比使用malloc什么缺点? 对于函数作用域中的数据,我会使用堆栈内存,因此不使用malloc. 想到的一个缺点是动态数据结构,例如树和链表,您经常需要分配和释放小块数据。 由于两个原因,使用mmap会很昂
4回复

为什么调用大尺寸的mmap()不会失败?

我尝试使用mmap()来操纵虚拟内存。 我想保留并提交一个内存区域。 我测试了这段代码: 我从终端运行了我的程序的多个副本(例如6)。 我从没看过“内存分配失败”。 我在具有4GB RAM的64位Ubuntu上运行。 谁能告诉我一些有关此的信息?
2回复

mmap(2)返回的地址是否有可能与堆冲突?

如果我使用mmap(2)分配了一些页面而没有提供地址提示,后来又使用malloc(3) / calloc(3)分配了一些内存,则malloc有可能调用sbrk(2)并在它与我先前对mmap调用返回的地址重叠的方式还是总是保证mmap返回远离堆或堆栈的地址?