vmalloc,kmalloc,get_free_page,kmem_cache_create分配内存实例

//All right revsered by yoki2009
//mailto:imj040144@tom.com
微出版 www.epube.biz 相信梦想无界


#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/jiffies.h>
#include <linux/vmalloc.h>
#include <linux/delay.h>

/*
vmalloc,kmalloc,get_free_page,kmem_cache_create
vmalloc与kmalloc区别在于起始地址不同,kmalloc分配的内存处于3GB~high_memory之间,这段内核
空间与物理内存的映射一一对应,而vmalloc分配的内存在VMALLOCSTAERT~4GB之间,这段非连续内存
区映射到物理内存也可能是非连续的,vmalloc分配的物理地址无需连续,而kmalloc确保页在物理上
是连续的

*/
unsigned char * vmchar;
unsigned char * kmchar;
unsigned char * m_free_pages;
struct kmem_cache_t  * kmem_cache;
unsigned char * slabchar;
static int __init mem_test_init(void)
{
 printk("Hello, world/n");
 //vmalloc test
 //分配虚拟内存,也就是位于高端128M内存
 printk("[vmalloc] Enter Jiffy %ld/n",jiffies);
 vmchar = (unsigned char *)vmalloc(16*1024*1024);
 if (!vmchar)
 {
  printk("Error on vmalloc/n");
  return -1;
 }
 memset(vmchar,0,16*1024*1024);
 printk("vmalloc address : %x/n",vmchar);

 //kmalloc test
 //kmalloc分配的低端内存,直接映射到物理内存
 printk("[kmalloc] Enter Jiffy %ld/n",jiffies);
 //kmalloc最大只能开辟128k
 kmchar = (unsigned char *)kmalloc(PAGE_SIZE*32,GFP_KERNEL);
 if (!kmchar)
 {
  printk("Error on kmalloc/n");
  return -1;
 }
 memset(kmchar,0,PAGE_SIZE*32);
 printk("kmalloc address : %x/n",kmchar);
 printk("[kmalloc] Exit Jiffy %ld/n",jiffies);
 
 //get_free_page test
 //也是使用kmalloc分配的内存区域
 printk("[get_free_pages] Enter Jiffy %ld/n",jiffies);
 m_free_pages = (unsigned char *)__get_free_pages(GFP_KERNEL,2);
 if (!m_free_pages)
 {
  printk("Error on m_free_pages/n");
  return -1;
 }
 memset(m_free_pages,'a',PAGE_SIZE*2);
/*
 while(m_free_pages)
 {
  printk("[get_free_pages] address == %x/n",m_free_pages>>PAGE_SHIFT);
 }
*/
 printk("get_free_pages address : %x/n",m_free_pages);
 printk("[get_free_pages] Exit Jiffy %ld/n",jiffies);

 //slab alloc test
 //使用后备高速缓存,对于反复地分配很多同一大小的内存块使用Slab分配方式
 printk("[Slab] Enter Jiffy %ld/n",jiffies);
 kmem_cache = kmem_cache_create("slab_cache",4,0,SLAB_HWCACHE_ALIGN,NULL);
 if (!kmem_cache)
 {
  printk("Error on Slab/n");
  return -1;
 }
 slabchar = kmem_cache_alloc(kmem_cache,GFP_KERNEL);
 if (!slabchar)
 {
  printk("Error on alloc slab cache/n");
  return -1;
 }
 memset(slabchar,0,4);
 printk("Slab address : %x/n",slabchar);
 kmem_cache_free(kmem_cache,slabchar);
 kmem_cache_destroy(kmem_cache);
 printk("[Slab] Exit Jiffy %ld/n",jiffies);
 return 0;
}

static void __exit mem_test_exit(void)
{
 vfree(vmchar);
 kfree(kmchar);
 free_pages(m_free_pages,2);
}

module_init(mem_test_init);

module_exit(mem_test_exit);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值