私はブロックを次のようにマッピングしています:
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)、次のように読み取るために再度 mmap します。
copyAddr = mmap((void*) 0, curMapSize, PROT_READ, MAP_LOCKED|MAP_SHARED, fd, curMapOffset);
次に、次のようにバッファにコピーしようとします。
memcpy(data, copyAddr, pageSize);
たまに最後の memcpy で SIGBUS を取得する場合を除いて、すべて正常に動作します。失敗時に/proc/ /smapsを確認すると、以下に示すように Rss フィールドと Locked フィールドが 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 で発生しています。