基础设施

为了辅助学习,我们为每个主题设计了一个实践练习环节。在这一部分,你会找到详细且分步骤的指导,帮助你解决一个或多个任务。为了更好地集中精力解决特定问题,大部分任务都将在已有的框架(skeleton)驱动程序中进行。每个框架驱动程序中都明确标出了需要你填写的部分,以完成任务。

骨架驱动程序是根据位于 tools/labs/templates 目录中的完整源代码示例生成的。为了解决任务,你可以在 tools/labs 目录下执行 skels 目标来生成所需的骨架驱动程序。为了维护工作空间的整洁,我们建议你一次只为一个实验生成骨架,并且在开始新实验之前清理工作空间。你可以通过设置 LABS 变量来选择不同的实验:

tools/labs $ make clean
tools/labs $ LABS=kernel_modules make skels

tools/labs $ ls skels/kernel_modules/
1-2-test-mod  3-error-mod  4-multi-mod  5-oops-mod  6-cmd-mod  \
7-list-proc  8-kprobes  9-kdb

你还可以使用相同的变量来生成特定任务的骨架:

tools/labs $ LABS="kernel_modules/6-cmd-mod kernel_modules/8-kprobes" make skels

tools/labs$ ls skels/kernel_modules
6-cmd-mod  8-kprobes

对于每项任务,你可能需要按顺序执行多个步骤。在源代码和实验练习中,这些步骤都会用关键词 TODO 来标记。如果有多个步骤需要完成,它们会以数字后缀来区分,比如 TODO1, TODO2 等。如果没有数字后缀,那么通常只有一个步骤。如果你希望从特定的步骤开始执行任务,可以使用 TODO 变量。下面的示例将会生成一个已经完成第一个 TODO 步骤的骨架:

tools/labs $ TODO=2 LABS="kernel_modules/8-kprobes" skels

生成骨架驱动程序后,可以使用 build make 目标来构建它们:

tools/labs $ make build
echo "# autogenerated, do not edit " > skels/Kbuild
for i in ./kernel_modules/8-kprobes; do echo "obj-m += $i/" >> skels/Kbuild; done
make -C /home/tavi/src/linux M=/home/tavi/src/linux/tools/labs/skels ARCH=x86 modules
make[1]: Entering directory '/home/tavi/src/linux'
CC [M]  /home/tavi/src/linux/tools/labs/skels/./kernel_modules/8-kprobes/kprobes.o
Building modules, stage 2.
MODPOST 1 modules
CC      /home/tavi/src/linux/tools/labs/skels/./kernel_modules/8-kprobes/kprobes.mod.o
LD [M]  /home/tavi/src/linux/tools/labs/skels/./kernel_modules/8-kprobes/kprobes.ko
make[1]: Leaving directory '/home/tavi/src/linux'

要将驱动程序复制到虚拟机中,你可以使用 ssh 或直接使用 copy 目标来更新虚拟机映像:

tools/labs $ make copy
...
'skels/kernel_modules/8-kprobes/kprobes.ko' -> '/tmp/tmp.4UMKcISmQM/home/root/skels/kernel_modules/8-kprobes/kprobes.ko'

注意

如果虚拟机正在运行,copy 目标将失败。这是有意为之,以避免破坏文件系统。