MMAP地图尺寸限制

mmap map size limit

本文关键字:地图 MMAP      更新时间:2023-10-16

可能的重复:
在mmap之后,在memcpy中获取分割故障

我正在使用CPP代码中的MMAP()来映射大尺寸区域(100,000,000字节〜100MB)。

从man mmap中,我知道我只知道它是否成功,我不知道它成功地映射了多少尺寸。

就我而言,我可以用8192字节的缓冲区迭代地读取该区域,但是在阅读〜24MB后,我会得到Sigsegv-表示MMAP并未成功地映射整个区域吗?<<<<<</p>

我正在阅读一个memcpy功能,以从映射区域复制到堆上的缓冲区。(当缓冲区在堆上时,我也看到相同的行为)。

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

谢谢!

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 and循环,直到小于 buffer_size

另外,您正在通过buffer_size Integers 递增addr(这是int*),不是 bytes。因此,您正在前进addr 4次太快。

btw,在其他代码中: lseek拿来并返回 off_t,而不是 size_t


编辑:这些错误中的大多数已经在另一个问题中指出,所以我不确定这会添加任何内容。

如果违反细分,这并不是因为mmap没有成功,而是因为其他事情。您正在尝试访问映射到过程的"虚拟内存"的任何区域之外的细分市场。

根据您的程序分配的一组地图,检查程序的内存访问。考虑利用pmapstracegdb