3

私はブロックを次のようにマッピングしています:

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 で発生しています。

4

0 に答える 0