內存子係統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)
最後更新:2017-04-03 12:55:01