页面linux内核内存检测东西kmemcheck内核

gdwkb ,Aug 31 15:10 , 文章教程 , 评论(0) , 引用(0) , 阅读(171) , 本站原创 | |
页面  内存  内核  次序  形状  标记  数据  影子  正当  初始化  如许  道理  任务  中缀  功用  异常  本文  东西  指令  函数  系统  地学  标识  清零  地址  动态  指针  典范  启发  时分  属性  紧张  形式  状况  读者  风险  效果  过程  结构  目的  系列  城市  别的  寄存器  无计可施  急迫  数据结构  队列  比拟  圈套
linuxNei∴He∴Nei∴Cun∴Jian∴Ce∴Dong∴Xi∴kmemcheck本文是 Linux 内核内存检测东西系列中的壹篇!主要剖析了 Kmemcheck 的道理!建设和它的典范使用读者正在浏览完本文以后!能紧张地学会如何应用 Kmemcheck 来对内核次序递次停止检测!同时也能从 Kmemcheck 的设想道理中获得壹些启发 Linux 内核内存检测东西 - Kmemcheck
本文是 Linux 内核内存检测东西系列中的壹篇!主要剖析了 Kmemcheck 的道理!建设和它的典范使用读者正在浏览完本文以后!能紧张地学会如何应用 Kmemcheck 来对内核次序递次停止检测!同时也能从 Kmemcheck 的设想道理中获得壹些启发 媒介
  访问正当的内存地址是壹件很风险的工作!假设正在内核次序递次中使用了正当内存中的形式!能够会招致系统解体!若何发觉并毁灭这些潜正在的风险!是正在编写次序递次时都必须考虑的效果正在 Linux 系统中!gcc 会正在编译的时分对内存未初始化的状况收回正告!可是它只能做壹些动态的检查别的假设系统装置了 Valgrind!也能够应用其供给的 memcheck 来动态地对内存停止检查!可是它只能检查出壹些用户态次序递次的效果!对任务正在内核态的次序递次无计可施因此!处理内核开拓任务的时分!我们急迫需求壹个能为内核次序递次供给动态内存检查的东西!所幸的是!正在 Linux 2.6.31 的内核版本中!它供给了壹个如许的内存检测功用 - Kmemcheck! 今朝该功用只支撑 x86 平台
任务道理
Kmemcheck 任务正在内核态!它使用了肆个宏定义来标识内存的形状
KMEMCHECK_SHADOW_UNALLOCATED
正在 slab cache 中!假设没有设置结构函数!那么新分派的 slab 页面正在还没有分派 object 之前!它城市被设置成此形状
KMEMCHECK_SHADOW_UNINITIALIZED
一般状况下!新分派的页面城市被设置成这个形状
KMEMCHECK_SHADOW_FREED
正在 slab cache 中!当某壹个 object 所拥有的内存被开释后!该内存块会被设置成此形状
KMEMCHECK_SHADOW_INITIALIZED
标识以后内存处于初始化形状
正在以上肆种内存形状中!对前叁种形状的内存的访问都是正当的!kmemcheck 会给出响应的正告
为了使 kmemcheck 能够有效的任务!内核中改正了壹些数据结构!比拟主要的有
1. 正在 struct page 中增加了壹个 shadow 的指针!它指向该数据页面所对应的影子页面 !kmemcheck 会为其分派相同数目的影子页面!数据页面经过其 page 结构体中的 shadow 指针和影子页面联系起来然后影子页面中的每个字节会标记为未初始化形状!同时将数据页面对应的页表项中 _PAGE_PRESENT 标记位清零!并置位 _PAGE_HIDDEN 标记位来表现该页面是被 kmemcheck 跟踪的
访问内存
因为正在分派过程当中将数据页面对应的页表项中的 _PAGE_PRESENT 清零了!因此对该数据页面的访问会激发壹次页面异常!正在 do_page_fault 函数处理过程当中!假设它发觉页表项属性中的 _PAGE_HIDDEN 置位了!那么说明该页面是被 Kmemcheck 跟踪的!接上往就会进进 kmemcheck 的处理流程!此中会依据该次内存访问地址所对应的影子页面中的形式来检查此次访问可否是正当的!假设是正当的那么它就会将预先设置好的壹个 tasklet拔出到以后 CPU 的 tasklet 队列中!然后往触发壹个软中缀!如许正在中缀的下半局部就会施行这个 tasklet接上往 kmemcheck 会将影子页面中对应本次内存访问地址的内存区域标识为初始化形状!同时将数据页面页表项中的 _PAGE_PRESENT 置位!并将 CPU 标记寄存器 TF 置位封闭单程序试功用!如许当页面异常处理前往后!CPU 会从头施行触发异常的指令!而此次是能够准确施行的可是施行该指令结束后!因为 TF 标记位置位了!所以正在施行下壹条指令之前!系统会进进调试圈套!正在其处理函数 do_trap 中!kmemcheck 又会清零该数据页面页表项中的 _PAGE_PRESENT 属性标记位!从而当下次再访问到这个页面时!又会激发壹次页面异常本文是 Linux 内核内存检测东西系列中的壹篇!主要剖析了 Kmemcheck 的道理!建设和它的典范使用读者正在浏览
飞扬黑客网  http://www.gdwkb.cn
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]