基础设施 ======= 为了辅助学习,我们为每个主题设计了一个实践练习环节。在这一部分,你会找到详细且分步骤的指导,帮助你解决一个或多个任务。为了更好地集中精力解决特定问题,大部分任务都将在已有的框架(skeleton)驱动程序中进行。每个框架驱动程序中都明确标出了需要你填写的部分,以完成任务。 骨架驱动程序是根据位于 tools/labs/templates 目录中的完整源代码示例生成的。为了解决任务,你可以在 *tools/labs* 目录下执行 **skels** 目标来生成所需的骨架驱动程序。为了维护工作空间的整洁,我们建议你一次只为一个实验生成骨架,并且在开始新实验之前清理工作空间。你可以通过设置 **LABS** 变量来选择不同的实验: .. code-block:: shell 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 你还可以使用相同的变量来生成特定任务的骨架: .. code-block:: shell 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* 步骤的骨架: .. code-block:: shell tools/labs $ TODO=2 LABS="kernel_modules/8-kprobes" skels 生成骨架驱动程序后,可以使用 **build** make 目标来构建它们: .. code-block:: shell 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** 目标来更新虚拟机映像: .. code-block:: shell tools/labs $ make copy ... 'skels/kernel_modules/8-kprobes/kprobes.ko' -> '/tmp/tmp.4UMKcISmQM/home/root/skels/kernel_modules/8-kprobes/kprobes.ko' .. attention:: 如果虚拟机正在运行,**copy** 目标将失败。这是有意为之,以避免破坏文件系统。