內存子系統1_分配接口

1.頁
	<linux/mm_types.h>
  	struct page;
	內核把物理頁作爲內存管理的基本單位;內存管理單元(MMU)把虛擬地址轉換爲物理地址,
通常以頁爲單位進行處理。MMU以頁大小爲單位來管理系統中的也表。

  	內核struct page管理系統中所有的頁.
2.區
	<linux/mmzone.h>
  	struct zone;
  	Linux將內核空間地址劃分爲三個區:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。
  	在x86結構中,三種類型的區域如下:
  	ZONE_DMA        	0-16MB
  	ZONE_NORMAL       	16MB-896MB
  	ZONE_HIGHMEM       	896MB - tail
3.頁操作
	static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)
	分配2**order個連續的物理頁,返回指向第一個頁的page結構體指針,max(order)=11,12
 
	void *page_address(const struct page *page)
	返回指向給定物理頁當前所在的邏輯地址

	extern unsigned long get_zeroed_page(gfp_t gfp_mask);
	extern void free_pages(unsigned long addr, unsigned int order);
 
4.內存操作
	kmalloc分配以字節爲單位的一塊內核內存,分配的內存物理上連續:
	void *kmalloc(size_t size, gfp_t flags)
	void kfree(const void *addr)
	
	vmalloc分配的內存虛擬地址是連續的,而物理地址則無需連續:
	void *vmalloc(unsigned long size)
	void vfree(const void *addr)
 
5.slab層
	Linux內核提供了slab來管理頻繁分配釋放的內存:
	slab創建高速緩存組,每個高速緩存被劃分不同狀態的slab,slab由一個或多個物理上連續的頁組成。
	每個slab處於三種狀態之一:滿,部分滿,空。
	
	高速緩存,slab,對象之間的關係:

                                                          


slab數據結構和接口:
	每個高速緩存用kmem_cache結構來表示:
       	struct kmem_cache {
              struct kmem_list3 **nodelists;
      	}
	緩存區包含三種slab:滿,未滿,空閒
	struct kmem_list3 {
       		struct list_head slabs_partial; /* partial list first, better asm code */
       		struct list_head slabs_full;
       		struct list_head slabs_free;
	};
	每一個slab包含多個對象:
	struct slab {
              struct list_head list;
              unsigned long colouroff;
              void *s_mem;            /* including colour offset */
              unsigned int inuse;     /* num of objs active in slab */
              kmem_bufctl_t free;
              unsigned short nodeid;
	};
 
6.slab操作
	kmem_cache_create用來創建一個新緩存:
	struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *))
	flags 參數指定了爲緩存啓用的選項:
	SLAB_RED_ZONE		:在對象頭、尾插入標誌,用來支持對緩衝區溢出的檢查。
  	SLAB_POISON		:使用一種己知模式填充slab,允許對緩存中的對象進行監視(對象屬對象所有,不過可以在外部進行修改)。
  	SLAB_HWCACHE_ALIGN	:指定緩存對象必須與硬件緩存行對齊。
 
	kmem_cache_alloc從緩存中返回一個對象:
	void kmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags );
	如果緩存目前爲空,那麼這個函數就會調用 cache_alloc_refill 向緩存中增加內存。

	
7.高端內存的映射
	kmap永久映射,可能阻塞,映射一個給定的page結構到內核地址空間
  	void *kmap(struct page *page)
  	void kunmap(struct page *page)
 
	臨時映射:不會阻塞     
	void *kmap_atomic(struct page *page)
 


發佈了145 篇原創文章 · 獲贊 49 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章