だから私はカーネル空間で動作するモジュールを書いています。私のコードは正しくコンパイルされ、正常に動作します。
問題は、どこにも見つからないいくつかのヘッダファイルがあることです。ヘッダーファイルがないと、なぜすべてがうまく機能するのかわかりません。どこかに存在しなければなりません。
以下はどこにも見つからないいくつかのヘッダファイルです(もっとたくさんありますが、私の問題にはこれだけで十分でしょう)。
#include <asm/errno.h>
#include <asm/socket.h> /* /include/linux/socket.h */
#include <stdarg.h> /* /include/linux/kernel.h */
#include <asm/types.h>
#include <asm/mmiowb.h> /* /include/linux/spinlock.h */
#include <asm/param.h> /* /include/linux/jiffies.h */
いくつかのヘッダーファイルは他のアーキテクチャで見つけることができますが、x86
これが問題を解決するとは思わないでしょう。
このファイルがどこにあるのかわかりません。
#include <generated/timeconst.h> /* /include/linux/jiffies.h */
#include <generated/bounds.h>
#include <generated/autoconf.h> /* /include/linux/kconfig.h */
#include <generated/asm-offsets.h>
次のディレクトリでこのファイルを探しています。Linuxカーネル5.4.31:
/include
/include/uapi
/arch/x86/include
/arch/x86/include/uapi
上記のインクルードパスでこのファイルを見つけようとします。しかし、コンパイル後にLinuxヘッダファイルをソースコードで見つけたので、どこでどのように処理するのかわかりません。
答え1
ビルドで使用されるヘッダーファイルを見つけることができます/lib/modules/$(uname -r)/build/
。たとえば、次を参照してください。
find /lib/modules/$(uname -r)/build/ -name timeconst.h
これらのファイルはすべて、ビルドプロセス中にさまざまな方法で生成されtimeconst.h
ますkernel/time/timeconst.bc
。
/lib/modules/$(uname -r)/build/
実行中のカーネルに対応する生成されたヘッダー(およびその他のファイル)を保存します。これは、外部モジュールのビルドに特に使用できるようにすることです。新しいカーネルをビルドする場合は、ビルドツリー(カーネルビルドまたはツリー内モジュールのビルド後)で作成されたファイルを見つけることができます。