32位进程在64位Linux上有多少虚拟内存(即malloc()在开始获取NULL指针之前我可以分配和使用多少内存)?
我在32位Linux上尝试过,达到了约3 GB的限制.我能在64位Linux上获得更多?
尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页。
之后echo 0 | sudo tee /proc/sys/vm/mmap_min_addr,我可以映射零页面,但是我不知道为什么不能映射-4096(即(void*)0xfffff000最高页面)。 为什么要mmap2((void*)-4096)退货-ENOMEM?
strace ./a.out
execve("./a.out", ["./a.out"], 0x7ffe08827c10 /* 65 vars */) = 0
strace: [ Process PID=1407 runs in 32 bit mode. ]
....
mmap2(0xfffff000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0
Run Code Online (Sandbox Code Playgroud)
另外,什么支票在中拒绝它linux/mm/mmap.c,为什么要这样设计?这是确保创建指向一个过去的对象的指针不会回绕并中断指针比较的部分吗,因为ISO C和C ++允许创建指向过去的一个指针,但不能在外部对象。
我在64位内核(Arch Linux上为4.12.8-2-ARCH)下运行,因此32位用户空间具有整个可用的4GiB。(与64位内核或32位内核(其中2:2或3:1用户/内核拆分会使高页成为内核地址)上的64位代码不同。)
我没有尝试使用最小的静态可执行文件(没有CRT启动程序或libc,只有asm),因为我认为这不会有所作为。没有一个CRT启动系统调用看起来可疑。
在断点处停下来时,我检查了一下/proc/PID/maps。主页尚未使用。堆栈包括第二高的页面,但未映射首页。
00000000-00001000 rw-p 00000000 …Run Code Online (Sandbox Code Playgroud)