中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux中的vmalloc有什么作用

發布時間:2021-07-12 13:52:36 來源:億速云 閱讀:336 作者:chen 欄目:大數據

本篇內容主要講解“Linux中的vmalloc有什么作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux中的vmalloc有什么作用”吧!

 

走進vmalloc

根據前面的系列文章,我們知道了buddy system是基于頁框分配器,kmalloc是基于slab分配器,而且這些分配的地址都是物理內存連續的。但是隨著碎片化的積累,連續物理內存的分配就會變得困難,對于那些非DMA訪問,不一定非要連續物理內存的話完全可以像malloc那樣,將不連續的物理內存頁框映射到連續的虛擬地址空間中,這就是vmap的來源)(提供把離散的page映射到連續的虛擬地址空間),vmalloc的分配就是基于這個機制來實現的。

Linux中的vmalloc有什么作用

vmalloc最小分配一個page,并且分配到的頁面不保證是連續的,因為vmalloc內部調用alloc_page多次分配單個頁面。

Linux中的vmalloc有什么作用  

vmalloc的區域就是在上圖中VMALLOC_START - VMALLOC_END之間,可通過/proc/vmallocinfo查看。

 

數據結構

  • vmap_area 描述一段虛擬地址的區域,可以將struct vm_struct構成一個鏈表,維護多段映射。
struct vmap_area {
 unsigned long va_start; //vmalloc申請虛擬地址返回的起始地址
 unsigned long va_end; //vmalloc申請申請虛擬地址返回的結束地址
 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處于使用狀態(即在vmap_area_root為根的紅黑樹中和vmap_area_list鏈表中),vm有效,指向用于管理虛擬地址和物理頁之間的映射關系的描述符
 struct vm_struct *vm;
 struct rcu_head rcu_head;
};
 
  • vm_struct 管理虛擬地址和物理頁之間的映射關系
struct vm_struct {
 struct vm_struct *next; //指向下一個vm結構體
 void   *addr; //當前vmalloc區域的虛擬地址的起始地址
 unsigned long  size; //當前vmalloc區域的虛擬地址的大小
 unsigned long  flags;
 //vamlloc分配獲取的各個物理頁面并是不連續的,每個物理頁面用struct page描述,一個vm_struct對用到的管理所有物理頁面的struct page構成一個數組,而pages就是指向這個數組的指針。
 struct page  **pages;
 unsigned int  nr_pages; //vmalloc映射的page數目
 phys_addr_t  phys_addr; //用來映射硬件設備的IO共享內存,其他情況下為0
 const void  *caller; //調用vmalloc函數的函數的地址
};
 
Linux中的vmalloc有什么作用  
 

vmalloc

主要分以下三步:

  1. 從VMALLOC_START到VMALLOC_END查找空閑的虛擬地址空間(hole)
  2. 根據分配的size,調用alloc_page依次分配單個頁面.
  3. 把分配的單個頁面,映射到第一步中找到的連續的虛擬地址。把分配的單個頁面,映射到第一步中找到的連續的虛擬地址。
Linux中的vmalloc有什么作用  

到此,相信大家對“Linux中的vmalloc有什么作用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

家居| 杭锦后旗| 佳木斯市| 平山县| 互助| 沙河市| 武陟县| 响水县| 阜新市| 枣阳市| 昆明市| 邳州市| 曲水县| 新建县| 仁化县| 大姚县| 临洮县| 兰坪| 宜兴市| 海安县| 葫芦岛市| 紫云| 广南县| 日土县| 武鸣县| 荥经县| 大英县| 康马县| 滁州市| 泰安市| 岳阳市| 固安县| 贵德县| 浙江省| 垫江县| 大丰市| 滦平县| 望江县| 雷波县| 岳普湖县| 林周县|