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

创建

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. 安装Nvida 显示环境

    查看是否能正确加载nvidia 驱动 在终端输入 (glxinfo 需要安装mesa-utils) 如果可以正确加载了nvidia驱动 那么在输入的内容中可以看到NVIDIA 字样 如果GPU是Int ...

  2. string和char*

    string转const char* string s = "hello furong."; const char *c = s.c_str(); string转char* str ...

  3. 解决spring-boot-maven-plugin插件打包,springboot启动时报找不到主main问题

    一:遇到的问题及解决方法 最近在搭建一个新项目时,使用spring-boot-maven-plugin插件打包,springboot项目在发布后启动时遇到找不到主main问题. 遇到这个问题当时感觉本 ...

  4. 用java代码实现

    用java代码实现(1)珠穆朗玛峰高度为8848米,有一张足够大的纸,厚度为0.001米. (2)请问,我折叠多少次,可以折成珠穆朗玛峰的高度/** * @author 18269 * @date 2 ...

  5. JAVA面试核心教程|Java面试基础知识点总结

    Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? byte——1 byte——Byte short——2 bytes——Short int——4 bytes——Integer lon ...

  6. 使用了frame的页面如何整体进行跳转,而不是仅frame跳转

    使用了frame的页面如何整体进行跳转,而不是仅frame跳转 js window.parent.location.href="你的地址"; php echo "&quo ...

  7. SNMP OID列表

    zabbix的snmp监控还没开始讲,不过先给大家列一些snmp常用的一些OID,比如cpu.内存.硬盘什么的.先了解这些,在使用snmp监控服务器. 系统参数(1.3.6.1.2.1.1) OID ...

  8. vimrc config and NERDTree

    nmap <C-N> :tabnext<CR> 下载和配置 NERDTree插件的官方地址如下,可以从这里获取最新的版本 https://github.com/scrooloo ...

  9. 后端数据中含有html标签和css样式,前端如何转译展示样式效果。

    后端含有html标签和css样式的数据: domain="<span style='color:red'>www.baidu.com</span>" (vu ...

  10. 2019牛客多校第五场generator2——BSGS&&手写Hash

    题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...