gpt4 book ai didi

linux - 如何限制32位应用程序在64位Linux上的地址空间为3GB?

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:24 25 4
gpt4 key购买 nike

是否可以让 64 位 Linux 加载程序将加载的 32 位程序的地址空间限制在某个上限?

或者在地址空间中设置一些空洞,不让内核分配?

我的意思是针对特定的可执行文件,而不是针对所有进程全局,也不是​​通过内核配置。一些代码或 ELF 可执行标志是适当解决方案的示例。

对于所有加载的共享库也应该强制限制。

澄清:

我要解决的问题是我的代码使用 0xc0000000 以上的数字作为句柄值,我想清楚地区分句柄值和内存地址,即使内存地址是由某些第三方库函数分配和返回的.

只要 64 位 Linux 中的地址空间非常接近 4G 限制,就没有足够的寻址空间留给句柄值。

另一方面,3GB 或更少内存足以满足我的所有需求。

最佳答案

好的,我在别处找到了这个问题的答案。

解决方案是使用 Linux 系统调用 sys_personality 将程序的“个性”更改为 PER_LINUX32_3GB。

但是有个问题。切换到 PER_LINUX32_3GB 后,Linux 内核将不会在上面的 1GB 分配空间,但是已经分配的空间,例如应用程序堆栈,仍然保留在那里。

解决方案是通过 sys_execve 系统调用“重启”你的程序。

这是我将所有内容打包在一起的代码:

proc ___SwitchLinuxTo3GB
begin
cmp esp, $c0000000
jb .finish ; the system is native 32bit

; check the current personality.

mov eax, sys_personality
mov ebx, -1
int $80

; and exit if it is what intended

test eax, ADDR_LIMIT_3GB
jnz .finish ; everything is OK.

; set the needed personality

mov eax, sys_personality
mov ebx, PER_LINUX32_3GB
int $80

; and restart the process

mov eax, [esp+4] ; argument count
mov ebx, [esp+8] ; the filename of the executable.
lea ecx, [esp+8] ; the arguments list.
lea edx, [ecx+4*eax+4] ; the environment list.

mov eax, sys_execve
int $80

; if something gone wrong, it comes here and stops!
int3

.finish:
return
endp

关于linux - 如何限制32位应用程序在64位Linux上的地址空间为3GB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35913140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com