web-dev-qa-db-ja.com

ユーザースペースアプリにカーネルヘッダーが必要なのはなぜですか?

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

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

ユーザースペースアプリケーションがカーネルヘッダーを必要とする他のケースは何ですか?

10

これらのプログラムは、カーネルヘッダーで定義されたものを使用するように構築されているため:

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にはFDGETPRMを取得するためのlinux/fd.hが含まれます。

$ 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を削除し、コンパイラエラーを監視して簡単にすることができます。いくつかのことが定義されていないという警告が表示されます。それらはおそらくカーネルヘッダーから来ています。

8
suprjami