2010-01-17 19 views
3

我有一個程序。我希望它能夠通過不同的運行來映射特定區域的內存。如何在內存中映射_particular_區域?

  1. 我有程序的源代碼。 C/C++
  2. 我控制程序的編譯方式。 gcc
  3. 我控制程序如何鏈接。 gcc
  4. 我控制程序運行的方式(Linux)。

我只是想擁有這個特定的內存區域,說0xabcdabcd到0xdeadbeef,我mmap到一個特定的文件。無論如何要保證這一點? (我必須確保其他東西沒有加載到這個特定的區域)。

編輯:

如何使確保沒有其他需要該特定區域的內存?

+0

爲什麼*特殊*區域記憶?這是什麼原因? – shylent 2010-01-17 07:24:59

+0

另請參閱:http://stackoverflow.com/questions/2084098/two-c-apps-sharing-a-read-only-region-of-memory-on-lnux。絕不是重複的,但密切相關。 – 2010-01-18 06:33:01

回答

0

你不能確定沒有其他東西需要記憶的區域 - 先到先得。但是,由於您需要內存的特定部分,因此我猜測您有一個非常專業的環境,因此您只需確保首先(使用啓動腳本)

+2

地址空間是按進程進行的,因此係統上運行的其他內容無關緊要。重要的是在進行mmap()調用之前,在當前進程中已經做了什麼,可能已經在該進程的地址空間的該區域中分配了某些內容。 – Wyzard 2010-01-17 23:23:37

+0

是的,當然,你是對的。我爲嵌入式領域而直接思考「繪製特定的物理區域」......但您可能是對的。 – e8johan 2010-01-18 07:01:44

1

將地址傳遞給地圖addr。嘗試在8KB的邊界上獲得它。不過你可以試試mlock()

7

你需要做兩件事情:

  1. 指定起始地址爲mmap的第一個參數。
  2. 包含MAP_FIXED標誌。

對於起始地址,您需要確保它是頁面大小的倍數。要獲得頁面大小,請使用調用sysconf(_SC_PAGESIZE)(這是Linux上的適當調用,其他平臺可能會有所不同)。

+2

總之,不要依賴於MAP_FIXED的工作。它可以(並因此會)失敗。 – 2010-01-17 07:33:16

+0

@theatrus - 你指的是哪個平臺。在Linux上,如果未指定MAP_FIXED,addr只會被解釋爲提示(http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html)。 – 2010-01-17 07:56:33

+2

MAP_FIXED不能保證成功 - 當然它會告訴你無法映射,但如果你的程序取決於這種行爲,那麼將有問題:) – 2010-01-17 07:58:05