Linux裝置驅動之記憶體對映

2021-06-19 08:03:07 字數 1162 閱讀 3835

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_pro

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...