日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...

發布時間:2024/1/23 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)最高虚拟页面?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。