From: https://www.cnblogs.com/honpey/p/4575928.html

kprobe原理解析(一)

kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工具,同时它又是其他一些更高级的内核调试工具(比如perf和systemtap)的“基础设施”,4.0版本的内核中,强大的eBPF特性也寄生于kprobe之上,所以kprobe在内核中的地位就可见一斑了。本文想把kprobe的原理掰碎了给大家看。

怎么讲kprobe,我把整个讲述分为两部分,第一部分是kprobe怎么用,第二是kprobe的原理。本篇博客先说kprobe怎么用。

kprobe是什么?

如何高效地调试内核?printk是一种方法,但是printk终归是毫无选择地全量输出,某些场景下不实用,于是你可以试一下tracepoint,我使能tracepoint机制的时候才输出。对于傻傻地放置printk来输出信息的方式,tracepoint是个进步,但是tracepoint只是内核在某些特定行为(比如进程切换)上部署的一些静态锚点,这些锚点并不一定是你需要的,所以你仍然需要自己部署tracepoint,重新编译内核。那么kprobe的出现就很有必要了,它可以在运行的内核中动态插入探测点,执行你预定义的操作。

kprobe怎么使用?

kprobe主要有两种使用方法,一是通过模块加载;二是通过debugfs接口。

模块加载的方式:内核源码下有目录下 samples/kprobes,该目录下有许多kprobes的例子,可以仿照这些例子写自己的kprobe模块。以kprobe_example.c为例,首先声明一个kprobe结构体,然后定义其中几个关键成员变量,包括symbol_name,pre_handler,post_handler。其中,symbol_name是函数名(kprobe_example.c中该项为do_fork),告诉内核我的探测点放置在了函数do_fork处,pre_hander和post_hander分别表示在执行探测点之前和之后执行的钩子函数。然后通过register_kprobe函数注册kprobe即可。将kprobe_example.ko inmod进内核之后,每当系统新启动一个进程,比如执行ls,cat等,都会输出:

          pre_hander: p->addr = 0x***, ip = ****.post_handler: p->addr = 0x***, pc = ****.

第一行是执行pre_handler钩子函数的输出,第二行是执行post_handler钩子函数的输出,当然这些都是内核中案例的写法,你可以写自己的钩子函数。

通过debugfs接口注册kprobe:模块加载的终究不是很方便,尤其对于一些不带gcc的嵌入式系统,需要交叉编译ko,将ko拷贝到单板,然后insmod,不便。debugfs下(确切地说,应该是ftrace)提供了一套注册、使能、注销kprobe的接口,可以很方便地操作kprobe。

用法如下:

1. cd /sys/kernel/debug/tracing【有些系统没有挂载debugfs,需要先挂载下 mount -t debugfs nodev /sys/kernel/debug】

2. 进入到tracing目录,这里就是传说中ftrace的天下了,执行:

echo "p:sys_write_event sys_write" > kprobe_events

向kprobe_events写入"p:sys_write sys_write",注册kprobe事件。你会发现,当前目录下的events下,新增一个kprobes目录,该目录下:

root@station:/sys/kernel/debug/tracing/events/kprobes# ls
enable  filter  sys_write_event

即,我们注册的kprobe事件生效了。那么"p:sys_write_event sys_write"是什么意思呢?首先p表示我们要注册一个kprobe,如果要注册retprobe,此处应为r;sys_write_event表示这个kprobe叫什么名字;sys_write表示我们的插入点在哪里。那么,“p:sys_write_event sys_write”的语义就很明显了:在函数sys_write处插入一个kprobe点,这个点的名字叫sys_write_event。

3. 使能kprobe。执行:

cd /sys/kernel/debug/tracing/events/kprobes/events/sys_write_event
echo 1 > enable
cd ../../.. 【退回到/sys/kernel/debug/tracing,查看trace文件的输出】
cat trace 

trace文件的输出是如下的:

           .....bash-808   [003] d... 42715.347565: sys_write_event: (SyS_write+0x0/0xb0).....

解释下置红的这条输出:pid为808的进程bash,在自本次开机42715.345565秒的时候,调用了一次函数sys_write。

4. 撤消kprobe。执行

             cd /sys/kernel/debug/tracing/events/kprobes/events/sys_write_eventecho 0 > enable【首先先关闭kprobe】cd ../../..echo "-:kprobes/sys_write_event" >> kprobe_events 【注销kprobe】     

