十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容主要講解“Linux中的vmalloc有什么作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux中的vmalloc有什么作用”吧!
網(wǎng)站的建設創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設計體驗!已為成都房屋鑒定等企業(yè)提供專業(yè)服務。
根據(jù)前面的系列文章,我們知道了buddy system是基于頁框分配器,kmalloc是基于slab分配器,而且這些分配的地址都是物理內(nèi)存連續(xù)的。但是隨著碎片化的積累,連續(xù)物理內(nèi)存的分配就會變得困難,對于那些非DMA訪問,不一定非要連續(xù)物理內(nèi)存的話完全可以像malloc那樣,將不連續(xù)的物理內(nèi)存頁框映射到連續(xù)的虛擬地址空間中,這就是vmap的來源)(提供把離散的page映射到連續(xù)的虛擬地址空間),vmalloc的分配就是基于這個機制來實現(xiàn)的。

vmalloc最小分配一個page,并且分配到的頁面不保證是連續(xù)的,因為vmalloc內(nèi)部調(diào)用alloc_page多次分配單個頁面。
vmalloc的區(qū)域就是在上圖中VMALLOC_START - VMALLOC_END之間,可通過/proc/vmallocinfo查看。
struct vmap_area {
unsigned long va_start; //vmalloc申請?zhí)摂M地址返回的起始地址
unsigned long va_end; //vmalloc申請申請?zhí)摂M地址返回的結束地址
unsigned long flags;
//掛接到vmap_area_root紅黑樹
struct rb_node rb_node; /* address sorted rbtree */
//掛接到vmap_area_list鏈表
struct list_head list; /* address sorted list */
struct llist_node purge_list; /* "lazy purge" list */
//如果當前VA處于使用狀態(tài)(即在vmap_area_root為根的紅黑樹中和vmap_area_list鏈表中),vm有效,指向用于管理虛擬地址和物理頁之間的映射關系的描述符
struct vm_struct *vm;
struct rcu_head rcu_head;
};
struct vm_struct {
struct vm_struct *next; //指向下一個vm結構體
void *addr; //當前vmalloc區(qū)域的虛擬地址的起始地址
unsigned long size; //當前vmalloc區(qū)域的虛擬地址的大小
unsigned long flags;
//vamlloc分配獲取的各個物理頁面并是不連續(xù)的,每個物理頁面用struct page描述,一個vm_struct對用到的管理所有物理頁面的struct page構成一個數(shù)組,而pages就是指向這個數(shù)組的指針。
struct page **pages;
unsigned int nr_pages; //vmalloc映射的page數(shù)目
phys_addr_t phys_addr; //用來映射硬件設備的IO共享內(nèi)存,其他情況下為0
const void *caller; //調(diào)用vmalloc函數(shù)的函數(shù)的地址
};
主要分以下三步:
到此,相信大家對“Linux中的vmalloc有什么作用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!