• 内存管理-5---分配内存常用函数(分配固定大小的对象:slab)


    这里面的方法是:在内存中创建一个经常用的或者专用的一个缓存:这个缓存的分成若干个大小一样的小缓存,每次申请释放的都是一个个小缓存,这里所说的释放,实际上没有释放,而是归还,相当于slab系统中的专用缓存一个道理.

    makefile

      1 LINUX_SRC :=/home/liuye/tiny4412/FriendlyARM_kernel/linux-3.5
      2 #obj-m  += module.o            #生成module.ko   但我们写module.o就可以
      3 #module-objs=param.o     #这里写要编译文件
      4 obj-m +=mmc_group.o       #这是单文件的编译:上面两行是多文件的编译,更加方便
      5 
      6 all:
      7         make -C $(LINUX_SRC) M=`pwd` modules
      8 clean:
      9         make -C $(LINUX_SRC) M=`pwd` modules clean

    mmc_group.c

      1 #include <linux/init.h>
      2 #include <linux/sched.h>
      3 #include <linux/module.h>
      4 #include <linux/mm.h>
      5 #include <linux/highmem.h>
      6 #include <linux/vmalloc.h>
      7 #include <linux/dma-mapping.h>
      8 #include <linux/slab.h>
      9 //查找
     10 //内核代码工作在两种环境下:
     11 //      1/中断上下文  不允许睡眠
     12 //      2/进程上下文    允许睡眠
     13 
     14 /*
     15 内核中存放很多个page结构体都是连续的:page+1就是下一个page的地址
     16 page
     17 page
     18 page
     19 page
     20 page
     21 page
     22 */
     23 //在内核程序中,申请的内存一定不能有内存泄漏,用完要是放,不然内核就崩溃了.
     24 //在应用程序中,如果申请的内存没有使放,越来越多,内核就会把这个进程杀掉,但是内核里面由内存泄漏是没有人可以把内核干掉的.
     25 struct nrf_st
     26 {
     27         int no;
     28         int flag;
     29         char msg[16];
     30 };
     31 void ctor(void *data)
     32 {
     33 
     34 }
     35 static __init int test_init(void)
     36 {
     37         struct kmem_cache *kmem;
     38         struct nrf_st *nrf;
     39         //my_cache:名字可体现在/proc/slabinfo里面
     40         //第二个参数:每个结构体的大小,而不是申请总的内存的大小.
     41         //第四个参数:按照硬件cache行对其
     42         //ctor:再分配缓存中的每一个对象的时候都会调用,并且会把分配的对象的指针传给这个函数;
     43         kmem = kmem_cache_create("my_cache",sizeof(struct nrf_st),0,SLAB_HWCACHE_ALIGN,ctor);
     44 
     45         //获得缓存中的对象
     46         nrf = kmem_cache_alloc(kmem,GFP_KERNEL);
     47 
     48         //释放对象
     49         kmem_cache_free(kmem,nrf);
     50 
     51         //释放
     52         kmem_cache_destroy(kmem);
     53         return 0;
     54 }
     55 static __exit void test_exit(void)
     56 {
     57         printk("mmc exit!
    ");
     58 }
     59 
     60 module_init(test_init);
     61 module_exit(test_exit);
     62 MODULE_LICENSE("GPL");
    有时候,不小心知道了一些事,才发现自己所在乎的事是那么可笑。
  • 相关阅读:
    安装Rocky版OpenStack 1控制节点+1计算节点环境部署脚本
    脚本安装Rocky版OpenStack 1控制节点+1计算节点环境部署
    采用脚本自动填写具有交互式命令的方法
    CentOS安装Docker
    WordPress博客搭建与问题总结
    OpenStack端口(15)
    openstack搭建之-horizon配置(14)
    openstack搭建之-创建实例(13)
    openstack搭建之-cinder配置(12)
    openstack搭建之-neutron配置(11)
  • 原文地址:https://www.cnblogs.com/axjlxy/p/8976246.html
Copyright © 2020-2023  润新知