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 打开情况下的内存布局,好戏才刚刚开始。
相关文章:

java wait abc_java----wait/notify
解释wait/notify必须配合synchronized使用democlass NotifyStop2 {private final Object lock new Object();public void add(String s) throws InterruptedException {Thread.sleep(1000);synchronized (lock) {System.out.println("add notify qian");//唤醒其他线…

hdu-1166敌兵布阵
这个题目就是考察线段树的基本用法,我自己打了代码,其实就是照模板来的,大概思想已经弄懂了。用c不能过,说我超时,就改成c的读入读出,这坑爹的过了。我最爱的c,你肿么了。。。 这是ac的代码&…

Android数据存储(三)——SQLite
如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite。 SQLite的特点:轻量级、嵌入式的、关系型数据库。可移植性好,易使用,小,高效且可靠,与使…
3GPP组织和协议概述
3GPP组织概述 1. TSG/WG 3GPP是以工作组开展工作的,目前有3个大的技术规范组:RAN, SA, CT, 这一级别的工作组英语写为 TSG (Technical Specification Group)。每个TSG下面又分了很多工作组(WG: work group). 详见下表: https://www.3gpp.or…

mysql被拖垮_说几个拖垮系统的小细节!
本文首发于个人微信公众号《andyqian》,期待你的关注!前言有好几天没有更新了,期间确实比较忙些,以至于周末也没休息。在这期间,感触还是蛮深的。现在碎片化的想法等整理好后,再以文章的形式分享出来。今天要说的是另外…

为 区域添加 Tag
tagsinput selectTag 转载于:https://www.cnblogs.com/yunqianduan/p/4740902.html

android中文字中间有超链接的实现方法
1.XML里写: <resources> <string name"ACCOUNT_REGISTER_PROMPT_AGREEMENT">点击注册,表示同意<a href"http://www.ouragreement.com">服务协议</a></string> </resources> <TextView …

4.4 类型转换
from http://www.learncpp.com/cpp-tutorial/44-type-conversion-and-casting/ 类型隐式转换 类型隐式转换的步骤如下所示: Long double (highest)DoubleFloatUnsigned long intLong intUnsigned intInt (lowest) 最底层是int而不是short或是char,是因为…

LFSR 和 m序列
翻译自:sharetechnote: LFSR LFSR Linear Feedback Shift Register - 线性反馈移位寄存器 LFSR 是一种移位寄存器电路,其中两个或多个中间步骤的输出线性组合并反馈到输入值,这就是为什么它被称为线性反馈移位寄存器的原因。 该电路具有以…

python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python
一、描述给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下&…

Qt界面风格设置
每个widget都可以设置风格setStyle(QStyle style)对QApplication设置QStyle即对所有QApplication::setStyle(QStyleFactory::create("Fusion"));其他widget如过没有被设置QStyle,默认使用QApplication的QStyle主要可重写接口绘制复杂控件virtual void …

树莓派练习程序(蜂鸣器)
蜂鸣器模块如下图: 树莓派的引脚如下图: 我们将Vcc引脚连接物理接口1(注意这里需要用3.3v),I/O引脚连接物理接口40,GND引脚连接物理接口39。 实物连接如下图: 编程使用WiringPi库,使…

Gold Code,Gold Sequence
Gold Code Gold Code是以Robert Gold的名字命名的。它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小。由于这种特性(较小的相关性),它被广泛地用作各种无线通信系统的扰码。 我们可以非常简单地利用 m序列 来生成Gold Code: 选择两…

【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装
我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键字来搜索我们想要的文章呢? 虽然mysql的MYISAM提供全文索引,但是只支持中文,并且性能却不敢让人恭维…

java 开源sns_JEESNS V1.0发布,JAVA 开源 SNS 社交系统
JEESNS V1.0 发布了,本次更新内容:增加后台管理员授权与取消功能增加私信模块解决在微博页面,左侧微博点赞过后,左侧展示列表小手会变黑,但是右侧热门出小手依然是白色修复后台添加栏目、文章成功后,提示页…

Balanced Binary Tree leetcode java
题目:Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 题解:采用递归…

leaflet地图框架
leaflet 中文API LeafLet js 官网: http://leafletjs.com/index.html LeafLet js 官网demo: http://leafletjs.com/examples.html LeafLet js 官网API: http://leafletjs.com/reference-1.3.0.html L.Map API各种类中的核心部分,用…

NR:UE初始搜网流程
UE的初始搜网流程,PSS->SSS->PBCH->RMSI.我画了一个简单的流程图如下,里面标注了每个环节的重点。 UE的初始搜网流程: 分为SSB同步(包括MIB读取)和RMSI的读取。 1. SSB SSB包括: PSS,SSS,PBCH. UE 在GSCN频点上,搜索…

纯CSS3制作的圆角效果按钮菜单
<!DOCTYPE html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>纯CSS3制作的圆角效果按钮菜单丨曲阳雕塑</title> <style type"text/css"> nav{display: block; wid…

java 左右键_js 区分鼠标左右键点击
oncontextmenu 是右键事件但是滚轮事件并没有获取到, 使用vue可以用middle获取Title.box {width: 200px;height: 200px;background: deepskyblue;}let div document.getElementById(app)div.oncontextmenu function (e) {e.preventDefault();console.log(右键, e.button)};d…

面向对象设计领域的OCP原则
一、OCP简介(OCP--Open-Closed Principle ):Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。软件实体应当对扩展开放,对修改关闭,即软件实体应当在不…

Python教学课程分享9-面向对象编程
面向对象程序设计的思想主要是针对大型软件设计而提出的,它的一个关键性观念是将数据以及对数据的操作封装在一起,组成一个相互依存、不可分割的整体,即不同对象之间通过消息机制来通信或者同步。对于相同类型对象进行分类、抽象后࿰…

UE capability与 双连接相关的参数。
UE capability 分为 Network capability 和 Radio capability, 即网络能力和无线能力。 Netowrk Capability UE 在做Attach Request 时会主动上报自己的网络能力;Radio Capability 网络侧下发Enquiry Capability来请求UE无线能力,UE 回复capability inf…

Linux下Tomcat的安装配置
Linux下Tomcat的安装配置 一.下载安装对应的jdk,并配置Java环境。 官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html 下载将jdk加压后放到/usr/local目录下: [rootmaster ~]#chmod 755 jdk-6u5-li…

python登录代码思路_用python登录Dr.com思路以及代码分享
用python登录Dr.com思路以及代码分享发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递Python编程语言Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法…

postgresql开发中可能有用的知识
2019独角兽企业重金招聘Python工程师标准>>> postgresql手册 一、PostgreSQL中可以直接对时间进行加减运算: 查询系统当前时间: select now();或者select current_timestamp;SELECT now()::timestamp 1 year; --当前时间加1年SELECT now():…

css实现 textarea 高度自适应
此textarea非彼textarea ,有经验的老司机们应该知道html标签contenteditable这个属性。 利用此属性使当前的标签成为可以输入的状态,等同于输入框。 演示地址:https://xibushijie.github.io/static/textareaHeihgAuto.html <!DOCTYPE html…

LTE PUCCH Format1
PUCCH 格式 1/1a/1b 是向eNodeB传递1或2或4位数据。 这个过程相当复杂,我们用如下3个章节来描述: PUCCH Format 1,1a,1b 所在RB位置PUCCH F1信号的生成PUCCH 多UE 复用 PUCCH Format 1,1a,1b 所在RB位置 LTE中有很多课题(尤其是物理层),如…

innodb force recovery
innodb force recovery的6种设置: 1.innodb force recovery1,即使发现了损坏页面也继续让服务器继续运行,这个选项对于备份或者转存当前数据尤为有用2.innodb force recovery2,阻止恢复主线程的运行,如果清除操作会导致…

随机森林 java_机器学习weka,java api调用随机森林及保存模型
工作需要,了解了一下weka的java api,主要是随机森林这一块,刚开始学习,记录下。了解不多,直接上demo,里面有一些注释说明:package weka;import java.io.File;import weka.classifiers.Classifie…