Linux设备驱动程序 之 后备高速缓存
设备驱动程序常常会反复的分配很多相同大小的内存块;内核实现了后备高速缓存来对此进行支持,以反复的使用这些相同的内存块;
创建
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设备驱动程序 之 后备高速缓存的更多相关文章
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
- 嵌入式Linux设备驱动程序:发现硬件配置
嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- Linux设备驱动程序 第三版 读书笔记(一)
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...
- 教你写Linux设备驱动程序:一个简短的教程
教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html
- linux设备驱动程序_hello word 模块编译各种问题集锦
在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...
- Linux设备驱动程序学习----1.设备驱动程序简介
设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介 Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
随机推荐
- 移动端适配flexible.js
npm install lib-flexible --save npm install px2rem-loader --save-dev
- stm32最小系统制作(原理图,PCB图,焊接等)
一直想自己做一个最小系统,这次终于把想法付诸实现. 原理图如下: PCB图如下: 过了多日,板子终于邮到了,就是下面这个熊样. 焊接了稳压电路,发现稳压电路原理图部分画错,没有接地 ...
- 【leetcode】566. Reshape the Matrix
原题 In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a ne ...
- Linux 01 Liunx系统简介
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位 ...
- 实战 | 源码入门之Faster RCNN
前言 学习深度学习和计算机视觉,特别是目标检测方向的学习者,一定听说过Faster Rcnn:在目标检测领域,Faster Rcnn表现出了极强的生命力,被大量的学习者学习,研究和工程应用.网上有很多 ...
- Windows安全应急响应(一)
入侵排查思路 检查账号安全 1.查看服务器是否有弱口令,远程管理端口是否对公网开放 2.查看服务器是否存在可以账号.新增账号 3.查看服务器是否存在隐藏账号.克隆账号检查方法:i.打开注册表,查看管理 ...
- 使用java中的反射获得object对象的属性值
知识点:使用java中的反射获得object对象的属性值 一:场景 这两天开发代码时,调用别人的后台接口,返回值为Object对象(json形式的),我想获得object中指定的属性值,没有对应的ge ...
- 一步一步pwn路由器之wr940栈溢出漏洞分析与利用
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...
- 第107题:二叉树的层次遍历II
一. 问题描述 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...
- 类对象传输到jsp页面。需要转换为js的json对象时,这么做。
场景:要从一个列表中选择信息,填写入父页面的表单中,但是字段非常多... 后台查询,得到结果,放在列表中. 效果:点击选择产品.. 弹出页面:点击后面的选择产品 选择产品后:信息自动填充.. 实现:点 ...