《学活LINUX》 第一讲
系统调用和VFS
自确定《学活LINUX》课程详情以来,已有两周时间。相信很多格友们已经准备好GDK8,等待课程的开始。2023年7月22日,上周六晚,张老师刚刚参加完在京举办的K+大会,在八点准时开始了《学活Linux》第1讲,把“活”的Linux系统(GDK8)作为目标,使用内核调试器(挥码枪)将其中断到调试器,在调试器的帮助下,观察调用过程、执行现场。
建立对话
首先,张老师带大家将活的Linux系统——GDK8及调试器挥码枪与主机进行连接,后在主机端启动Nanocode。
由于挥码枪(内核调试器)通过USB接到了主机端,Nanocode便可以通过USB与挥码枪进行对话,因此在这里我们可以看到挥码枪的“自我介绍(PS:序列号在100以内的则是极其珍贵的挥码枪的第一批用户)”。
除此之外,我们还可以看到挥码枪与目标系统之间——GDK8——的对话。开始调试之后,挥码枪会通过ADI来和SOC建立对话,这种基于硬件的调试对话代表着今天我们和芯片对话的一种高级技术。芯片的实体只是黑乎乎的一块,若不借助特殊工具,我们无法与之建立对话。所以我们选择这种内核调试的方式,去获取芯片中的信息。
别跑了,停下来
至此,一切顺利。虽然挥码枪已与目标系统建立对话,但目标系统还在跑。接下来便通过挥码枪给目标系统Soc一个信号,告诉它:“ 别跑了,停下来。”
加载符号之前
用内核调试器截停目标CPU之后,张老师详细解释了Linux内核断下来后弹出的一系列信息,并演示了加载符号之前,在没有符号的情况下可以做的调试任务:用r命令观察用户程序寄存器、u命令作反汇编、rdmsr命令访问系统寄存器、dd命令观察内存原始数据等。
期间,张老师特别提到了一条著名的wfi(Wait for Interrupt)指令,并以疫情阶段在休息期间不敢脱下防护服、随时待命的大白们作喻,让大家可以瞬间理解wfi的含义及功能。
符号化调试
二进制的调试任务对一些程序员来说可能有几分不好理解,这时候就需要加载符号,使得广大从业者能够通过看源代码来实现高效调试。课程中张老师就逐步地演示了如何使用GDK8进行调试:准备符号文件→设置符号路径→执行.reload命令,(重新)加载符号文件(扫描文末二维码观看课程全部内容)。
K命令,你会吗?
加载符号文件之后,就可以看到模块列表;可以使用k命令看调用栈,观察软件的执行经过,看到它是从哪儿来;可以设置源文件搜索路径,根据执行经过,用.frame命令实现时光回溯,切换至真正的执行经历,即“活”代码……
张老师针对上述各功能进行了详细的演示及讲解,带大家一起上手操作GDK8的,一起读“活”代码,读CPU真正执行过的代码。
设置断点
从调试原理讲,软件断点有两种方式:软件断点和硬件断点。相较与安全大趋势冲突的软件断点,后者不需要修改代码空间,其原理为告诉目标Soc“我对这个地址感兴趣,等一下如果访问这个地址要停下来”。张老师也演示了用硬件断点命令设置断点的具体操作。
系统调用是内核空间对上提供服务的一种方法。它存在的意义是给应用程序提供服务以管理系统。那应用程序怎么调服务呢?便是执行特殊的svc指令。张老师在课程后半部分详细讲解了系统调用、系统服务表,演示了从用户空间到内核空间入口分发的过程。进入内核空间后,由于调用的是读文件,便转到了文件系统,即Linux下的VFS,对此,课堂中也进行了详尽的介绍(扫描文末二维码观看课程全部内容)。
质疑问难
通过张老师细致的讲解,加之对多个命令的实操演示,相信大家在听完这一讲内容之后,已经知道了“为什么要使用内核调试器?手中的GDK8套件是什么?能实现什么功能?怎么实现?”这些问题的答案。我们的课程助理也一直在线答复格友们的疑问,尽力让大家都跟得上张老师的调试进度,在听完课程之后真的有所学,有所成。
最后,非常感谢直播间和课程交流群的格友们对本次课程的喜欢和支持!
未加入课程交流群的朋友可以扫描下方二维码进群交流,获得更及时、更详尽的课程信息。没参与直播的朋友也可以扫描下方二维码观看回放,遇到问题进入微信群询问。下周六晚,哔哩哔哩“盛格塾”直播间继续《学活Linux》第二讲,张老师带你探索内核模块和驱动模型。
// 微信群二维码 //
该二维码8月3日前有效
直播间链接:http://live.bilibili.com/24576892
直播时间:2023年7月22日至9月2日
每周六 20:00 - 21:30
【盛格塾】
正心诚意,格物致知
以人文情怀审视软件,以软件技术改变人生
格友公众号
盛格塾小程序
扫描上方二维码或在微信中搜索“盛格塾”小程序
可以阅读更多文章和有声读物
往期推荐