我将块映射为:
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 和锁定字段均为 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 上。