<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 內存管理之vmalloc

          共 2269字,需瀏覽 5分鐘

           ·

          2021-05-15 23:56

          走進vmalloc

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

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

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

          數(shù)據(jù)結構

          • vmap_area 描述一段虛擬地址的區(qū)域,可以將struct vm_struct構成一個鏈表,維護多段映射。
          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;
          };
          • vm_struct 管理虛擬地址和物理頁之間的映射關系
          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共享內存,其他情況下為0
           const void  *caller; //調用vmalloc函數(shù)的函數(shù)的地址
          };

          vmalloc

          主要分以下三步:

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




          推薦閱讀:
          專輯|Linux文章匯總
          專輯|程序人生
          專輯|C語言
          我的知識小密圈

          關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。

          歡迎點贊,關注,轉發(fā),在看,您的每一次鼓勵,我都將銘記于心~


          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男人的天堂青青草原 | 无码一区二区黑人猛烈视频网站 | 免费在线性爱视频 | 欧美伊人大香蕉 | 亚洲天堂精品视频 |