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 從裝置編號中抽取...