我想在Linux中为特定地址分配内存。 其实我想做的事情如下: 我会有一些过程。 每个进程都会调用库中的初始化函数(由我编写),它将在进程的地址空间中分配一些内存(这将存储与进程相关的信息)。这将由每个过程完成
一旦分配了这个内存,程序就会调用库中的其他函数。现在这些函数想要通过第一个函数访问分配的内存(包含进程相关信息)。
问题是我无法存储在库中的进程地址空间中分配的内存的地址(即使在静态指针中也没有进程数),我甚至不希望用户程序存储该地址。我只是不希望用户程序知道库在其地址空间中分配了内存。库函数将是它们的抽象,它们必须只使用它们。
是否有可能解决这个问题。 我想的是,每当任何进程调用分配内存的库的初始化函数时,内存总是在所有进程中被分配在相同的地址(比如10000),而不管其他所有事情。
因此,任何想要访问该内存的库函数都可以通过以下方式轻松完成:
char *p=10000;
然后访问,它将访问调用库函数的进程的地址空间。
答案 0 :(得分:4)
不是100%我得到了你的目标,但如果你想将内存映射到一个特定的设置地址,你可以使用MAP_FIXED标志来mmap():
“当在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
答案 1 :(得分:0)
你的问题没有意义。正如您提出的问题,库中的全局变量可以正常工作。
也许您说“单个进程可能会加载/卸载您的库,然后再次加载库并希望第二次加载时使用该地址”。也许你说“有2个库,每个库需要相同的地址”。简单。使用setenv()和getenv()。这些将存储/检索任何可以在具有PROCESS WIDE SCOPE的变量中表示为字符串的内容....即所有库都可以看到相同的环境变量。只需将您的地址转换为字符串(itoa),使用setenv()将其保存在名为“__SuperSecretGlobalAddress__”的环境变量中,然后使用getenv()来检索该值。
当您的程序启动时,会为您的进程创建一个shell环境的副本。 getenv和setenv访问并修改该副本。您无法使用这些功能更改shell的环境。
请参阅this post。