是时候给个例子了. scullc 是一个简化的 scull 模块的版本, 它只实现空设备 -- 永久 的内存区. 不象 scull, 它使用 kmalloc, scullc 使用内存缓存. 量子的大小可在编译 时和加载时修改, 但是不是在运行时 -- 这可能需要创建一个新内存区, 并且我们不想处 理这些不必要的细节.

scullc 使用一个完整的例子, 可用来试验 slab 分配器. 它区别于 scull 只在几行代码. 首先, 我们必须声明我们自己的 slab 缓存:

/* declare one cache pointer: use it for all devices */ kmem_cache_t *scullc_cache;

slab 缓存的创建以这样的方式处理( 在模块加载时 ):

/* scullc_init: create a cache for our quanta */ scullc_cache = kmem_cache_create("scullc", scullc_quantum,

0, SLAB_HWCACHE_ALIGN, NULL, NULL); /* no

ctor/dtor */

if (!scullc_cache)

{

scullc_cleanup(); return -ENOMEM;

}

这是它如何分配内存量子:

/* Allocate a quantum using the memory cache */ if (!dptr->data[s_pos])

{

dptr->data[s_pos] = kmem_cache_alloc(scullc_cache, GFP_KERNEL); if (!dptr->data[s_pos])

goto nomem;

memset(dptr->data[s_pos], 0, scullc_quantum);

}

还有这些代码行释放内存:

for (i = 0; i < qset; i++)

if (dptr->data[i])

kmem_cache_free(scullc_cache, dptr->data[i]); 最后, 在模块卸载时, 我们不得不返回缓存给系统:

/* scullc_cleanup: release the cache of our quanta */ if (scullc_cache)

kmem_cache_destroy(scullc_cache);

从 scull 到 scullc 的主要不同是稍稍的速度提升以及更好的内存使用. 因为量子从一 个恰好是合适大小的内存片的池中分配, 它们在内存中的排列是尽可能的密集, 与 scull 量子的相反, 它带来一个不可预测的内存碎片.

最新文章

  1. Windows环境下vscode-go安装笔记
  2. Jni :三维数组处理方法 ,以整形三维数组为例 C++实现
  3. 【转】Nginx中upstream有以下几种方式:
  4. Google Android 6.0 权限完全解析
  5. Matlab中diag函数注意事项
  6. IIS 之 HTTP错误 404.17 - Not Found(请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。)
  7. Linux LiveCD 的制作
  8. DHCP服务详解
  9. C#_delegate - 调用列表 计算阶乘
  10. DB天气app冲刺第二天
  11. 利用python 与 wmi 获取WINDOWS基本信息
  12. 1.Nginx 简介
  13. 菜鸟脱壳之脱壳的基础知识(五)——利用内存断点寻找OEP
  14. eclipse经常出现——未响应!!!
  15. battery for stm32
  16. 观文章《Linux系统管理员修炼三层次》有感
  17. Yum 安装并设置 MySQL
  18. k序列和
  19. python中读取配置文件的方式
  20. CCF——数位之和201512-1

热门文章

  1. 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线
  2. JMeter与LoadRunner的对比
  3. Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取
  4. python 文件读写编码
  5. 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务
  6. HZOJ 简单的期望
  7. HZOJ Silhouette
  8. Python中的socket
  9. 巨蟒python全栈开发-第11阶段 ansible3_3入门playbook剧本
  10. C#判断文件是否被混淆