2015-03-25 60 views
2

而不會輸入太多細節,我正在爲支持DMA的fpga pci板編寫此設備驅動程序。 有一種情況,電路板在內存中用一些數據寫入一個ACK。這個數據實際上是一個指向我以前分配的內存中的結構體的指針,通過使用寄存器將指針通知給主板。因此,我使用電路板寫入的數據來解引用內存區域。 因爲我們仍然處於這個開發板的調試階段,所以我不能完全確定DMA寫入的數據,所以它恰好去掉了一個無效指針(因爲DMA寫入的數據不一致)。檢查是否可以從linux內核空間訪問內存地址

我的問題是:有沒有辦法在訪問它之前檢查內存指針(從內核空間),而不會產生無效的訪問和/或內核恐慌?

+0

什麼檢查PTE和PTE的標誌嗎? – 2015-03-25 17:29:24

+0

而不是使用絕對內存地址(您不知道如何輕鬆驗證),請考慮使用索引或相對內存地址(可以驗證)。 – sawdust 2015-03-25 18:31:59

回答

1

在32位系統中,虛擬內存尋址以下列方式

0x00000000    0xc0000000 0xffffffff 
    |      |   | 
    +------------------------+----------+ 
    | User     | Kernel | 
    | space     | space | 
    +------------------------+----------+ 

所以,如果我沒有錯,你總是可以檢查你的指針是否在下列範圍內diveded(這是低內存)

0xc0000000 - 0xffffffff 
3'221'225'472 - 4'294'967'295 

但我不是一個Linux內核專家,所以它可能是有更好的,更安全的方法來實現這一

+0

我認爲這不會解決我的問題...這對檢查內核空間的地址是否「有效」很有用,但是如果我取消引用指向可能未被轉換的「有效」虛擬地址的指針成爲一個有效的物理文件,我將獲得無效的內存訪問... – Michele 2015-03-25 10:17:48

+0

中的函數將爲您提供虛擬到實體的翻譯(請參閱http://www.tldp.org/LDP/khg/HyperNews/get /devices/addrxlate.html),但我不確定你是否可以使用它來檢查地址是否被分配......因爲這是用於調試的,你能否存儲一個包含所有分配的全局列表並檢查它取消引用一個指針? – spiffman 2015-03-25 19:58:10

相關問題