2011-07-08 51 views
1

我有一個字符設備可以訪問外部SPI存儲器,我想mmap()外部存儲器,以便我可以從它訪問一個程序就好像它是正常的記憶。Linux:創建mmap()虛擬文件(例如SPI存儲器)

如果我使用重映射的字符設備文件執行通常的mmap()的頁面,它只是讓我看到一個設備的存儲區域,而不是它的虛擬字符的文件...

有沒有竅門,讓我這樣做?

TIA

回答

2

如果字符設備驅動程序提供了mmap實現,它將起作用。這可能是一個很好的理由:

內存訪問指令在總線上創建內存事務。 SPI存儲器不能通過這種方式尋址(儘管SPI控制器可能使用內存映射I/O,這是針對其自己的寄存器級接口,而不是內存內容)。我想你可以用內存總線接口構建一個SPI內存控制器,但是你會失去SPI標準的設備獨立性。可以模擬一個內存區域(抓取一頁內存,將其標記爲無法訪問,並處理訪問衝突(SIGBUS和SIGSEGV),但這樣做效率極低,有時候您會發現虛擬機正在執行此操作,但性能非常差

+0

mmap'd接口_might_是否合理,如果數據可以被明智地緩存,但是它可能也會使用普通的read()/write() – bdonlan

+0

SPI總線上的存儲器是ac所以我想我寧願將它作爲用戶空間中的一個數組來訪問,而不是用作存儲器總線上的 – Metiu

+0

@Metiu:它是計數的存儲器總線上的SPI控制器,而不是SPI連接中的寄存器記憶。 –

1

這聽起來像是你將需要某種形式的駕駛者的翻譯內存區域中的訪問通過面向字符的接口發送命令。這可能是一個非常簡單的塊設備驅動程序。

+0

所以你說我可以mmap()blkdev,這將發送我的cmds而不是隻是試圖去內存頁? – Metiu

+1

是的,但你必須實現該塊設備,Ben的答案比我的要全面得多,給他一個信用 – Novelocrat