在Linux中分配特定地址

3
我希望在Linux进程中的特定地址分配内存。 实际上,我想做的是: 我将有许多进程。 每个进程都会调用由我编写的库中的初始化函数,该函数将在进程的地址空间中分配一些内存(其中将存储与进程相关的信息)。这将由每个进程执行。
一旦分配了这个内存,程序将在库中调用其他函数。现在,这些函数想要访问由第一个函数分配的内存(包含进程相关信息)。
问题在于我不能在库中存储进程地址空间中分配的内存的地址(甚至不能在静态指针中存储,因为有许多进程),我也不希望用户程序存储该地址。我只是不想让用户程序知道库在他们的地址空间中分配了内存。库函数将是抽象的,他们只需要使用它们。
有可能克服这个问题吗? 我想过,每当任何进程调用分配内存的库的初始化函数时,无论其他事情如何,内存总是在所有进程中的相同地址(比如10000)上分配。
这样,任何想要访问该内存的库函数都可以轻松地通过以下方式进行: char *p=10000; 然后进行访问,这将访问调用库函数的进程的地址空间。

1
这个问题有点模糊。你有具体的使用案例吗? - Peter Rowell
为什么库不能跟踪分配情况?例如在动态列表中。 - jwd
2个回答

5

我不确定你的具体需求,但如果你想将内存映射到特定地址,可以在mmap()函数中使用MAP_FIXED标志:

"当flags参数中设置了MAP_FIXED时,实现会被告知pa的值应该是确切的addr。如果设置了MAP_FIXED,则mmap()可能会返回MAP_FAILED,并将errno设置为[EINVAL]。如果MAP_FIXED请求成功,则由mmap()建立的映射将替换进程页面范围[pa, pa + len)中的任何先前映射。"

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


4
请注意,MMAP_FIXED会接管已存在于该地址的任何内容。从库的角度很难知道进程是否已经将某些内容映射到了那里。 - jwd

0

你的问题没有意义。按照你的措辞,库中的全局变量会很好地工作。

也许你是在说“单个进程可能会加载/卸载你的库,然后再次加载该库,并希望在第二次加载时获得地址”。也许你是在说“有两个库,每个库都需要相同的地址”。简单来说,使用 setenv() 和 getenv()。它们将存储/检索可以表示为字符串的任何内容,存在于具有进程范围的变量中......即所有库都可以看到相同的环境变量。只需将地址转换为字符串 (itoa),使用 setenv() 将其保存在名为 "__SuperSecretGlobalAddress__" 的环境变量中,然后使用 getenv() 检索值。

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

参见 this post


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接