linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...
嘗試測試時是否允許訪問跨越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
另外,什么支票在中拒絕它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 00:00 0 ### the mmap(0) result
08048000-08049000 r-xp 00000000 00:15 3120510 /home/peter/src/SO/a.out
08049000-0804a000 r--p 00000000 00:15 3120510 /home/peter/src/SO/a.out
0804a000-0804b000 rw-p 00001000 00:15 3120510 /home/peter/src/SO/a.out
f7d81000-f7f3a000 r-xp 00000000 00:15 1511498 /usr/lib32/libc-2.25.so
f7f3a000-f7f3c000 r--p 001b8000 00:15 1511498 /usr/lib32/libc-2.25.so
f7f3c000-f7f3d000 rw-p 001ba000 00:15 1511498 /usr/lib32/libc-2.25.so
f7f3d000-f7f40000 rw-p 00000000 00:00 0
f7f7c000-f7f7e000 rw-p 00000000 00:00 0
f7f7e000-f7f81000 r--p 00000000 00:00 0 [vvar]
f7f81000-f7f83000 r-xp 00000000 00:00 0 [vdso]
f7f83000-f7fa6000 r-xp 00000000 00:15 1511499 /usr/lib32/ld-2.25.so
f7fa6000-f7fa7000 r--p 00022000 00:15 1511499 /usr/lib32/ld-2.25.so
f7fa7000-f7fa8000 rw-p 00023000 00:15 1511499 /usr/lib32/ld-2.25.so
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]
是否有沒有出現的VMA區域maps仍然說服內核拒絕該地址?我查看了ENOMEMin 的出現linux/mm/mmapc.,但是要閱讀很多代碼,所以也許我錯過了一些東西。保留一些高地址范圍的東西,還是因為它在堆棧旁邊?
以其他順序進行系統調用無濟于事(但是PAGE_ALIGN和類似的宏會被仔細地編寫,以避免在屏蔽之前回繞,因此無論如何都不可能。)
完整源代碼,使用編譯gcc -O3 -fno-pie -no-pie -m32 address-wrap.c:
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
(我省去了嘗試取消引用的部分,(int*)-2因為它在mmap失敗時只會出現段錯誤。)
總結
以上是生活随笔為你收集整理的linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vga显卡下载 linux,下载:NVI
- 下一篇: c语言编程房屋中介系统,房地产经纪人优题