「Kernel」Linux kernel lab 浅浅跟随

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

内容提要

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

🎯

关键要点

  • 本文介绍了Linux内核学习课程,重点在实验部分。
  • 使用WSL2内的Docker作为实验环境,提供生成实验骨架的命令。
  • 涉及内核模块编译、调试方法和oops处理。
  • 介绍了一个模块加载示例,需要修改源代码实现特定功能。
  • 课程有中文版本,可以在指定链接支持他们的工作。
  • 实验环境准备使用curl命令下载脚本并设置权限。
  • 通过设置环境变量LABS,使用make skels生成实验骨架。
  • 描述内核模块编译过程和如何在内核中使用模块。
  • 使用cscope或LXR查找模块初始化和清理的宏定义。
  • 使用make console启动虚拟机并加载内核模块。
  • 观察虚拟机控制台输出的日志等级并进行调整。
  • 生成3-error-mod模块的框架并解决编译错误。
  • 4-multi-mod模块需要修改Kbuild文件以链接多个C源文件。
  • 内核oops是内核检测到的无效操作,通常由模块错误引起。
  • 检查5-oops-mod模块的源代码,发现空指针问题。
  • 使用addr2line工具定位oops发生的具体行。
  • 在6-cmd-mod模块中加载内核模块以显示printk消息。

延伸问答

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

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

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

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

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

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

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

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

如何在内核中使用模块?

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

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

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

➡️

继续阅读