ユーザー空間アプリケーションにカーネルヘッダが必要なのはなぜですか?

ユーザー空間アプリケーションにカーネルヘッダが必要なのはなぜですか?

私は組み込みデバイス用のbusy-boxとiptablesを作成していますが、これらの依存関係の1つはカーネルヘッダです。

ファイルシステム全体で*.koファイルを検索しましたが、何も見つかりませんでした。それで、私はアプリケーションがロード可能なドライバ(カーネルモジュール)を生成しなかったと結論付けました。

ユーザー空間アプリケーションにカーネルヘッダファイルが必要な他の状況は何ですか?

答え1

これは、カーネルヘッダーファイルで定義された内容を使用するように構築されたためです。

busybox-1.22.1]$ egrep -RHn '^#include <linux'
modutils/modutils-24.c:194:#include <linux/elf-em.h>
include/fix_u32.h:17:#include <linux/types.h>
libbb/loop.c:11:#include <linux/version.h>
console-tools/openvt.c:23:#include <linux/vt.h>
console-tools/kbd_mode.c:23:#include <linux/kd.h>
console-tools/showkey.c:19:#include <linux/kd.h>
util-linux/blockdev.c:36:#include <linux/fs.h>
util-linux/mkfs_ext2.c:50:#include <linux/fs.h>
util-linux/mkfs_vfat.c:28:#include <linux/hdreg.h> /* HDIO_GETGEO */
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
....

各特定のツールについて正確に何が起こっているのかを知るには、ツールのソースコードと関連するカーネルヘッダファイルを読む必要があります。

簡単にするためにいくつかのメモを見ることができます。

たとえば、これには以下mkfs_vfatが含まれます。linux/fd.hFDGETPRM

$ egrep -RHn FDGETPRM util-linux/mkfs_vfat.c
util-linux/mkfs_vfat.c:29:#include <linux/fd.h>    /* FDGETPRM */
util-linux/mkfs_vfat.c:351:         int not_floppy = ioctl(dev, FDGETPRM, &param);

関連項目を削除し、#includeコンパイラエラーを監視して簡単に作成でき、何かが定義されていないという警告メッセージが表示されます。これはおそらくカーネルヘッダーから来たようです。

関連情報