2012-07-02 55 views
-1

我想在兩個進程之間共享內存。
mmap()之後,我得到一個地址mapStart,然後我給mapStart加上偏移量並得到mapAddr,並確保mapAddr不會超過maped PAGE_SIZE。
當我寫mapAddrmmap()之後,寫入返回的地址是可以的,但讀取會導致系統崩潰。爲什麼?

memcpy((void *)mapAddr, data, size); 

一切正常。

但是當我通過

memcpy(&data, (void *)mapAddr, size);` 

即會情況下系統崩潰從mapAddr讀取。
誰知道爲什麼? The similar problem is here

添加一些信息: @Tony德爾羅伊,@ J-16 SDiZ
MMAP功能是:

mapStart = (void volatile *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, memfd, pa_base); 

系統崩潰:沒有任何操作系統錯誤消息,控制檯打印一些MCA信息

詳細描述在here

+2

這是一個瘋狂的想法 - 爲什麼不顯示代碼爲'mmap()'準備參數?很可能保護標誌缺少'PROT_READ',但我們怎麼說呢? –

+2

什麼樣的「系統崩潰」? sigfault?內核恐慌?給出錯誤消息。 –

+0

你在其他帖子中提到過IA64,這是否是同一個拱? –

回答

1

只是一些想法。

是您mmap()跨越具有不同屬性的內存區域?這是非法的。 舊內核(你說2.6.18)允許這一點,但是當你寫一些吧崩潰。

this post一些出發點。如果可能的話,嘗試一個更新的內核。

1

至少有兩個可能的問題:

的mmap()後,我得到一個地址mapStart,然後我加偏移mapStart並獲得mapAddr,並確保mapAddr不會超過馬培德PAGE_SIZE。

不是mapAddr必須確保不超過映射的大小,但mapAddr+size。您正嘗試觸摸size字節,而不僅僅是一個。

memcpy((void *)mapAddr, data, size); 
memcpy(&data, (void *)mapAddr, size); 

假設data是不是一個陣列(這是一個合理的假設,因爲你在第一行中使用它沒有地址運算符),第二行拷貝指向由數據的位置,以數據開頭。這很可能是一些未分配的內存,或堆棧中的某個位置,或其他。如果堆棧中沒有太多的東西,它可能會在堆棧的末尾讀入文本段,或者......其他東西。

(如果data確實是一個陣列,當然等同的,但你的代碼風格,將是不一致的。)

+0

首先:我可以確保'mapAddr + size'(程序測試)不會超過映射的大小。第二:數據是長型的,尺寸是8,所以我認爲這不會造成問題。 –

+0

「第二:數據是長型的」 - 在這種情況下,數據是數據的地址,並且崩潰的原因正如我告訴過你的。您從數據地址開始讀取「一些未定義的內存範圍」。除去操作符地址('&'),還想使用指針指向需要指針的地方。使用'long'指針類型的工作在C中,因爲C對類型不那麼嚴格,但在技術上是錯誤的。一個指針和一個整數(或者,如果你願意的話)是不一樣的。 – Damon

+0

非常感謝,對不起,應該沒有'&',這是我的錯。但刪除'&'仍然無法解決問題。我也試過'printf(「%ld」,(long)(*(long *)mapAddr));'也導致系統崩潰,我使用'memcpy()'只是因爲它看起來是一個正式的讀取。 –

相關問題