【问题标题】:Allocating specific address in Linux在 Linux 中分配特定地址
【发布时间】:2011-04-06 18:17:39
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 这个问题有点含糊。您有特定的用例吗?
  • 为什么图书馆不能跟踪分配情况?例如,在动态列表中。

标签: linux malloc virtual-memory


【解决方案1】:

不是 100% 我得到了你的目标,但如果你想将内存映射到特定的设置地址,你可以使用 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

【讨论】:

  • 请小心,因为 MMAP_FIXED 将接管该地址中已经存在的任何内容。从库中很难知道该进程是否已经在其中映射了某些内容。
【解决方案2】:

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

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

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

this post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2018-12-19
    • 1970-01-01
    • 2015-11-05
    • 2015-04-19
    相关资源
    最近更新 更多