Ftrace训练营火热报名中:Ftrace训练营:站在设计者的角度来理解ftrace(限50人)。训练营第一期报名已圆满成功,好评如潮。第二期报名正在火爆进行中(咨询小月微信:linuxer2016)。
ARM安全架构训练营火热报名中:阅码场训练营:ARM安全架构之Trustzone-TEE实战。报名咨询客服(小月微信:linuxer2016)。
ARM架构与调优调试训练营火热报名中:阅码场训练营:ARM架构与调试调优。报名咨询客服(小月微信:linuxer2016)。
大家好,我叫小坚,阅码场Ftrace公开课的学员,很开心能有机会跟大家分享。愿与大家一起成长,不忘初心。
心路历程:
作者系某一本电子类专业,毕业后一直从事嵌入式软件开发,到现在差不多有5年工作经验了。作为嵌入式工程师,工作最大的体会就是“杂”,工作内容杂也就意味着啥都不精通。这些年的工作从底层到应用层都有涉及,搞过硬件设计,也做过驱动开发和应用开发,但没有一个领域能够算得上“颇为精通”。感觉自己就是一块革命的砖,哪里需要哪里搬。
程序员的焦虑等不到35岁,在35岁之前就开始了。
不知道从啥时候开始,程序员35岁就会很容易被裁员,会下岗,会去送外卖,摆地摊,开滴滴。我就开始焦虑自己35岁以后的职业生涯,我希望我35岁能活出另外一个样子。我斟酌了很多方案,想过考公务员,进入一个安稳的单位,提前进入退休模式;也想过要考研提升自己的竞争力;还想过走技术管理路线。综合了自己目前的情况,最后选择了最简单也是最艰难的一条路:我笃定要成为内核技术专家,让别人去考虑淘汰的事吧。

