1,linux核心記憶體管理基礎:
核心邏輯位址就是核心虛擬位址,核心邏輯位址通過kmalloc(標誌gfp_kernel)分配,核心虛擬位址不一定是核心邏輯位址;
核心邏輯位址和實體地址是線性關係,之間相差固定的值;
核心邏輯位址位寬和cpu位址匯流排位寬一致,所以邏輯位址能夠對映的物理記憶體大小有限,在32位架構上不到1g;
實體地址——cpu位址匯流排向儲存控制器傳輸的位址;
頁幀——物理記憶體空間通常被劃分為大小相同的頁的方式來管理,每乙個頁面稱為頁幀,通常乙個頁幀為4k,頁幀是記憶體位址對映的基本單位;
低端記憶體——核心邏輯位址構成低端記憶體,核心邏輯位址構成核心邏輯記憶體空間即就是核心常規記憶體空間,即就是低端記憶體;
高階記憶體——由於核心邏輯位址位寬和cpu位址匯流排位寬一致,所以核心邏輯位址的定址空間有限,滿足不了大記憶體的需求,所以就出現了高階記憶體,
高階記憶體對映核心真正的虛擬位址空間;
低端記憶體與高階記憶體的真正區別:
能夠對映到核心邏輯位址空間的記憶體為低端記憶體,核心本身的資料必須存放在低端記憶體中;
不能夠對映到核心邏輯位址空間的記憶體為高階記憶體,為使用者空間程序預留記憶體空間;
3》資料結構:
struct page: 由於核心邏輯位址方式滿足不了大記憶體即高階記憶體的對映需求,由於高階記憶體不能夠對映到核心邏輯位址空間;所以就出現了核心記憶體管理子系統最重要的資料結構之一struct page,該資料結構記錄了核心需要的每乙個物理頁幀的所有的資訊,用get_free_pages()來獲取空閒的page(物理頁幀);
struct vm_area_struct :虛擬記憶體資料結構,核心記憶體管理子系統用該重量級資料結構表示每乙個虛擬記憶體區域;
成員屬性:unsigned long vm_start;unsigned long vm_end;unsigned long vm_pgoff;int prot,int flags,struct vm_operations_struct v_ops;
struct vm_area_struct:對虛擬記憶體進行操作;
成員屬性:int (*open)(struct file *,struct vm_area_struct *);
int (*close)(struct file *,struct vm_area_struct *);
int (*fault)(struct vm_area_struct *,struct vm_mf *);
struct mm_struct :記憶體對映資料結構,記錄了每乙個使用者空間程序的所有的記憶體資訊,把上述資料結構都對映到一塊,統一組織管理,每乙個使用者空間程序task_struct 例項物件都有乙個mm_struct例項物件;
4》記憶體對映操作——系統呼叫mmap():
a,api:使用者空間api:int mmap(void *addr,unsigned long len,unsigned long loff,int prot,int flags,unsigned long fd);
驅動模組函式:int mmap(struct file *filp,struct vm_area_struct *vma);
b,裝置記憶體對映到使用者虛擬記憶體空間:
兩種實現方式:
c,使用者空間虛擬位址直接對映到ram上,本質上是使用者空間虛擬位址直接對映到核心虛擬位址空間,包含兩部分:使用者空間虛擬位址對映到核心邏輯位址空間對映的物理記憶體上,使用者空間虛擬位址對映到核心真正的虛擬位址對映的記憶體上;
LDD3讀書筆記(第6章 記憶體對映和DMA)
1 介紹性材料 include include 和記憶體管理相關的大部分函式和結構,原型和定義在這些標頭檔案.void va unsigned long physaddr unsigned long pa void kaddr 在核心邏輯位址和實體地址之間轉換的巨集定義.page size page...
Linux記憶體對映
使用記憶體對映處理大檔案很方便,在windows系統中,實現了這樣的藉口。在linux中我們也可以通過mmap函式來實現。以下內容完全參考自 如有冒犯,請諒解 mmap函式實現把乙個檔案對映到乙個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read write也要快上許多。在某些時...
記憶體對映檔案
記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的位址空間中去,在此之後程序操作文 件,就像操作程序空間裡的位址一樣了,比如使用 memcpy 等記憶體操作的函式。這種方法能 夠很好的應用在需要頻繁處理乙個檔案或者是乙個大檔案的場合,這種方式處理 io效率比 普通 io效率要高。另外,unix 把它做...