mmap地图大小限制

时间:2012-11-07 16:56:52

标签: c++ segmentation-fault mmap memcpy sigsegv

  

可能重复:
  Getting segmentation fault SIGSEGV in memcpy after mmap

我在我的cpp代码中使用mmap()来映射一个大的区域(100,000,000字节~100MB)。

从man mmap我明白我只能知道它是否成功,我不知道它成功绘制了多少大小。

在我的情况下,我可以使用8192字节的缓冲区迭代地读取该区域,但是在读取~24MB后我得到SIGSEGV - 意味着mmap没有成功映射整个区域? / p>

我正在通过memcpy函数读取从映射区域复制到堆上的缓冲区。 (当缓冲区在堆栈上时,我也看到相同的行为。)

我怎么知道它是否映射了整个区域?如果它映射了整个区域,那么为什么在读取大约24MB的字节后得到SIGSEGV?

谢谢!

2 个答案:

答案 0 :(得分:6)

int *  addr = reinterpret_cast<int *>(mmap(NULL, length , PROT_READ, flags , fd, 0));
// ...    
int * initaddr = addr;

char buffer[jbuffer_size];

void *ret_val = buffer;
int read_length = length;

while(ret_val == buffer || read_length<jbuffer_size) {
    ret_val = memcpy(buffer, addr,jbuffer_size);
    addr+=jbuffer_size;
    read_length -= jbuffer_size;
}

所以,你的终止条件看起来是错误的:你递减 read_length并循环直到它小于 buffer_size

此外,您将addr增加buffer_size 整数(它是int*),不是字节。所以,你要快{4}推进addr

BTW,在其他代码中:lseek接受并返回off_t,而不是size_t


编辑:其中大部分错误已在其他问题中指出,所以我不确定这个会增加任何内容。

答案 1 :(得分:2)

如果您遇到分段违规,那不是因为mmap没有成功,而是因为其他原因。您正尝试访问映射到进程虚拟内存的任何区域之外的段。

根据程序分配的地图集检查程序的内存访问。请考虑利用pmapstracegdb