我正在关注有关如何在 x86 架构上启用 VMX 操作的在线教程。本教程将过程分解为多个步骤,并将从所有部分组装的代码发布到内核模块中。它还提供了一个 Makefile 来编译它。他们都可以在这里查看。在编译它时,我收到以下错误:
make -C /lib/modules/4.4.0-81-generic/build M=/home/sbhtwr/Desktop/hypervisor modules EXTRA_CFLAGS="-g -DDEBUG"
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-81-generic'
CC [M] /home/sbhtwr/Desktop/hypervisor/vmx.o
/home/sbhtwr/Desktop/hypervisor/vmx.c: In function ‘__rdmsr1’:
/home/sbhtwr/Desktop/hypervisor/vmx.c:82:8: error: expected ‘:’ or ‘)’ before ‘_ASM_EXTABLE_HANDLE’
_ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
^
/home/sbhtwr/Desktop/hypervisor/vmx.c:82:28: error: invalid suffix "b" on integer constant
_ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
^
/home/sbhtwr/Desktop/hypervisor/vmx.c:82:32: error: invalid suffix "b" on integer constant
_ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
^
scripts/Makefile.build:264: recipe for target '/home/sbhtwr/Desktop/hypervisor/vmx.o' failed
make[2]: *** [/home/sbhtwr/Desktop/hypervisor/vmx.o] Error 1
Makefile:1420: recipe for target '_module_/home/sbhtwr/Desktop/hypervisor' failed
make[1]: *** [_module_/home/sbhtwr/Desktop/hypervisor] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-81-generic'
Makefile:6: recipe for target 'modules' failed
make: *** [modules] Error 2
我无法解决错误。我觉得我的 linux 头文件副本中缺少一些定义(尽管编译器没有明确说明原因!)。不过我可能错了。请参阅下面的注释。
注意:我尝试在线搜索 linux 存储库上的头文件以查找定义并在此处_ASM_EXTABLE_HANDLE
找到它。然后我尝试在我的本地 linux 头文件副本中查找,发现缺少定义。所以我将定义复制粘贴到模块中并重新编译它。这次没有错误,但有一个警告:asm.h
WARNING: "ex_handler_rdmsr_unsafe" [/home/sbhtwr/Desktop/hypervisor/vmx.ko] undefined!
我找到了ex_handler_rdmsr_unsafe
这里的定义。所以我将函数的定义复制粘贴到模块中,这会导致更多错误,表明缺少函数定义(在 中使用ex_handler_rdmsr_unsafe
)。
教程页面可以在这里找到。
似乎 和 的定义
_ASM_EXTABLE_HANDLE
包含ex_handler_rdmsr_unsafe
在 linux headers4.15.0-72-generic
中。以前我使用 linux headers 运行 Ubuntu 16.04 LTS4.4.0-81-generic
。升级到 Ubuntu 18.04 LTS(也将 linux 头文件升级到4.15.0-72-generic
)解决了这个问题。