是否有可能使64位Linux加载程序将加载的32位程序的地址空间限制到某个上限?
或者在地址空间设置一些不被内核分配的漏洞?
我的意思是特定的可执行文件,不是全局的所有进程,也不是通过内核配置。一些代码或ELF可执行标志是适当解决方案的示例。
也应该强制所有加载的共享库的限制。
我想解决的问题是我的代码使用0xc0000000以上的数字作为句柄值,我想明确区分句柄值和内存地址,即使内存地址是由某些第三方库函数分配和返回的
只要64位Linux中的地址空间非常接近4G限制,就没有足够的寻址空间来处理句柄值。
另一方面,3GB甚至更低的空间足以满足我的所有需求。
答案 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))