2011-04-06 33 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