SIGBUS,同时从minmap中确定的RAM中的mmap ed缓冲区执行memcpy

我正在拼图块:

mapAddr = mmap((void*) 0, curMapSize, PROT_NONE, MAP_LOCKED|MAP_SHARED, fd, curMapOffset);

如果这不失败(mapAddr != MAP_FAILED)我查询mincore为:

err = mincore((char*) mapAddr, pageSize, &mincoreRet);

找出是否在RAM中。 如果它在RAM(err == 0 && mincoreRet&0x01),我再次映射它读取作为:

copyAddr = mmap((void*) 0, curMapSize, PROT_READ, MAP_LOCKED|MAP_SHARED, fd, curMapOffset);

然后我尝试将其复制到我的缓冲区中,如下所示:

memcpy(data, copyAddr, pageSize);

一切工作正常,除了在最后一个memcpy一次,我得到了SIGBUS。 当我检查/ proc / / smaps在失败的时候,我注意到它有Rss以及locking字段为0,如下所示:

 7f4a4c118000-7f4a4c119000 r--s 00326000 00:17 6 <file name> Size: 4 kB Rss: 0 kB Pss: 0 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 0 kB Anonymous: 0 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB 

有什么想法吗? 这发生在内核版本为3.5.0-36的Ubuntu 12.0.4上。

Solutions Collecting From Web of "SIGBUS,同时从minmap中确定的RAM中的mmap ed缓冲区执行memcpy"