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

时间:2016-03-10 09:58:51

标签: linux elf

是否有可能使64位Linux加载程序将加载的32位程序的地址空间限制到某个上限?

或者在地址空间设置一些不被内核分配的漏洞?

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

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

澄清:

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

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

另一方面,3GB甚至更低的空间足以满足我的所有需求。

1 个答案:

答案 0 :(得分:2)

好的,我在其他地方找到了这个问题的答案。

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

但是有一个问题。切换到PER_LINUX32_3GB后,Linux内核不会在高1GB中分配空间,但已分配的空间(例如应用程序堆栈)仍然存在。

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

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

 import urllib.request
 import cv2
 import numpy as np
 import os

def store_raw_images():
     neg_images_link = 'http://image-     net.org/api/text/imagenet.synset.geturls?wnid=n07942152'   
     neg_image_urls = urllib.request.urlopen(neg_images_link).read().decode()
     pic_num = 1

    if not os.path.exists('neg'):
        os.makedirs('neg')

   for i in neg_image_urls.split('\n'):
    try:
        print(i)
        urllib.request.urlretrieve(i, "neg/"+str(pic_num)+".jpg")
        img = cv2.imread("neg/"+str(pic_num)+".jpg",cv2.IMREAD_GRAYSCALE)
        # should be larger than samples / pos pic (so we can place our image on it)
        resized_image = cv2.resize(img, (100, 100))
        cv2.imwrite("neg/"+str(pic_num)+".jpg",resized_image)
        pic_num += 1

    except Exception as e:
        print(str(e))