これは、2.6.26-2-amd64 Linuxカーネルで、コピーオンライトセマンティクス(PROT_READ | PROT_WRITEおよびMAP_PRIVATE)を使用して5GBファイルをmmapしようとしたときに発生します。4GB未満のファイルのマッピング、またはPROT_READのみを使用したファイルは正常に機能します。この質問で報告されているように、これはソフトリソース制限の問題ではありません。仮想制限サイズは無制限です。
これが問題を再現するコードです(実際のコードはBoost.Interprocessの一部です)。
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
main()
{
struct stat b;
void *base;
int fd = open("foo.bin", O_RDWR);
fstat(fd, &b);
base = mmap(0, b.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (base == MAP_FAILED) {
perror("mmap");
return 1;
}
return 0;
}
そしてここに何が起こるかです:
dd if=/dev/zero of=foo.bin bs=1M seek=5000 count=1
./test-mmap
mmap: Cannot allocate memory
これは、nosによって尋ねられた、関連するstrace(新しくコンパイルされた4.5.20)の出力です。
open("foo.bin", O_RDWR) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5243928576, ...}) = 0
mmap(NULL, 5243928576, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = -1 ENOMEM (Cannot allocate memory)
dup(2) = 4
[...]
write(4, "mmap: Cannot allocate memory\n", 29mmap: Cannot allocate memory
) = 29