2012-07-23 146 views
7

我正在研究一個小型嵌入式系統。當我的Linux啓動到用戶空間時,我知道我的設備在物理內存中。我想將它們映射到用戶空間虛擬地址。目前,我正在通過一個內核模塊來完成它。我使用vmalloc/kmalloc(取決於大小),然後在返回的虛擬地址上使用ioremap_page_range來映射我的物理地址。我不認爲這是正確的方式。首先我分配內存,然後我要求內核將該虛擬地址空間重新映射到一些不同的物理地址空間。 (在vmcall/kmalloc中最初映射的物理 - >虛擬是沒用的,因爲我不關心這些物理頁面,這絕對不好)。將物理地址映射到虛擬地址linux

取而代之,有一種更好的方式將已知物理內存映射到用戶空間進程。 (我知道的比我的用戶空間程序等,沒有人要去觸摸內存。)

感謝

回答

5

你所試圖做的是訪問所謂IO內存。我只能鼓勵你閱讀Linux設備驅動程序(LDD)的書,更具體的章節9

爲「分配」這樣一個區域,你需要調用

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name) 

。之前你的驅動程序可以訪問它,你必須爲它分配一個虛擬地址,這是通過調用做

void *ioremap(unsigned long phys_addr, unsigned long size) 

爲了確保您的驅動程序將隨後在不同的架構/平臺上工作時,一定要使用一些訪問功能到這些領域(ioread8/16/32或iowrite8/16/32及其所有變種)。

0

在內核模塊中,remap_pfn_range()可用於將物理地址轉換爲虛擬地址。當你沒有真實的設備時,你可以: 1)創建一個虛擬設備,並且2)使用mmap到這些虛擬設備,通過該過程的remap_pfn_range虛擬映射來訪問完全相同的內核內存。 3)通常在專用環境中,您可能除了要固定這些物理頁面以免將它們從您的過程中拿走。 4)您也可以通過不同的進程共享這些物理地址,但需要獨立地通過其他IPC機制來處理同步,因爲每個進程他們將看起來像不同的地址。

相關問題