linux裝置驅動之記憶體對映
[日期:2011-04-11]
1. 記憶體對映
所謂的記憶體對映就是把物理記憶體對映到程序的位址空間之內,這些應用程式就可以直接使用輸入輸出的位址空間,從而提高讀寫的效率。linux提供了mmap()函式,用來對映物理記憶體。
在驅動程式中,應用程式以裝置檔案為物件,呼叫mmap()函式,核心進行記憶體對映的準備工作,生成vm_area_struct結構體,然後呼叫裝置驅動程式中定義的mmap函式。
2. 對映的種類
把同乙個物理位址對映為虛擬位址有兩種方法,第一種是mmap()函式將物理位址對映到程序的虛擬位址空間中去,第二種方法為ioremap()函式對映到核心虛擬位址上的方法。
mmap對映的方法:
有兩種方法建立頁表,一次性建立頁表,可以呼叫函式remap_pfn_range和每次建立乙個頁的頁表,呼叫函式nopage。
remap_pfn_range:
這個函式的功能是一次性建立新的頁表去對映實體地址。
int remap_pfn_range(struct vma_area_struct* vma,unsigned long virt_addr,unsigned long pfn,unsigned long size,pgprot_t prot);
返回值:對映成功時返回0,否則返回乙個錯誤的負數**。
vma 實體地址被對映到的虛擬記憶體區域
virt_addr 被對映到使用者空間的起始虛擬位址。頁表建立的範圍在virt_addr到virt_addr+size
pfn 對應實體地址的頁框號,一般是vma->vm_pgoff域。
size 被對映區域的位元組大小
prot vma->vm_page_prot
nopage:
struct page *(*nopage) (struct vm_area_struct *vma,unsigned long address,int *type);
vm_area_struct:虛擬記憶體區域
address:發生page fault的程序空間的虛擬位址
type 返回page fault可處理型別的位址
get_page(struct page* pageptr);
增加被對映頁的引用次數。
linux字元裝置驅動開發之記憶體對映
linux驅動最終都死通過配置暫存器完成,linux驅動開發需要滿足linux的驅動框架.所以存在乙個記憶體管理單元 mmu 實現虛擬位址與實體地址的對映,記憶體保護和虛擬位址快取功能.通過記憶體對映,只需要對虛擬位址進行操作,就可以實現相應的驅動開發.記憶體對映 對映函式 記憶體對映 void i...
Linux塊裝置驅動之記憶體模擬塊裝置
用記憶體代替塊裝置的總結,相對來簡單得多,對記憶體操作想必大家都很熟悉,直接分配一塊記憶體就可以直接讀寫操作了 參考 drivers block xd.c drivers block z2ram.c define ramblock size 1024 1024 乙個扇區是512位元組 static ...
Linux驅動之記憶體訪問
背景 記憶體會以分頁方式組織記憶體,而且每頁大小和計算機體系結構有關係,linux中每個頁都有對應的struct page 與之對應。分配連續的記憶體 a void kmalloc int count,int flags 函式用於從zone normal區域返回連續記憶體的分配的位址。引數分析 co...