Аз картографирам блок като:
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
някакви мисли? Това се случва на ubuntu 12.0.4 с версия на ядрото 3.5.0-36.