众所周知,踩内存是一个非常麻烦的问题,不管是在应用层或是内核层,关于踩内存的检测也有各种各样的工具,比如应用层的优秀开源valgrind,内核内置的kmemcheck等。关于这些工具的具体信息就不在这里做进一步描述了,本文主要简单介绍一下几种踩内存工具的工作原理。
一种最为简单的踩内存工具为通过给分配的内存前后多加上一小块内存,用于存放我们预先设定的值,比如Crc和Magic:
不管是应用程序(App)或是内核模块(Module),它们分配内存都是利用我们重载过的接口(malloc或kmalloc或new或其它等),这些接口分配比实际请求要大一点的内存,以便在前和后能空留出一个或几个字节存放检测值(也就是前面提到的Crc和Magic)。Magic可以是我们预先指定的特定值,比如0xC0,而Crc可以是某些条件(比如当前请求内存分配的进程的id、名、代码行等)的crc值。应用程序或是内核模块释放内存同样也是利用我们重载过的接口(free或kfree或delete或其它等),在这些接口里就可以做踩内存检测,如果发现Magic不再是我们预先指定的特定值,比如0xC0,则表示该块内存被踩了,而Crc呢?虽然没有固定的值,但也可以通过做同样的计算后做对比检测,或者我们还可以提前在分配内存时把这些值记录下来,比如可以设置一个hash表,把App... [阅读更多]
Linux下都有一个名为watch的命令,这个命令可以帮我们监测另外一个命令的运行结果,这在我们需要一直查看某个命令的输出结果时非常有用。比如,我们知道查看网口eth0上的接收数据包流量的命令如下:
#... [阅读更多]
在家里的电脑上安装CentOS-6.0时为了图快,很多软件包都没有安装上,今天想试下ruby结果发现默认没装上,本想从网上下载ruby进行安装,又一想CentOS-6.0-i386-bin-DVD.iso镜像光盘上应该有,毕竟那可是个4.38G的大家伙,不利用太浪费了,就直接安装这个iso上面提供的ruby.rpm包,于是有了这篇小文。
首先,查看光盘的挂载位置,后面会用到:
#... [阅读更多]
影响内存访问速度的因素主要有:
1.内存带宽:每秒读写内存的数据量,由硬件配置决定。
2.CACHE高速缓冲:CPU与内存之间的缓冲器,当命中率比较高时能大大提供内存平均访问速度。
3.TLB转换旁视缓冲:系统虚拟地址向物理地址转换的高速查表机制,转换速度比普通转换机制要快。
我们能够优化的只有第2点和第3点。由于CACHE的小容量与SMP的同步竞争,如何最大限度的利用高速缓冲就是我们的明确优化突破口(以常用的数据结构体为例):
1.压缩结构体大小:针对CACHE的小容量。
2.对结构体进行对齐:针对内存地址读写特性与SMP上CACHE的同步竞争。
3.申请地址连续的内存空间:针对TLB的小容量和CACHE命中。
4.其它优化:综合考虑多种因素
具体优化方法
1.压缩结构体大小
系统CACHE是有限的,并且容量很小,充分压缩结构体大小,使得CACHE能缓存更多的被访问数据,无非是提高内存平均访问速度的有效方法之一。
压缩结构体大小除了需要我们对应用逻辑做好更合理的设计,尽量去除不必要的字段,还有一些额外针对结构体本身的压缩方法。
1.1.对结构体字段进行合理的排列
由于结构体自身对齐的特性,具有同样字段的结构体,不同的字段排列顺序会产生不同大小的结构体。
大小:12字节
struct... [阅读更多]
kgtp使用总结
1,介绍:
Kgtp项目主页是:http://code.google.com/p/kgtp/
如其项目主页所描述,Kgtp是一个实时且轻量级的Linux跟踪内核调试工具。也许说是一个内核跟踪调试接口更合适,通过它来连通内核和GDB,使得GDB可以对内核进行跟踪调试。GDB既可以是在本机,也可以在另外一台机器上,甚至还可以进行离线调试,而这些感觉应该都是GDB本身提供的Targets、Trace... [阅读更多]
17号说到我最近在研究Linux下如何修改并利用X86 CPU提供的另外两级特权级别对内核驱动进行权限控制,上周周末还真被我找到这么一篇长篇大论:A Hardware-Based Approach to Driver Isolation on x86... [阅读更多]
User Mode Linux肯定很多人都知道,是一个让Linux二进制镜像可以运行到应用层的内核补丁,目前该补丁已经合入到Kernel Mainline。
UML不是这篇日志的主角,我们要介绍的KML(Kernel Mode... [阅读更多]
把cu个人博客的这篇文章转载过来,呵呵。
目 录
1. 本文档介绍
2.边界标记法
3. 分箱式内存管理
4. 核心结构体malloc_state
5. 内存分配相关函数
5.1 函数dlmalloc
5.2 函数tmalloc_small
5.3... [阅读更多]