OSが持っているMAP_ANONYMOUS
か/dev/zero
、それをmmap
仮想アドレス空間に最大可能なマッピングまで入れて、そこから読み取ることができた場合。
#include <sys/mman.h>
void * zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
これにより、長さの連続マッピングがnbytes
単一のゼロ化された読み取り専用ページに割り当てられるため、実際には物理メモリを使用しません。配列全体を読み取ることはできますが (ゼロのみを取得します)、書き込むことはできません。
ほとんどのシステムでは、物理的なハードウェアの制限により、最大連続仮想マッピングが制限されます。現在の x86_64 Linux は、通常、64TB の長いマッピングをサポートしています。
注: 一部のシステム (たとえば、OS X、おそらく他の BSD ベースでは、MAP_ANON
代わりにが使用されているため、正確なシステムを調べるためMAP_ANONYMOUS
に参照してください)。man 2 mmap
MAP_ANONYMOUS
がシステムでサポートされていない場合/dev/zero
、同等の方法は次のとおりです。
void * zeroed_memory;
int fd = open("/dev/zero", O_RDONLY);
if (fd > 0) {
zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE, fd, 0);
}