2011-04-06 34 views
0

我想在特定地址的Linux进程中分配内存。 其实我想这样做: 我会有一些进程。每个进程都会调用库中的一个初始化函数(由我编写),它将在进程的地址空间中分配一些内存(它将存储进程相关的信息)。这将通过每个进程完成在Linux中分配特定地址

一旦分配了这个内存,后面的程序将调用库中的其他函数。现在这些函数想要通过第一个函数访问分配的内存(包含与进程有关的信息)。

问题是我不能在库中的进程地址空间中存储分配的内存地址(即使在静态指针中也没有,因为有多少进程),我甚至不希望用户程序存储该地址。我只是不希望用户程序知道在地址空间中有由库分配的内存。库函数将为他们抽象,他们必须使用它们。

是否有可能超过这个问题。 我在想,当任何进程调用分配内存的库的初始化函数时,内存总是在所有进程中被分配到相同的地址(比如说10000),而不管其他所有事情。

所以这其中要访问内存中的所有库函数可以很容易地做到: char *p=10000;

,然后访问,这将是进入到这被称为库函数的进程的地址空间。

+1

这个问题有点含糊。你有特定的用例吗? – 2011-04-06 18:20:47

+0

为什么图书馆不能跟踪分配?例如,在一个动态列表中。 – jwd 2011-04-06 18:40:06

回答

4

不是100%我得到了你的目标是什么,但是如果你想要内存映射到一组特定的地址,你可以使用MAP_FIXED标志的mmap():

“当MAP_FIXED在标志设置如果MAP_FIXED被设置,则mmap()可以返回MAP_FAILED并且将errno设置为[EINVAL]。如果MAP_FIXED请求成功,则通过mmap()建立的映射,替换范围[pa,pa + len)中的进程页面的任何先前映射。“

请参阅mmap手册页:http://linux.die.net/man/3/mmap

+3

请小心,因为MMAP_FIXED将接管已存在于该地址的任何内容。从图书馆中很难知道这个过程是否已经在那里映射了一些东西。 – jwd 2011-04-06 18:39:03

0

你的问题没有道理。正如你提到你的问题,你的库中的全局变量可以正常工作。

也许您在说“单个进程可能会加载/卸载您的库,然后再次加载库并希望第二次加载该地址”。也许你会说“有2个库,每个库需要相同的地址”。简单。使用setenv()和getenv()。这些将存储/检索任何可以在具有PROCESS WIDE SCOPE的变量中表示为字符串的任何东西....即,所有库都可以看到相同的环境变量。只需将地址转换为字符串(itoa),使用setenv()将其保存在名为“__SuperSecretGlobalAddress__”的环境变量中,然后使用getenv()检索值。

当您的程序启动时,会为您的进程创建一个shell环境的副本。 getenv和setenv访问并修改该副本。使用这些函数不能更改shell的环境。

请参阅this post