首页 > slub object 内存布局

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

为了查看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---
", head_size);print_layout(addr-head_size, head_size);printk("---Buf    %d bytes---
", buf_size);print_layout(addr, buf_size);printk("---Footer %d bytes---
", foot_size);print_layout(addr+buf_size, foot_size);
}static int __init my_test_init(void)
{printk("greenricky: init
");buf = kmalloc(mem_size, GFP_KERNEL);printk("===============kmalloc=================
");print_mem_detail(buf, head_size, mem_size, foot_size);memset(buf, 0x57, mem_size);    printk("
===============memset buf to 0x57======
");print_mem_detail(buf, head_size, mem_size, foot_size);kfree(buf);printk("
===============free buf====================
");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的地址。

为了更好的理解上述内存布局,截图注释如下:

在这里插入图片描述

obj - 48 bytes

本例中object size为48 bytes (前4个bytes存储的是FP), obj align 长度为16bytes。

本章介绍的是slub_debug 关闭情况下的内存布局,下一章我们介绍slub_debug 打开情况下的内存布局,好戏才刚刚开始。

更多相关:

  • 1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...

  • size_t和int       size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef   unsigned int size_t; 而在64位架构中被定义为: typedef  unsigned lo...

  • 项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...

  • 更多内容,欢迎关注微信公众号:全菜工程师小辉~前言在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理。这篇博客将针对第三个原因,进行更详细的讲解。首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。零拷贝零拷贝是指避免在用户态(User-space)...

  • 一、预备知识—程序的内存分配  一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器...

  • 我的爱机是一台ThinkPad T420,原装三星DDR 1333 4G内存一根,还剩一根内存位置,最近趁京东6.18促销,准备增加一根物理内存。为了确保兼容性,觉得仍然选购DDR 1333 4G内存,于是购买了金士顿这款,比如DDR3 1600的还贵。 这个安装过程完全参照该内存的网页提示进行 这里简单记录一下,以备...

  • 陪伴我多年的老本ThinkPad T420渐渐垂垂老矣, 我想更新一下可以更新的部分, 比如将2.5寸HDD更换为SSD, 将单条4G内存再增加一根, 凡此种种想法, 可能最后归结为如何获取该笔记本的硬件配置信息, 在windows下面使用鲁大师之类的检测软件, 也许很好搞定,但是在Ubuntu 14.04平台上如果办到呢? 很简单...

  • 一.内存错误出现的场景 这几天在重构ATS插件代码的过程中遇到了烦人的内存泄露问题, 周五周六连续两天通过走查代码的方法,未能看出明显的导致内存错误的代码, 同时也觉得C和C++混合编程得到一个动态库, 在一个.cpp主文件中,即用new又用malloc来动态分配内存, 可能会导致内存错误.后来网上调研和查资料发现, new和mal...

  •         NSString * str = @"123";char buf[20];[str getCString:buf maxLength:20 encoding:NSASCIIStringEncoding];NSLog(@"%s",buf); 转载于:https://blog.51cto.com/8947509/1...

  • sscanf 目录 名称:函数原型:头文件:说明:支持集合操作:例子: 编辑本段名称:   sscanf() - 从一个字符串中读进与指定格式相符的数据. 编辑本段函数原型:   Int sscanf( const char *, const char *, ...);   int scanf( const char...