SIGBUS, докато правите memcpy от mmap ed буфер, който е в RAM, както е идентифицирано от mincore

Аз картографирам блок като:

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.


person Sameer Mahajan    schedule 20.01.2014    source източник
comment
Предполагам, че сте на x86?   -  person Joe    schedule 20.01.2014