设备驱动程序常常会反复的分配很多相同大小的内存块;内核实现了后备高速缓存来对此进行支持,以反复的使用这些相同的内存块;

创建

Linux内核的高速缓存管理有时被称为“slab分配器”;因此,相关函数和类型在<linux/slab.h>中声明;slab分配器实现的告诉缓存具有kmem_cache类型;通过调用kmem_cache_create创建;

 struct kmem_cache *
kmem_cache_create(const char *name, size_t size, size_t offset,
unsigned long flags, void (*ctor)(void *))

该函数创建一个新的高速缓存对象,其中可以容纳任意数目的内存区域,这些区域的大小相同,由size参数指定;

参数name与这个高速缓存相关联,其功能是保管一些信息以便追踪问题,它通常被设置为将要高速缓存的结构类型的名字;高速缓存保留指向该名称的指针,而不是复制其内容,因此,驱动程序应该指向静态存储的指针传递给这个函数,名称中不能包含空白;

参数offset是页面中第一个对象的偏移量,它可以用来确保对已分配的对象进行某种特殊对齐,但是最常用的就是0,表示使用默认值;

参数flags控制如何完成分配,是一个掩码,取值如下:

SLAB_NO_REAP-设置这个标志可以保护高速缓存在系统寻找内存的时候不会被减少;设置该标志通常不是好主意,我们不应该对内存分配器的自由做一些认为的,不必要的限制;

SLAB_HWCACHE_ALIGN-这个标志要求所有数据对象跟高速缓存行对齐;实际的操作则依赖于主机平台的硬件高速缓存布局;如果在SMP机器上,高速缓存中包含有频繁访问的数据项的话,则该选项将是非常好的选择;但是,为了满足高速缓存行对齐的需求,必要的填白可能浪费大量内存;

SLAB_CACHE_DMA-这个标志要求没给数据对象都从可用于DMA的内存区段中分配;

还有一些标志可用于高速缓存分配的调试,但通常这些标志值在开发系统中通过内核配置选项而全局地设置;

参数construtor是可选的,用于初始化新分配的对象;通常不使用,直接传递NULL;该函数在分配用于一组对象时调用,因为这些内容中可能包含好几个对象,所以constructor可能会被调用多次;我们不能认为分配一个对象之后随之就会调用一次constructor;

分配

一旦某个对象的高速缓存被创建,就可以调用kmem_cache_alloc从中分配内存对象:

 void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)

参数cache是先前创建的高速缓存;参数flags和传递给kmalloc的相同,并且当需要分配更多内存来满足kmem_cache_alloc时,高速缓存还会利用这个参数;

释放

释放一个内存对象使用kmem_cache_free:

 void kmem_cache_free(struct kmem_cache *cachep, void *objp)
销毁

如果驱动程序代码和高速缓存有关的部分已经处理完了,这时驱动程序应该释放它的高速缓存;

 void kmem_cache_destroy(struct kmem_cache *s)

这个参数只有在已经将缓存中分配的所有对象都归还后才能成功,所以,模块应该检查kmem_cache_destroy的返回状态;如果失败,则表明模块中发生了内存泄露;

使用后备高速缓存的另外一个好处是内核可以统计高速缓存的使用情况,高速缓存的使用统计可以从/proc/slabinfo获得;

Linux设备驱动程序 之 后备高速缓存的更多相关文章

  1. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  2. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  3. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  4. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  5. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  6. 教你写Linux设备驱动程序:一个简短的教程

    教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html

  7. linux设备驱动程序_hello word 模块编译各种问题集锦

    在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...

  8. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  9. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

随机推荐

  1. javascript--BOM(browser object model)五大对象

    浏览器对象模型: 作用:访问.控制.修改浏览器,与浏览器进行交互(打开新的窗口.回退历史记录.获取url) BOM与的DOM区别:JS通过BOM与浏览器进行交互.BOM的window对象包含了docu ...

  2. 工作流引擎Activiti

    背景: 在计算机尚未普及时,许多工作流程采用手工传递纸张表单的方式,一级一级审批签字, 工作效率非常低下,对于数据统计以及生成报表的功能,需要经过大量的手工操作才能实现. 随着电脑的普及,这些工作的参 ...

  3. MyBatis-Spring 之SqlSessionFactoryBean

    要创建工厂 bean,放置下面的代码在 Spring 的 XML 配置文件中: <bean id="sqlSessionFactory" class="org.my ...

  4. ln -s vs mount --bind

    First ,Symlinks and bind mounts are a whole different ballgame. ln -s you create a symbolic link,whi ...

  5. 【问题】No manual entry for pthread_create in section 3

    参考文章:https://blog.csdn.net/wwwlyj123321/article/details/79211184 apt-get install manpages-posix manp ...

  6. sklearn逻辑回归实战

    目录 题目要求 ex2data1.txt处理 方案一:无多项式特征 方案二:引入多项式特征 ex2data2.txt处理 两份数据 ex2data1.txt ex2data2.txt 题目要求 根据学 ...

  7. Spring入门篇——AOP基本概念

    1.什么是AOP及实现方式 什么是AOP AOP:Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要 ...

  8. windows下mysql5.6.x的日志正确配置方法(my.ini) (网上的都是5.6之前的版本)

    https://blog.csdn.net/databatman/article/details/49951853 感谢楼主,找了好久,试了一下楼主的,果然是对的,网上的日志配置都是5.6之前的版本: ...

  9. app连接线上数据库进行本地接口测试

    1.将开发环境下数据库配置改为生产环境下的数据库连接 2.备份生产环境下的数据库数据以及结构,使用Postman请求开发(本地)环境下的接口 3.打开手机上安装的线上app改动接口时查看app是否发生 ...

  10. Spring Boot 之FilterRegistrationBean --支持web Filter 排序的使用(转)

    Spring Boot 之FilterRegistrationBean  --支持web Filter 排序的使用Spring 提供了FilterRegistrationBean类,此类提供setOr ...