2016-07-20 57 views
3

我希望在C中模擬一個存儲器映射設備,以便對設備包裝庫(在Linux中)進行有效的單元測試。在用戶空間中嘲笑C中的存儲器映射設備

現在,我知道我可以mmap一個文件描述符到用戶空間,原則上可以代表所述設備的模擬。因此,AFAICT,我的問題歸結爲:是否有可能在用戶空間創建一個文件描述符,其中mmap可以採取行動,讀寫由適當的回調處理?

另外,也許這是一個解決的問題,有一個已知的內核驅動程序,可以掛鉤?

+0

Linux來打開文件描述符,假設?考慮到你不打算進入Apple或Windows內核驅動程序。 – MSalters

+0

mmap一個FUSE文件系統文件也許? – Kornel

+0

@MSalters是的,Linux - 道歉(我剛剛在信息中編輯)。 –

回答

2

考慮到它是一個Linux系統,您可以實現一個非常簡單的FUSE文件系統,其上只有一個文件。內核可以從那裏處理它。

主要問題是您可以期望內核不刷新每個寫入。雖然有一個msync()調用來刷新所有未完成的寫入,但是您的系統被測試不會調用它。然而,我認爲你可以通過使用O_DIRECT | O_DSYNC

+0

我認爲在這種情況下,嘲笑發生在定製FUSE文件系統中? –

+0

是的,內核告訴它頁面緩存中的頁面是髒的(寫入)。 FUSE文件系統驅動程序必須計算diff以查看更改內容。當它指示寫入成功時,內核會再次清除頁面緩存中的髒位,明顯警告:重新讀取相同的內存地址會得到相同的結果;對於FUSE文件,沒有相當於'volatile'的內容。 – MSalters

+0

我不完全理解你對'volatile'的觀點。這是否意味着即使訪問代碼已將內存定義爲「易失性」,操作系統也會緩存寫入的內容?這不會使這種方法變得毫無用處嗎? –