以上就是kprobe的两种注册及使用方式:通过模块加载以及通过debugfs注册。这两种使用方法有什么联系?

使用模块加载的方式,是kprobe的一种原始用法:在kprobe结构体里定义插入点、钩子函数,然后通过register_kprobe注册上这个kprobe即可。ftrace接口是kprobe的一种应用,它是一套trace的框架,下面的trace机制包括tracepoint、function trace等,kprobe仅仅是这些trace机制中的一员。上面的讲述我们也已经看出来了,通过ftrace注册的kprobe的输出是在ftrace的输出:trace文件。模块加载模式中我们可以自定义kprobe的钩子函数pre_handler和post_handler,但是在ftrace下注册的kprobe的钩子是ftrace接口默认的,我们设置不了,但是具体输出什么,我们可以在echo “p:sys_write_event sys_write"时指定,比如指定x1寄存器的内容等,所以ftrace下注册的kprobe功能同样很强大。同时,由于ftrace下kprobe的输出基于ftrace的输出框架,所以输出信息包含当前进程、CPU、时间戳等信息,对于trace来说非常有用。

好了,kprobe的用法先介绍到这里了,这都是最简单的用法,高级用法可以参看内核文档:kprobes.txt 以及 kprobetrace.txt。kprobe的原理将在下面一篇博客中详细介绍。

转载于:https://www.cnblogs.com/muahao/p/9428526.html

[转载] kprobe原理解析(一)相关推荐

  1. kprobe原理解析

    参考  http://www.cnblogs.com/honpey/p/4575928.html kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工具,同时它又是其他一些更高级的内核 ...

  2. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...

  3. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  4. 秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  5. 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 本节,将从 ...

  6. Android之Butterknife原理解析

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 Butterknife是一个专注于Android系统的View注入框架, ...

  7. spring配置文件中非bean标签的原理解析

    2019独角兽企业重金招聘Python工程师标准>>> 在spring配置文件中,我们经常见到context:property-placeholder/context:compone ...

  8. RocketMQ原理解析-producer 4.发送分布式事物消息

    2019独角兽企业重金招聘Python工程师标准>>> RocketMQ原理解析-producer 4.发送分布式事物消息 博客分类: MQ 为什么消息要具备事务能力 还是比较清晰的 ...

  9. 爱加密Android APk 原理解析

    转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025 爱加密Android APK加壳原理解析 一.什么是加壳? 加壳是在二 ...

最新文章

  1. 在EditText前面添加一个搜索的小图片
  2. 博易大师 行情服务器文件,博易大师目录
  3. 用nagios监控ORACLE服务器
  4. js中的 return false;
  5. Ubuntu下gcc多版本共存和版本切换
  6. [转]ASP.NET 状态服务 及 session丢失问题解决方案总结
  7. 100 计算机网络基础知识
  8. shell中find某个文件排除某个目录
  9. 阿里云云计算 23 VPC的基础架构
  10. STL之仿函数实现详解
  11. 99定时器设计c语言,51单片机写的曝光定时器C语言程序
  12. 或有事项会计处理研究 ——以广西上市公司为例
  13. 搭建企业级数据治理体系指南
  14. 胡润研究院发布《2018胡润区块链富豪榜》
  15. 调起APP功能的实现
  16. 跨越敏捷 — 闲鱼研发效能升级之路
  17. 电气火灾监控系统在杭州湾新区产业园区一期的设计与应用——安科瑞 陆琳钰
  18. Js获取上传文件的绝对路径时总是的到C:\fakepath\+文件名称 解决方案
  19. realsense d435i标定imu与camera
  20. 解决模拟器方向键无法使用问题

热门文章

  1. 三次iframe框架切换
  2. mac php memcache扩展,Mac下PHP安装Memcache扩展
  3. html5%3cimg%3e属性,汽车之家存储型xss可大规模获取任何用户cookie
  4. oracle 树形结构表,树结构表递归查询在ORACLE和MSSQL中的实现方法
  5. xcode 自己常用到的快捷键
  6. pytorch创建datset
  7. php动态页面在ie浏览器中css布局板块全缩在中间,CSS网页布局开发时的常见问题及解决方法...
  8. java回调和监听的区别_java监听机制的原理-回调机制
  9. linux文件自动改名,C#如何在生成文件夹或者文件时候自动重命名
  10. 50岁开始学python_再过两年C语言就50岁了,这么老的编程语言怎么还没有过时?...