slub object 内存布局
我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入slub_debug=PZU) 时slub 对象池。
首先我们先看一下slub_debug没有打开时的 slub obj 所占memory layout,预期如下:
为了查看slub obj 内存布局,我写了一个kernle module, code上传至github: https://github.com/greenricky/slub_debug 摘抄主要的代码片段如下:
void print_mem_detail(char *addr, int head_size, int buf_size,int foot_size)
{if(NULL==addr || head_size<0 || buf_size<0 || foot_size<0)return;printk("---Ahead %d bytes---\n", head_size);print_layout(addr-head_size, head_size);printk("---Buf %d bytes---\n", buf_size);print_layout(addr, buf_size);printk("---Footer %d bytes---\n", foot_size);print_layout(addr+buf_size, foot_size);
}static int __init my_test_init(void)
{printk("greenricky: init\n");buf = kmalloc(mem_size, GFP_KERNEL);printk("===============kmalloc=================\n");print_mem_detail(buf, head_size, mem_size, foot_size);memset(buf, 0x57, mem_size); printk("\n===============memset buf to 0x57======\n");print_mem_detail(buf, head_size, mem_size, foot_size);kfree(buf);printk("\n===============free buf====================\n");print_mem_detail(buf, head_size, mem_size, foot_size);return 0;
}
思路如下:
- 申请n个bytes大小的内存,
- 打印刚刚分配出的内存布局;(obj 前head_size个 bytes + obj + obj 后foot_size个 bytes);
- 打印memset obj 后的内存布局;
- 打印free obj 后的内存布局;
在下例中我们实际申请48个bytes的内存,通过查看内核给我们分配是kmalloc-64 obj. 下图是刚刚kmalloc后的内存布局,还没有用memset进行赋值。
# insmod slub.ko head_size=64 mem_size=48 foot_size=64
===============kmalloc=================
---Ahead 64 bytes---
ee598300: 05 47 c2 ee 14 ec c0 ee 14 ec c0 ee c4 1d 03 c0
ee598310: 00 00 00 00 70 58 7b c0 00 a0 eb ee 0c a0 eb ee
ee598320: 00 00 00 00 00 00 00 00 00 00 00 00 4c 52 23 c0
ee598330: 00 a0 eb ee 00 00 00 00 00 00 00 00 00 00 00 00
---Buf 48 bytes---
ee598340: 80 83 59 ee 65 73 74 5f 69 6e 69 74 20 5b 73 6c
ee598350: 75 62 5d 00 00 00 00 00 00 00 00 00 00 00 00 00
ee598360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
---Footer 64 bytes---
ee598370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ee598380: c0 83 59 ee 00 00 00 00 00 00 00 00 00 00 00 00
ee598390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ee5983a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
通过上述打印出来的内存布局来看,我们申请的内存起始地址0xee598340, 结束地址是0xee59837f, 长度为64bytes.
请关注一点,内存区域起始地址的前4个bytes是FP- free pointer, 也就是指向下一个可用object 地址,这里是0xee598380, 而0xee598380正好是我们申请到的内存区域的结束地址的后一个byte。我们继续观察0xee598380 开始这段内存,起始的4个bytes是0xee5983c0, 也就是下一个可用object的地址。
为了更好的理解上述内存布局,截图注释如下:
本例中object size为48 bytes (前4个bytes存储的是FP), obj align 长度为16bytes。
本章介绍的是slub_debug 关闭情况下的内存布局,下一章我们介绍slub_debug 打开情况下的内存布局,好戏才刚刚开始。
slub object 内存布局相关推荐
- JOL(java object layout --java 对象内存布局)
JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址
- JOL(java object layout): java 对象内存布局
我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...
- 【C++】C++对象模型:对象内存布局详解(C#实例)
C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...
- 理解Java对象:要从内存布局及底层机制说起,话说....
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上 ...
- JVM---对象的实例化内存布局与访问定位
对象的实例化内存布局与访问定位 面试题 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? Java对象头有什么? 从对象创建的方式和步骤开始: 对象创建的方式 new:最常见的方式.单例类中调 ...
- 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...
- C++ 多继承和虚继承的内存布局
原文链接:https://www.oschina.net/translate/cpp-virtual-inheritance 警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中 ...
- 图文并茂,傻瓜都能看懂的 JVM 内存布局
本 JVM 系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握 JVM 相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习 JVM 知识,还是需要去阅读专业的书籍和文档. 本 ...
- 64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
点击上方石杉的架构笔记,右上选择"设为星标" 每日早8点半,精品技术文章准时送上 往期文章 BAT 面试官是如何360°无死角考察候选人的(上篇) 每秒上万并发下的Spring C ...
最新文章
- 四轴飞行器实践教程第1章什么是飞行器
- jQuery的Tooltip插件
- C语言实现动态数组dynamic array(附完整源码)
- python学习-异常(异常类型,异常处理、自定义异常)
- Java自学笔记(16):常用类:Math,Data和Calender,Format,Scanner
- Python快速安装库的靠谱办法
- Python基础7(集合与深浅copy)
- JMS学习(java)
- 【学术篇】SDOI2008 仪仗队
- 抖音举办平台治理开放日 半年捣毁25个黑产团伙
- 各类数据库默认端口总结
- 快讯丨业界首本云网络图书发布
- 数值分析思考题(钟尔杰版)参考解答——第六章
- 《不要等到毕业以后》读书笔记
- eclipse+tomcat+mysql中JDBC驱动加载失败已解决
- 使用tensorflow2.0搭建DCGAN网络生成卡通 头像
- 计算机仿真撤稿,LOL云顶之弈11.5天神裁决天使阵容攻略 新版本裁决天使运营思路...
- 银行测试(7)-支付测试
- 单片机工程师如何继续提升自己?
- 下沉市场三巨头,趣头条全面掉队
热门文章
- acitivity 和fragment 通信,使用广播来传递信息的问题
- MAC OS X的ACL扩展权限设置
- 「UI 测试自动化selenium」汇总
- H - Parity game-poj1733(需要离散化)
- emacs python环境配置
- [原]tornado源码分析系列(三)[网络层 IOLoop类]
- “AS3.0高级动画编程”学习:第二章转向行为(上)
- Windows启动exe应用程序,无法正常启动(0xc000007b)的解决办法
- 智能手环功能模块设计_智能手环的设计的方案.doc
- iOS和android h5字体差异,关于移动hybrid开发中H5页面的字体应与系统保持一致的问题...