做出了这个决定之后,我对自己以往的工作进行了总结,从招聘软件上了解各种岗位的情况,得到的结论就是linux内核开发这个方向比较适合自己,首先自己做嵌入式,对linux内核这方面接触也是比较多的,可以平滑过渡;其次是linux内核开发是比较靠底层的,不会像应用层那样迭代那么快,比较吃经验,比较稳定;最后是看到国产操作系统的崛起和自动驾驶的发展,这个两个行业都需要大量的linux内核人才;当然,最关键是自己对这方面还是比较感兴趣的,而且技术好的linux内核开发者薪资也符合自己的预期。
于是,3年前我就开始了自己的linux内核方向的学习之路。我先从工作中经常碰到的驱动入手,不仅仅解决工作上遇到的驱动问题,我还会有意识深入地了解各种驱动的核心层。比如,我学习并且看过i2c,spi,alsa,v4l2,usb等等的核心层代码,尝试理解各种驱动的底层逻辑。这样干撸了一年代码,一边看一边添加打印函数,查看代码的调用。逐渐地,我了解到linux内核开发主要分驱动开发和性能调优两个方向。我心里盘算了下,做驱动最好还是去芯片原厂,但是广州没有好的芯片原厂,所以我选了性能调优方向。深入之后,我才发现,想要搞性能调优,需要对linux内核的进程调度,内存管理,虚拟文件系统、网络协议栈有所了解。多方调研后,我选择用《linux内核设计与实现》这本书摸着石头过河,一边看书一边撸代码,但是这个进度那叫一个慢。除此之外,上班在地铁的途中也会看一些技术大牛的微信公众号,比如阅码场,里面有很多技术大牛讲解linux内核。
直到有一天,我看到阅码场说要开ftrace公开课,我的内核之路才发生了转折。当时我不知道什么是ftrace,经过百度之后才对ftrace有一些了解,我觉得它有两点很打动我:第一,ftrace可以在不用修改驱动的情况下添加调试信息,之前我自己工作中经常遇到一些驱动问题,都是看代码,添加printk打印调试信息来debug的;第二,ftrace可以跟踪内核代码运行的路径,之前我都是阅读内核源代码的,很少实际跟踪过内核运行,因为添加打印比较麻烦,导致印象不深刻。ftrace在这两方面对我来是真的是太有用了。后面了解到ftrace公开课由jeff老师给大家上课的,jeff老师是linux内核的资深专家,他近期开发了objtrace可以实现变量持续跟踪的功能,并且准备提交patch,于是我就果断报名了。
学习心得:
在学习之前,jeff老师准备好了qemu作为我们的学习环境,由于自己一直搞嵌入式,linux都是直接运行在开发版上的,所以我一直没有接触过qemu。老师准备的qemu使用文档还是比较全的,我参考着文档把qemu跑了起来,并且在其中成功使用ftrace,学习环境完全没有遇到什么麻烦,顺利的开始了ftrace的学习之旅,顺便学会了qemu的使用。
在学习function tracer和function graph tracer的时候,老师不仅详细了讲解了两者的使用方法,还对这两种tracer的使用优缺点,原理,使用场景进行了讲解。我学会了查看函数的向上执行流和向下执行流,这个种方法真的十分适合我们追踪内核代码,后面讲解 set_ftrae_filter对两种tracer的简便快速用法更是让我感觉十分的爽。在讲解kprobe event和trace event的使用也是使用了很多的实践,在大量的实例中我们很快的上手了两者的使用。接下来是老师给出的ftrace的技巧,比如,wakeup tracer、blk tracer的使用,最想不到的是使用function graph tracer加上event这种方法查看中断延迟时间和信号接受情况,这操作简直是绝了,普通人肯定想不到这个操作。最后我们还学习使用ftrace探索linux内核,其中讲解了探索poll、select、epoll、io_uring几个案例。
在学习的课程之后,我还会自己慢慢的观看回放,遇到不懂的暂停下来,跟着老师的步骤走一遍,偶尔修改了实践步骤,对比查看每一个步骤的作用,还不懂的再去请教老师,老师也是很耐心地回答我们的问题。ftrace真的是对我打开了一个世界的大门,我在调试驱动的时候不需要再修改内核了,只需要使用kprobe就可以获取自己想要的信息;我在追踪内核代码的时候也不用这么辛苦了,只需要打开function tracer外加pid过滤,就可以内核代码运行流程了;我在调试一个新的驱动的时候,比如hda声卡驱动(之前我只做过i2s的),只需要查看hda的tracepoint,就可以看到数据的stream流和控制流,还可以使用tracepoint很方便的追踪系统调用和打开的文件名。除此以外,我还在老师讲解的基础上查看tracepoint、kprobe的初始化流程和使用流程,期间遇到了一些问题,卡在某个地方过不去,最后还是在jeff老师的帮助下找到了答案。这次课程使我收获良多,是我往linux内核开发这个方向发展中重要的一步。

写在最后:
通过这次的学习,我的两个学习目的:学习使用ftrce调试驱动和学习ftrace研究内核都达到了。虽然课程已经结束了,但我想这仅仅只是一个开始,想要熟练的掌握ftrace还是平时要多使用,使用ftrace调试内核,使用ftrace探索内核。俗话说,独行快,众行远。能够参与到阅码场Ftrace公开课,和其他学员一起学习Ftrace,是一种久违了的学习体验。学习到老师第一手经验的同时,更是结交到很多来自五湖四海的朋友。共同学习让我们彼此受益匪浅。我要感谢jeff老师把自己一手经验倾囊相授,感谢“课代表”孙敏磊的课后总结和各位同学的精彩的提问,他们都从不同的角度让我在学习过程中灵感爆表;最后还要感谢阅码场,正是在这个平台上我们取长补短,共同成长。
精华文章:【精华】Linux阅码场原创精华文章汇总
阅码场付费会员专业交流群
会员招募:各专业群会员费为88元/季度,权益包含群内提问,线下活动8折,全年不定期群技术分享(普通用户直播免费,分享后每次点播价为19元/次),有意加入请私信客服小月(小月微信号:linuxer2016)
专业群介绍:
甄建勇-性能优化与体系结构
本群定位Perf、cache和CPU架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师甄建勇主持。
李春良-Xenomai与实时优化
本群定位Xenomai与实时优化技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师李春良和彭伟林共同主持。
周贺贺-Tee和ARM架构
本群定位Tee和ARM架构技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师周贺贺主持。
谢欢-Linux tracers
本群定位Linux tracers技术交流,覆盖云/网/车/机/芯领域资深用户,由阅码场资深讲师谢欢主持。
✦
✦