linux内核源码分析之slab(四)
目录
概述
实验
解析
概述
创建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数量。
综述:
- slab从buddy分配一个order为0的内存(一页),把这一页命名为slab_test,
- 把这一页分成很多小的object的,使用的时候就从slab中获取一个object
- 用完归还给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(四)相关推荐
- Linux内核源码分析之内存管理
本文站的角度更底层,基本都是从Linux内核出发,会更深入.所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉. 1.页 内核把物理页作为内存管理的基本单元. 尽管处理器 ...
- Linux内核源码分析《进程管理》
Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...
- Linux内核源码分析方法—程序员进阶必备
一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是 ...
- Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】...
原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinauni ...
- Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】...
原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...
- Linux内核源码分析—从用户空间复制数据到内核空间
Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...
- 【技术分享篇】Linux内核——手把手带你实现一个Linux内核文件系统丨Linux内核源码分析
手把手带你实现一个Linux内核文件系统 1. 内核文件系统架构分析 2. 行行珠玑,代码实现 [技术分享篇]Linux内核--手把手带你实现一个Linux内核文件系统丨Linux内核源码分析 更多L ...
- iostat IO统计原理linux内核源码分析----基于单通道SATA盘
iostat IO统计原理linux内核源码分析----基于单通道SATA盘 先上一个IO发送submit_bio流程图,本文基本就是围绕该流程讲解. 内核版本 3.10.96 详细的源码注释:htt ...
- Linux内核源码分析方法
说明:这是一个刚接触内核三个月的同学,通过对一个内核特性的分析,总结出一套分析内核的方法. 一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们 ...
最新文章
- 当客户说“你们的价格太高了”
- [图示]话剧《被结婚时代》将剩女分4级
- Nginx 静态文件 location 指定
- Android 超高仿微信图片选择器 图片该这么加载
- 「Apollo」百度Apollo感知模块(perception)红绿灯检测代码完整+详细解析
- 简单的协议应用-代理模式
- 阜阳市乡镇企业中专学校计算机教师高翱简介,2017年中南林业科技大学博士研究生奖助学金...
- python rabitmq_python使用rabbitmq实例二,工作队列
- 【推荐】 RAC 性能优化全攻略与经典案例剖析
- java 观察者模式_设计模式:全面通晓23种设计模式(典藏查阅)-第三部分
- 【Tensorflow深度学习】Tensorflow2.0GPU版极简安装
- PostgreSQl中 index scan 代价的进一步学习
- 【扩频通信】基于matlab GUI扩频通信系统仿真【含Matlab源码 772期】
- 使用CyberController来将旧手机改造成电脑外挂------手机交互翻译、人脸解锁、语音识别....各个功能等你来探索
- 日本日野汽车因尾气数据造假问题受到调查
- mysql 子链接_MySQL多表查询实例详解【链接查询、子查询等】
- Unit Of Measure UOM in Oracle Applications Inventory
- 《三体1:地球往事》读后感
- swagger生成redoc文档
- ssh登录报no matching MAC found. Their offer: hmac-sha2-512异常
热门文章
- Qt引入图标字体包iconfont
- socket套接字各个接口
- 2022上半年,大城市的各行业工资水平,让人触目惊心
- 阿里开发手册 学习 记忆 理解 表达 融会贯通
- 【elementUI】el-table树形结构样式修改-gif展示说明 按要求自取即可
- Scrum: 时间框 (Timeboxing) 是什么?
- mysql中图片的属性名是啥_数据库属性名
- 【计算机视觉】张正友棋盘格标定法
- Pytho学习(3)——注释
- 上海落户计算机水平毕业研究生,2021应届生落户上海打分标准,部分毕业生可直接落户上海...