LDD3讀書筆記(第6章 記憶體對映和DMA)

2021-06-09 06:54:34 字數 2186 閱讀 4767

1、介紹性材料

#include

#include

和記憶體管理相關的大部分函式和結構, 原型和定義在這些標頭檔案.

void *__va(unsigned long physaddr);

unsigned long __pa(void *kaddr);

在核心邏輯位址和實體地址之間轉換的巨集定義.

page_size

page_shift

常量, 給出底層硬體的頁的大小(位元組)和乙個頁面號必須被移位來轉變為乙個實體地址的位數.

struct page

在系統記憶體對映中表示乙個硬體頁的結構.

struct page *virt_to_page(void *kaddr);

void *page_address(struct page *page);

struct page *pfn_to_page(int pfn);

巨集定義, 在核心邏輯位址和它們相關的記憶體對映入口之間轉換的. page_address 只用在低位址頁或者已被明確對映的高位址頁. pfn_to_page 轉換乙個頁面號到它的相關的struct

page 指標.

unsigned long kmap(struct page *page);

void kunmap(struct page *page);

kmap 返回乙個核心虛擬位址, 被對映到給定頁, 如果需要並建立對映. kunmap 為給定頁刪除對映.

#include

#include

void *kmap_atomic(struct page *page, enum km_type type);

void kunmap_atomic(void *addr, enum km_type type);

kmap 的高效能版本; 結果的對映只能被原子**持有. 對於驅動, type 應當是 km_user1, km_user1, km_irq0, 或者 km_irq1.

struct vm_area_struct;

描述乙個 vma 的結構.

2、實現 mmap

int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_add, unsigned long pfn, unsigned long size, pgprot_t prot);

int io_remap_page_range(struct vm_area_struct *vma, unsigned long virt_add, unsigned long phys_add, unsigned long size, pgprot_t prot);

位於 mmap 核心的函式. 它們對映 size 位元組的實體地址, 從 pfn 指出的頁號開始到虛擬位址 virt_add. 和虛擬空間相關聯的保護位在 prot 裡指定. io_remap_page_range 應

當在目標位址在 i/o 記憶體空間裡時被使用.

struct page *vmalloc_to_page(void *vmaddr);

轉換乙個由 vmalloc 獲得的核心虛擬位址到它的對應的 struct page 指標.

3、實現直接 i/o

int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, int len, int write, int force, struct page **pages, struct

vm_area_struct **vmas);

函式, 加鎖乙個使用者空間緩衝到記憶體並且返回對應的 struct page 指標. 呼叫者必須持有 mm->mmap_sem.

setpagedirty(struct page *page);

巨集定義, 標識給定的頁為"髒"(被修改)並且需要寫到它的後備儲存, 在它被釋放前.

void page_cache_release(struct page *page);

釋放給定的頁從頁快取中.

int is_sync_kiocb(struct kiocb *iocb);

巨集定義, 返回非零如果給定的 iocb 需要同步執行.

int aio_complete(struct kiocb *iocb, long res, long res2);

函式, 指示乙個非同步 i/o 操作完成.

LDD3讀書筆記(第5章 記憶體分配)

include void kmalloc size t size,int flags 記憶體分配函式 後備快取記憶體 include kmem cache t kmem cache create const char name,size t size,size t offset,unsigned l...

LDD3讀書筆記(第3章 字元驅動)

include dev t dev t 是用來在核心裡代表裝置號的型別.int major dev t dev int minor dev t dev 從裝置編號中抽取主次編號的巨集.dev t mkdev unsigned int major,unsigned int minor 從主次編號來建立...

LDD3 讀書筆記 之 第 3 章 字元驅動

本章介紹了下面符號和標頭檔案.struct file operations 和 struct file 中的成員的列表這裡不重複了.include dev t dev t 是用來在核心裡代表裝置號的型別.int major dev t dev int minor dev t dev 從裝置編號中抽取...