我正在关注有关如何在 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
)。
可以找到教程页面这里。
答案1
看来 和 的定义_ASM_EXTABLE_HANDLE
包含ex_handler_rdmsr_unsafe
在 linux headers 中4.15.0-72-generic
。之前我运行的是带有 linux headers 的 Ubuntu 16.04 LTS 4.4.0-81-generic
。升级到 Ubuntu 18.04 LTS(同时将 linux 标头升级到4.15.0-72-generic
)解决了该问题。