Я отображаю блок как:
mapAddr = mmap((void*) 0, curMapSize, PROT_NONE, MAP_LOCKED|MAP_SHARED, fd, curMapOffset);
если это не сработает (mapAddr != MAP_FAILED)
, я запрашиваю mincore как:
err = mincore((char*) mapAddr, pageSize, &mincoreRet);
чтобы узнать, находится ли он в оперативной памяти. В случае, если он находится в ОЗУ (ошибка == 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.