我在 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;
}

思路如下:

  1. 申请n个bytes大小的内存,
  2. 打印刚刚分配出的内存布局;(obj 前head_size个 bytes + obj + obj 后foot_size个 bytes);
  3. 打印memset obj 后的内存布局;
  4. 打印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 内存布局相关推荐

  1. JOL(java object layout --java 对象内存布局)

    JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址

  2. JOL(java object layout): java 对象内存布局

    我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...

  3. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  4. 理解Java对象:要从内存布局及底层机制说起,话说....

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上 ...

  5. JVM---对象的实例化内存布局与访问定位

    对象的实例化内存布局与访问定位 面试题 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? Java对象头有什么? 从对象创建的方式和步骤开始: 对象创建的方式 new:最常见的方式.单例类中调 ...

  6. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池

    先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...

  7. C++ 多继承和虚继承的内存布局

    原文链接:https://www.oschina.net/translate/cpp-virtual-inheritance 警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中 ...

  8. 图文并茂,傻瓜都能看懂的 JVM 内存布局

    本 JVM 系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握 JVM 相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习 JVM 知识,还是需要去阅读专业的书籍和文档. 本 ...

  9. 64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

    点击上方石杉的架构笔记,右上选择"设为星标" 每日早8点半,精品技术文章准时送上 往期文章 BAT 面试官是如何360°无死角考察候选人的(上篇) 每秒上万并发下的Spring C ...

最新文章

  1. 四轴飞行器实践教程第1章什么是飞行器
  2. jQuery的Tooltip插件
  3. C语言实现动态数组dynamic array(附完整源码)
  4. python学习-异常(异常类型,异常处理、自定义异常)
  5. Java自学笔记(16):常用类:Math,Data和Calender,Format,Scanner
  6. Python快速安装库的靠谱办法
  7. Python基础7(集合与深浅copy)
  8. JMS学习(java)
  9. 【学术篇】SDOI2008 仪仗队
  10. 抖音举办平台治理开放日 半年捣毁25个黑产团伙
  11. 各类数据库默认端口总结
  12. 快讯丨业界首本云网络图书发布
  13. 数值分析思考题(钟尔杰版)参考解答——第六章
  14. 《不要等到毕业以后》读书笔记
  15. eclipse+tomcat+mysql中JDBC驱动加载失败已解决
  16. 使用tensorflow2.0搭建DCGAN网络生成卡通 头像
  17. 计算机仿真撤稿,LOL云顶之弈11.5天神裁决天使阵容攻略 新版本裁决天使运营思路...
  18. 银行测试(7)-支付测试
  19. 单片机工程师如何继续提升自己?
  20. 下沉市场三巨头,趣头条全面掉队

热门文章

  1. acitivity 和fragment 通信,使用广播来传递信息的问题
  2. MAC OS X的ACL扩展权限设置
  3. 「UI 测试自动化selenium」汇总
  4. H - Parity game-poj1733(需要离散化)
  5. emacs python环境配置
  6. [原]tornado源码分析系列(三)[网络层 IOLoop类]
  7. “AS3.0高级动画编程”学习:第二章转向行为(上)
  8. Windows启动exe应用程序,无法正常启动(0xc000007b)的解决办法
  9. 智能手环功能模块设计_智能手环的设计的方案.doc
  10. iOS和android h5字体差异,关于移动hybrid开发中H5页面的字体应与系统保持一致的问题...