カーネルモジュールのコンパイル中にエラーが発生しました。

カーネルモジュールのコンパイル中にエラーが発生しました。

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ヘッダーファイルのコピーにいくつかの定義がありません(コンパイラはこれが理由であることを明示的に示していませんが!)。しかし、私が間違っている可能性があります。よりノート次のような。

ノート_ASM_EXTABLE_HANDLE:の定義を見つけるために、Linuxリポジトリでヘッダファイルをオンラインで検索してみました。ここ。その後、Linuxヘッダーのローカルコピーを見て、定義がasm.h欠落していることがわかりました。そのため、定義をモジュールにコピーして貼り付け、再コンパイルしました。今回はエラーはありませんが、警告があります。

WARNING: "ex_handler_rdmsr_unsafe" [/home/sbhtwr/Desktop/hypervisor/vmx.ko] undefined!

定義を見つけましたex_handler_rdmsr_unsafe ここ。そのため、関数定義をモジュールにコピーして貼り付けましたが、その結果(で使用されているex_handler_rdmsr_unsafe)関数定義が欠落しているというエラーが発生しました。

チュートリアルページを見つけることができますここ

答え1

Linuxヘッダーにandの定義が_ASM_EXTABLE_HANDLE含まれているようです。以前は、LinuxヘッダーでUbuntu 16.04 LTSを実行していました。 Ubuntu 18.04 LTSにアップグレードすると(Linuxヘッダーへのアップグレード中)、問題が解決しました。ex_handler_rdmsr_unsafe4.15.0-72-generic4.4.0-81-generic4.15.0-72-generic

関連情報