1. 程式人生 > >核心的幾種記憶體分配與線性對映方式

核心的幾種記憶體分配與線性對映方式

1. 核心中獲取記憶體的幾種方式
  
   a) 通過夥伴演算法分配大片實體記憶體(分配 【物理頁框】)
   alloc_pages(gfp_mask, order): 獲得連續的頁框,返回頁描述符地址,是其他型別記憶體分配的基礎。
   __get_free_pages(gfp_mask, order): 獲得連續的頁框,返回頁框對應的線性地址。線性地址與實體地址是核心直接對映方式。不能用於大於896M的高階記憶體。(分配 【夥伴 + 直接線性對映地址】)

   b) 通過Slab緩衝區分配小片實體記憶體(分配 【夥伴 + 直接線性對映地址】):
   kmem_cache_create: 建立slab的高速緩衝區
   kmem_cache_alloc: 申請slab記憶體塊
   kmalloc(gfp_mask, size): 獲得連續的以位元組為單位的實體記憶體,返回線性地址。

   c) 非連續記憶體區分配(分配 【夥伴 + 非連續區線性對映地址】,實體記憶體是 __GFP_HIGHMEM(分配順序是HIGH, NORMAL, DMA )):
   vmalloc(size): 分配非連續記憶體區,線性地址連續,實體地址不連續,減少外碎片,但是效能低,因為要打亂核心頁表。通常只是分配大記憶體時,比如為活動的互動區分配資料結構、載入核心模組時分配空間、為IO驅動程式分配緩衝區。

   d) 高階記憶體對映(通常是512或1024個表項或線性地址)(僅分配 【線性地址】,要求頁面是高階 );
   kmap(struct page * page): 獲取高階記憶體永久核心對映的線性地址。
   kmap_atomic(struct page * page, enum km_type type): 獲取高階記憶體臨時核心對映的線性地址。

   e) 固定線性地址對映(通常也是指定幾個線性地址)(僅分配 【線性地址】,頁面無要求):
   set_fixmap(idx, phys): 把一個實體地址對映到一個固定的線性地址上。
   set_fixmap_nocache(idx, phys): 把一個實體地址對映到一個固定的線性地址上,禁用該頁快取記憶體。

2. 以上函式均修改主核心頁表swapper_pg_dir完成對映。