3

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

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

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

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

因此,任何想要访问该内存的库函数都可以通过以下方式轻松完成: char *p=10000;

然后访问,就是访问调用库函数的进程的地址空间。

4

2 回答 2

5

Not 100% I got what you are aiming for, but if you want to map memory into a specific set address you can use the MAP_FIXED flag to mmap():

"When MAP_FIXED is set in the flags argument, the implementation is informed that the value of pa shall be addr, exactly. If MAP_FIXED is set, mmap() may return MAP_FAILED and set errno to [EINVAL]. If a MAP_FIXED request is successful, the mapping established by mmap() replaces any previous mappings for the process' pages in the range [pa,pa+len)."

See mmap man page: http://linux.die.net/man/3/mmap

于 2011-04-06T18:24:57.993 回答
0

你的问题没有意义。正如您所提出的问题,库中的全局变量可以正常工作。

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

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

看到这个帖子

于 2011-04-07T00:23:14.967 回答