「Kernel」Linux kernel lab 浅浅跟随

💡 原文中文,约10300字,阅读约需25分钟。
📝

内容提要

本文介绍了Linux内核学习课程,重点在实验部分,使用WSL2内的Docker作为实验环境,提供了生成实验骨架的命令,涉及内核模块编译、调试方法和oops处理,最后介绍了一个模块加载示例,需要修改源代码实现特定功能。

🔎

延伸解读

实验环境搭建的实用技巧

文章使用WSL2内的Docker作为实验环境,通过curl下载脚本并设置权限即可快速搭建。生成实验骨架时,需设置环境变量LABS并运行make skels。若make console无法直接进入,可尝试make copy和make boot后手动连接minicom。这些步骤对初学者友好,但需注意环境变量和命令的准确性。

内核模块编译中的常见错误与解决

在3-error-mod实验中,编译错误源于缺少<linux/module.h>头文件,导致MODULE_DESCRIPTION等宏未定义。添加该头文件即可解决。4-multi-mod实验则需修改Kbuild文件,使用multi-y = mod1.o mod2.o将多个源文件链接为一个模块。这些案例展示了内核模块编译的基本规则和调试方法。

内核oops的定位与分析方法

5-oops-mod实验演示了空指针写入导致的oops。通过分析oops信息中的EIP和错误码,结合addr2line工具,可以定位到具体源代码行。文章还提到在Kbuild中添加-g标志以生成调试信息,但可能不总是有效,此时可查看汇编指令确认问题。这为内核调试提供了实用思路。

模块参数传递的实践

6-cmd-mod实验要求在不修改源代码的情况下,通过模块参数传递字符串。使用module_param宏定义参数,加载模块时指定str="tired",即可让printk输出"Early bird gets tired"。这展示了内核模块参数的基本用法,便于动态调整模块行为。

❓

Q&A

如何准备Linux内核实验环境?

可以使用WSL2内的Docker作为实验环境,通过curl命令下载脚本并设置权限,然后使用make skels生成实验骨架。

内核模块编译过程中常见的错误有哪些?

常见错误包括缺少必要的头文件引入,导致编译时出现未定义的宏或函数错误。

什么是内核oops,它是如何产生的?

内核oops是内核检测到的无效操作,通常由模块错误引起,内核在oops发生后仍会继续工作。

如何使用addr2line工具定位oops发生的具体行?

可以使用addr2line工具结合oops信息中的EIP地址,查找具体的源代码行。

如何在内核中使用模块?

通过定义module_init和module_exit宏来指定模块的初始化和清理函数,并在Kbuild文件中配置编译规则。

如何观察虚拟机控制台输出的日志等级?

可以通过查看/proc/sys/kernel/printk文件来观察当前的日志等级,并根据需要进行调整。

🏷️

标签

➡️

继续阅读