Linux 内核内存检测工具 - Kmemcheck(3)

来源:developworkds 作者:聂洪杰 ,丁成
  

对清单 9 的分析可以参考清单 6。

3. 本例中(完整代码请参阅附件 1 中的 kmemchk_free.c),我们先用 kmalloc 分配内存,完毕后释放该内存,然后再去访问被释放了的内存空间,我们会发现 kmemcheck 会发出访问内存已释放警告信息(即 KMEMCHECK_SHADOW_FREED 类型的错误信息)


清单 10. Freed 警告日志
				
…
 static int __init kmemchk_freed_init(void) 
 { 
        …
        /* using kmalloc to allocate 4KB memory without GFP_NOTRACK flag*/ 
        kmalloc_base = kmalloc(4*1024*1024,GFP_KERNEL);  
        …
 } 

 static void __exit kmemchk_freed_exit(void) 
 { 
        int offset; /* offset to the kmalloc base address */ 
        
        if(kmalloc_base) { 
          kfree(kmalloc_base); /* free the memory */ 
          offset = 220; 
        printk("checkpoint:access mem -base: %p offset: %d \n\n",kmalloc_base,offset); 
         if(*(kmalloc_base + offset) == 'a') /*access freed memory */
            printk("You hit a random char \n"); 
        } 
…
 } 
…

该模块在卸载时会出现如下 kmemcheck 的警告信息(完整 log 信息请参阅附件 2):


清单 9. Freed 警告日志
				
 WARNING: kmemcheck: Caught 8-bit read from unallocated memory (cef2c624) 
 53050000000604a8040000103331000008070b7c0500000ef5440000070cfc00 
 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a 
         ^ 
 Pid: 1490, comm: bash Tainted: G      D W  (2.6.31.1 #2) V71 
 EIP: 0060:[<d0aca04e>] EFLAGS: 00010286 CPU: 0 
 EIP is at 0xd0aca04e 
 EAX: cef2cc00 EBX: d0aca000 ECX: 00000000 EDX: c1001000 
 ESI: 00000000 EDI: b7efffc0 EBP: cf2a0f5c ESP: c09e2ae0 
 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 
 CR0: 8005003b CR2: 08100118 CR3: 0ec01000 CR4: 000006d0 
 DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 
 DR6: ffff4ff0 DR7: 00000400 
 [<c0401123>] do_one_initcall+0x23/0x180 
 [<c0471b71>] sys_init_module+0xb1/0x1f0 
 [<c0403b14>] sysenter_do_call+0x12/0x28 
 [<ffffffff>] 0xffffffff 

在该例中,由于 kmalloc 是基于 slab cache 机制的,对一个对象的释放不会马上释放该对象所在的页面,因而会出现非法访问警告信息(但是如果对象所在的数据页面也被释放了,则不会出现警告,因为影子页面也同时被释放了)。




小结

kmemcheck 的使用可以检查出对未初始化内存的非法访问,但是它有时候也会产生一些伪警告信息。另外,kmemcheck 的启用会消耗一些额外的内存(其中一个原因就是它会为跟踪的每一个数据页面分配一个影子页面),同时 kmemcheck 所用到的 CPU 单步调试功能以及因其所产生的多余的处理流程(如页面异常中挂接的处理函数)也将会影响到机器的运行速度,因此,kmemcheck 更多的只是一个内核调试功能,它目前还在不断的改进当中。





下载

描述 名字 大小 下载方法
样例代码 code1.zip 2KB HTTP
样例代码 code2.zip 2KB HTTP


作者简介

聂洪杰,IBM 中国系统与科技研发中心,目前从事 GPFS 测试工作。niehj@cn.ibm.com


 

丁成,软件工程师,目前在 IBM 开发中心从事 AIX 性能测试方面的工作,您可以通过 dingc@cn.ibm.com 与他联系。


时间:2009-11-20 21:08 来源:developworkds 作者:聂洪杰 ,丁成 原文链接

好文,顶一下
(7)
87.5%
文章真差,踩一下
(1)
12.5%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量