




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux 磁盘写操作实时跟踪 分类 Linux Unix 高级应用编程 2011 04 28 00 14 397 人阅读 评论 0 收藏 举报 事实上 我总是对 linux 开源社区的无名英雄们怀着无限的敬意 因此除了完成工作中 需要的功能以外 首先想到的是分享 本篇文章以 GPL 发布 在你转发的时候 请遵循 GPL 协议的规定 在此首先贴出 GPL 公共许可证 或许你会觉得这过于啰嗦 事实上这 是必要的 请谅解 为了不妨碍大家的阅读 在此我给出 GPLv3 的连接地址 GPLv3 下面进入正题 我打算分几个步骤来说明 第一磁盘写操作的过程分析 第二模块导出符号的利用 第三 jprobe 和 kprobe 介绍 第四磁盘写操作跟踪 最后还将给出一个简单的示例程序 第一第一 磁盘写操作过程分析磁盘写操作过程分析 在 linux 内核中 发生一次写操作 从调用 write 函数到数据发起一个写数据到具体块 设备请求之间 大致需要以下几个过程 1 如果用户态调用了一个 write 函数 内核执行 blkdev file write 函数 如果不是 direct io 操作方式 那么执行 buffered write 操作过程 直接调用 generic file buffered write 函 数 Buffered write 操作方法会将数据直接写入 Cache 并进行 Cache 的替换操作 在替 换操作过程中需要对实际的快设备进行操作 address space a ops 提供了块设备操作 的方法 当数据被写入到 Cache 之后 write 函数就可以返回了 后继异步写入的任务绝 大部分交给了 pdflush daemon 有一部分在替换的时候做了 2 读操作在没有命中 Cache 的情况下通过 address space operations 方法中的 readpage 函数发起块设备读请求 写操作在替换 Cache 或者 Pdflush 唤醒时发起块设备 请求 发起块设备请求的过程都一样 首先根据需求构建 bio 结构 bio 结构中包含了读写 地址 长度 目的设备 回调函数等信息 构造完 bio 之后 通过简单的 submit bio 函数 将请求转发给具体的块设备 从这里可以看出 块设备接口很简单 接口方法为 submit bio 更底层函数为 generic make request 数据结构为 struct bio 3 submit bio 函数通过 generic make request 转发 bio generic make request 是一 个循环 其通过每个块设备下注册的 q make request fn 函数与块设备进行交互 如果 访问的块设备是一个有 queue 的设备 那么会将系统的 make request 函数注册到 q make request fn 中 否则块设备会注册一个私有的方法 在私有的方法中 由于不存 在 queue 队列 所以不会处理具体的请求 而是通过修改 bio 中的方法实现 bio 的转发 在私有 make request 方法中 往往会返回 1 告诉 generic make request 继续转发比 bio generic make request 的执行上下文可能有两种 一种是用户上下文 另一种为 pdflush 所在的内核线程上下文 4 接下来 generic make request 再往下发就该到驱动层了 这里不属于我们讨论的范 畴了我们需要监控所有要经过 generic make request 发起到驱动的 bio 因此只有在 bio 被产生或者 submit bio 的位置去拦截 读到这里 你能够想明白这个事情就足够了 第二第二 模块导出符号的利用模块导出符号的利用 模块函数是可以用 EXPORT SYMBOL 宏导出的 其本来的目的是导出之后便于模块 与模块之间的代码重用 已经模块间通讯 在这里我们要讨论其另外一个用法 模块函数 被导出之后 我们可以根据模块名称获取到模块函数对应的位置偏移量 这个值也就是这 个模块函数的首地址 如果我们要想利用 submit bio 那首先就要保证 submit bio 函数的 符号是被导出来了的 事实上我们查看 linux 内核源代码 blk core c Line1620 cpp view plaincopy 1 2 submit bio submit a bio to the block device layer for I O 3 rw whether to READ or WRITE or maybe to READA read ahead 4 bio The bio must be presetup and ready for I O 9 10 11 void submit bio int rw struct bio bio 12 13 int count bio sectors bio 14 bio bi rw rw 15 16 If it s a regular read write or a barrier with data attached 17 go through the normal accounting stuff before submission 18 19 if bio has data bio 22 else 23 task io account read bio bi size 24 count vm events PGPGIN count 25 26 if unlikely block dump 27 char b BDEVNAME SIZE 28 printk KERN DEBUG s d s block Lu on s u se ctors n 29 current comm task pid nr current 30 rw 34 35 36 generic make request bio 37 38 EXPORT SYMBOL submit bio 确实这个 submit bio 函数是被导出了符号的 EXPORT SYMBOL submit bio 或许你 觉得这来的太轻松了 事实上要分析到这一步真的需要很多耐心的 所有磁盘读写操作最 终要真正的往磁盘上写文件 所有真实要到达磁盘的数据 bio 都必将经过这个函数 虽然 是导出来符合 我们能直接调用 可是直接调用似乎不能达到我们想要的效果获取到这个 bio 结构 反而要我们传给它一个 bio 结构 对这个函数如何处理呢 正如你所想的那样 我们如果能在这个函数执行的时候插入一个函数到这里拦截就对了 就像 c 语言的 setjmp 和 longjmp 那样工作 可是在编译过了的 linux 内核中能实现吗 答 案是肯定的 这就是下一节所讲的 kprobe 机制 第三第三 jprobe 和和 kprobe 介绍介绍 顾名思义 probe 就是探头的意思 即是说在函数 f1 调用的时候 设置一个探头 f2 到这 个函数 f1 的位置 并且获取到 f1 的参数 抛给 f2 然后 跳到 f2 的位置执行 完了之后 再回到到 f1 执行 更多关于 kprobe 的介绍请自行 google 查找 在 linux 内核的 sample 目录下也有一个使 用的例子 这里只做简单的介绍 其功能简单说 就是在函数被调用的时候 能拿到这个 函数的参数 做一些处理 而如果我们设置一个 jprobe 到 submit bio 这个函数上 那么 我们就可以获取到 bio 结构的信息了 jprobe 结构定义如下 cpp view plaincopy 1 struct jprobe 2 struct kprobe kp 3 void entry 4 那么总结一下设计思路 一句话 构建一个 jprobe 探头插入到 submit bio 处 事实上 要得出这句话的结论要经历很多伤感的事情 哈哈 kprobe 结构中有两个重要的成员 symbol name addr symbol name 就是那个函数的 符号 这里就应该是 submit bio 的符号 addr 就是这个函数的地址 就是内核函数 kallsyms lookup name submit bio 返回的值 需要注意的是在 jprobe 结构中的 kprobe 只能是 addr 或是 symbol name 其中一个填入了值 如果两个都填入 在注册这个探头的 时候就会出现错误 21 非法符号 举例说明 如果 addr 为 0 x1000000 那么 symbol name 就该是 NULL 如果 symbol name 为 submit bio 那么 addr 就该为 NULL 不能是两个都是有效的数据 具体设置哪一个值 根据内核版本而定 很多发型版本并 没有导出 kallsyms lookup name jprobe 的另一个成员是 entry 这就是我们自己定义的那个探头程序 有一点必须说明 就是注册进去的探头程序应该和被注册的函数的参数列表一致 比如 void submit bio int rw struct bio bio 那么注册进去的探头程序也该是 void submit bio probe int rw struct bio bio 因此对于 submit bio 这个函数 要想注册一个 jprobe 探头函数给它 那么这个 jprobe 结构就应该类似于下面这个样子 cpp view plaincopy 1 struct jprobe submit bio jprobe 2 entry kprobe opcode t submit bio jprobe 3 kp 4 addr NULL symbol name submit bio 5 6 第四第四 磁盘写操作跟踪磁盘写操作跟踪 磁盘操作的跟踪 逻辑已经很清楚了 那么具体如何去做 首先这是 linux 内核编程 因此我们需要写一个模块 当然你也可以傻到去修改内核 实现一个系统调用 这里我们按照正常人的思维去做 在实现的模块中 初始化的时候把 这个探头程序注册进去 然后在模块释放的时候卸载这个探头程序 注册探头程序用 register jprobe 卸载用 unresister jprobe 仅此而已 似乎讲到了这里的时候 你会发现 这是一件特别简单的事情了 内核调用也不会超过 10 个 也实在没有必要再详细的说下 去了 这里给出一个简单的实例程序 其功能是打印出 哪个设备的那一个扇区之后的多 少个扇区发生了写操作 打印的格式为 device dm 0 command write start 10240 count 8 其中 device 为对应的设备名 command 为动作 是读还是写 start 为动作发生的起 始扇区 count 是 start 这个位置之后的多少个扇会发生 command 类型的操作 下面给出源代码和 makefile 文件 dwm mod c cpp view plaincopy 1 include 2 include 3 include 4 include 5 6 static void submit bio probe int rw struct bio bio 7 if bio 9 printk KERN INFO device s command s start 10lld co unt d n 10 bdevname bio bi bdev b rw 12 13 jprobe return 14 15 16 static struct jprobe my jprobe 17 entry kprobe opcode t submit bio probe 18 kp 19 can not set both addr and symbo name 20 either set addr or symbol name 21 if not 21 while retured 22 addr NULL kprobe opcode t 0 xc04e6e4 23 symbol name submit bio 24 25 26 static int init my init void 27 int ret 0 28 printk KERN INFO submit bio jprobe module install n 29 ret register jprobe 30 if ret 0 31 printk KERN INFO register jprobe failed returned d n re t 32 return ret 33 34 printk KERN INFO Planted jprobe at p handler addr p n 35 my jprobe kp addr my jprobe entry 36 return ret 37 38 static void exit my exit void 39 printk KERN INFO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5月电子商务师三级练习题与参考答案
- 化学计算题 期中真题汇编 人教2024版九年级化学上册
- 达标测试人教版八年级上册物理《声现象》定向测评试题(详解)
- 难点解析人教版八年级上册物理声现象《声音的特性声的利用》章节练习试题(含答案解析版)
- 解析卷-人教版八年级上册物理声现象《声音的特性声的利用》章节训练试卷(解析版)
- 2025及未来5年中国托辊密封圈市场调查、数据监测研究报告
- 2025及未来5年中国标准试验销市场调查、数据监测研究报告
- 考点攻克苏科版八年级物理上册《物体的运动》章节测试试卷(解析版含答案)
- 考点解析-人教版八年级上册物理机械运动《运动的描述》重点解析试卷(附答案详解)
- 2025及未来5年中国和谐世界冷光琉璃钢雕塑市场调查、数据监测研究报告
- 信息论与编码(第4版)完整全套课件
- 汽修厂安全风险分级管控清单
- GB/T 2679.7-2005纸板戳穿强度的测定
- GB/T 25840-2010规定电气设备部件(特别是接线端子)允许温升的导则
- GB/T 25146-2010工业设备化学清洗质量验收规范
- 参考资深同传
- 多功能注氧仪说明书课件
- 科隆电磁流量计培训课件
- 全集举一反三课件奥数五年级(数学)
- 中国民间故事整本书导读课教学设计
- 商业银行贷款风险分类实务
评论
0/150
提交评论