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),我再次映射它以读取:

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