Linux内核中的内存分配

本文深入探讨了Linux内存管理的不同方面,包括低端内存和高端内存的分配机制,如何使用页面分配器(__get_free_pages, alloc_pages)及slab分配器进行内存分配,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然Linux的内存管理相当复杂,但是使用起来还是比较简单的。

Linux内存分配器(__get_free_pages alloc_pages),基于伙伴系统,其中alloc_pages可以在分配高端内存。而__get_free_pages只能分配低端内存。并且他们分配的内存在物理上都是连续的。使用alloc_pages分配的高端内存需要通过kmap建立映射以获得内核虚拟地址进行访问,而分配的低端内存,因为映射在系统初始化的时候就已经建立,所以可以直接使用page_address宏获得线性地址进行访问。

至于slab分配器,使用alloc_pages在低端内存分配的空间。


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/percpu.h>

static int __init hello_init (void)
{				
	struct page * page; // 页描述符 
	void * ptr;
	struct kmem_cache * kmem_cache;
	
	/* 1.直接使用页面分配器 */
	/* 1.1 分配低端内存*/	
	page = alloc_pages(GFP_KERNEL | GFP_ATOMIC, 1);
	ptr = page_address(page);
	__free_pages(page, 1);

	ptr = __get_free_pages(GFP_KERNEL, 1);
	free_page(ptr);
	
	/* 1.2 分配高端内存 */
	/* 高端内存本身没有映射到内核虚拟空间,
	  * 通过页面分配器分配后必须通过kmap将页面描述符
	  * 对应的高端内存映射至内核空间方可使用*/
	page = alloc_pages(__GFP_HIGHMEM, 1);
	ptr = kmap(page);
	kunmap(page);
	__free_pages(page, 1);		

	/* 2.使用slab分配器分配内存空间 */		
	kmem_cache = kmem_cache_create ("my_slab", 12, 0,0, NULL);
	ptr = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
	kmem_cache_free(kmem_cache, ptr);
	kmem_cache_destroy(kmem_cache);

	/* 3.使用vmalloc在动态影射区分配内存(物理内存可能不连续,分配大块内存)*/
	ptr = vmalloc(1024);
	vfree(ptr);		
	return 0;
}


static void __exit hello_exit (void)
{	
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("Tian bei");
MODULE_DESCRIPTION("per_cpu_ptr test");
MODULE_LICENSE("GPL");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值