我正在研究64位Linux機器上的一個程序,它需要將多個任意長度的數據數組映射到我無法控制的固定內存地址。我覺得mmap()的與MAP_FIXED和MAP_ANONYMOUS是要走的路,例如:將多個數據數組映射到任意固定內存地址
mmap((void *) 0x401000, 0x18e, PROT_NONE, MAP_ANONYMOUS | MAP_FIXED, -1, 0);
不過,我每次調用此函數時,會返回MAP_FAILED。我已經將fd設置爲-1,我知道這對某些系統是必需的,地址是我的頁面大小(4096)的倍數,並且長度是非負值,所以我想知道是否0x401000是已經被我的系統使用;我也試過0x402000,0x403000和0x404000,結果相同。
有什麼我錯過了關於mmap(),或者有沒有辦法找出這個地址已經有什麼?更妙的是,由於我無法控制我需要的地址,有沒有更好的方法來避免遇到現有的映射?
編輯:檢查errno
後,我發現,我得到的代碼是一個無效的參數,因此,根據手冊頁,「我們不喜歡地址,長度或偏移(例如,他們太大或者不在頁面邊界上對齊)。「不過,我還不知道哪一個是問題所在。
我發現我的代碼失敗了,並給出了無效的參數錯誤,因爲我沒有在'flags'參數中指定'MAP_FIXED'或'MAP_SHARED'。在我解決這個問題之後,只有映射到0x401000纔會失敗,並且只有在使用了MAP_FIXED時,它看起來好像有些東西佔用了那個地址。謝謝你的幫助! – nosuchthingasstars 2012-07-30 14:44:03