SIGBUS при выполнении memcpy из буфера mmap, который находится в ОЗУ, как это определено mincore

Я отображаю блок как:

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.


person Sameer Mahajan    schedule 20.01.2014    source источник
comment
Я предполагаю, что вы на x86?   -  person Joe    schedule 20.01.2014