目录

概述

实验

解析


概述

创建slab缓存,分配对象的实例,kmem_cache_create( )函数创建一个slab新缓存

struct kmem_cache * kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *))
  • name:缓存名称,proc文件系统(在/proc/slabinfo中)标识一个缓存。
  • size:缓存创建的对象的大小,它是以字节为单位。
  • align:每个对象的对齐方式。
  • flags:分配缓存时的选项;
  • ctor:一个可选的对象构造器,构造器是用户提供的回调函数。当从缓存中分配新对象时,可以通过构造器进行初始化。

实验

为studentA分配内存空间,先创建缓存cache,再分配obj。通过命令行查看slab对应的信息

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/mm.h>static struct kmem_cache* slab_test;
struct student{int age;int score;
};
struct student* studentA;
static int num=0;static void mystruct_constructor(void *addr)
{memset(addr, 0, sizeof(struct student));printk(KERN_DEBUG"alloc mem cache num=%d\n",num++);
}
int slab_test_create_kmem(void)
{int ret = -1;//alloc cacheslab_test = kmem_cache_create("slab_test", sizeof(struct student), 0, 0, mystruct_constructor);if(slab_test != NULL){printk("slub_test create success!\n");ret=0;}//alloc objstudentA = kmem_cache_alloc(slab_test, GFP_KERNEL);if(studentA != NULL){printk("alloc object success!\n");ret = 0;}return ret;
}static int __init slab_test_init(void)
{int ret;printk("slab_test kernel module init\n");ret = slab_test_create_kmem();return 0;
}static void __exit slab_test_exit(void)
{printk("slab_test kernel module exit\n");kmem_cache_destroy(slab_test);
}MODULE_LICENSE("GPL");
module_init(slab_test_init);
module_exit(slab_test_exit);

首先编译模块,执行命令insmod slab.ko插入模块,然后执行命令dmesg

dmesg 查看日志信息


[67668.244654] slab_test kernel module init
[67668.244689] slub_test create success!
[67668.244691] alloc mem cache num=0
[67668.244692] alloc mem cache num=1
[67668.244692] alloc mem cache num=2...
[67668.244917] alloc mem cache num=253
[67668.244918] alloc mem cache num=254
[67668.244918] alloc mem cache num=255
[67668.244919] alloc object success!

解析

回调函数 mystruct_constructor被调用256次 ,这是因为当从缓存中分配新对象时就要调用一次。在下面分析中可以看到分配的obj数量。

综述:

  1. slab从buddy分配一个order为0的内存(一页),把这一页命名为slab_test,
  2. 把这一页分成很多小的object的,使用的时候就从slab中获取一个object
  3. 用完归还给slab管理。

此外还可以通过/sys/kernel/slab/slab_test 查看属性

root@ubuntu:/sys/kernel/slab/slab_test# ls
aliases      cpu_partial     free_calls     object_size      partial          remote_node_defrag_ratio  slabs_cpu_partial  trace
align        cpu_slabs       hwcache_align  objects_partial  poison           sanity_checks             slab_size          usersize
alloc_calls  ctor            min_partial    objs_per_slab    reclaim_account  shrink                    store_user         validate
cache_dma    destroy_by_rcu  objects        order            red_zone         slabs                     total_objectsroot@ubuntu:/sys/kernel/slab/slab_test# cat object_size
8
root@ubuntu:/sys/kernel/slab/slab_test# cat slab_size
16
root@ubuntu:/sys/kernel/slab/slab_test# cat objs_per_slab
256
root@ubuntu:/sys/kernel/slab/slab_test# cat order
0

参考

深入理解Linux slab分配器 - 知乎

Linux内核API kmem_cache_create|极客笔记


linux内核源码分析之slab(四)相关推荐

  1. Linux内核源码分析之内存管理

    本文站的角度更底层,基本都是从Linux内核出发,会更深入.所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉. 1.页 内核把物理页作为内存管理的基本单元. 尽管处理器 ...

  2. Linux内核源码分析《进程管理》

    Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...

  3. Linux内核源码分析方法—程序员进阶必备

    一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是 ...

  4. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】...

    原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinauni ...

  5. Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】...

    原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...

  6. Linux内核源码分析—从用户空间复制数据到内核空间

    Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...

  7. 【技术分享篇】Linux内核——手把手带你实现一个Linux内核文件系统丨Linux内核源码分析

    手把手带你实现一个Linux内核文件系统 1. 内核文件系统架构分析 2. 行行珠玑,代码实现 [技术分享篇]Linux内核--手把手带你实现一个Linux内核文件系统丨Linux内核源码分析 更多L ...

  8. iostat IO统计原理linux内核源码分析----基于单通道SATA盘

    iostat IO统计原理linux内核源码分析----基于单通道SATA盘 先上一个IO发送submit_bio流程图,本文基本就是围绕该流程讲解. 内核版本 3.10.96 详细的源码注释:htt ...

  9. Linux内核源码分析方法

    说明:这是一个刚接触内核三个月的同学,通过对一个内核特性的分析,总结出一套分析内核的方法. 一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们 ...

最新文章

  1. 当客户说“你们的价格太高了”
  2. [图示]话剧《被结婚时代》将剩女分4级
  3. Nginx 静态文件 location 指定
  4. Android 超高仿微信图片选择器 图片该这么加载
  5. 「Apollo」百度Apollo感知模块(perception)红绿灯检测代码完整+详细解析
  6. 简单的协议应用-代理模式
  7. 阜阳市乡镇企业中专学校计算机教师高翱简介,2017年中南林业科技大学博士研究生奖助学金...
  8. python rabitmq_python使用rabbitmq实例二,工作队列
  9. 【推荐】 RAC 性能优化全攻略与经典案例剖析
  10. java 观察者模式_设计模式:全面通晓23种设计模式(典藏查阅)-第三部分
  11. 【Tensorflow深度学习】Tensorflow2.0GPU版极简安装
  12. PostgreSQl中 index scan 代价的进一步学习
  13. 【扩频通信】基于matlab GUI扩频通信系统仿真【含Matlab源码 772期】
  14. 使用CyberController来将旧手机改造成电脑外挂------手机交互翻译、人脸解锁、语音识别....各个功能等你来探索
  15. 日本日野汽车因尾气数据造假问题受到调查
  16. mysql 子链接_MySQL多表查询实例详解【链接查询、子查询等】
  17. Unit Of Measure UOM in Oracle Applications Inventory
  18. 《三体1:地球往事》读后感
  19. swagger生成redoc文档
  20. ssh登录报no matching MAC found. Their offer: hmac-sha2-512异常

热门文章

  1. Qt引入图标字体包iconfont
  2. socket套接字各个接口
  3. 2022上半年,大城市的各行业工资水平,让人触目惊心
  4. 阿里开发手册 学习 记忆 理解 表达 融会贯通
  5. 【elementUI】el-table树形结构样式修改-gif展示说明 按要求自取即可
  6. Scrum: 时间框 (Timeboxing) 是什么?
  7. mysql中图片的属性名是啥_数据库属性名
  8. 【计算机视觉】张正友棋盘格标定法
  9. Pytho学习(3)——注释
  10. 上海落户计算机水平毕业研究生,2021应届生落户上海打分标准,部分毕业生可直接落户上海...