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


10

私は組み込みデバイス用のビジーボックスとiptablesを構築しています。それらの依存関係の1つはカーネルヘッダーです。

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

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


思いつく簡単な例は、ユーザー空間の何かがシステムコールを発行したときです。
Sami Laine、2014年

@SamiLaine cライブラリがシステムコールへのインターフェイスを提供すると思います。たとえば、ソケットを開くためだけにカーネルヘッダーをインポートする必要があるのではないでしょうか。
TheMeaningfulEngineer 2014年

Socket(2)はシステムコールであり、ライブラリ関数ではないため、そうです。
Sami Laine、2014年

@SamiLaine include <linux/*.h>ソケットを開かなければならない例を挙げられますか?(私はsys / socket.hを目指していました)
TheMeaningfulEngineer 2014年

回答:


8

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

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.hしますFDGETPRM

$ 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コンパイラエラーを監視して簡単にすることができます。定義されていないものがあるという警告が表示されます。これらはカーネルヘッダーに起因する可能性があります。


2
1. Busyboxは、メモリにロードするライブラリをできるだけ少なくしたい組み込みシステムやその他の軽量システム用に設計されています。私はソースを読んでいませんが、おそらくBBは基本的にライブラリを回避してカーネルに直接リンクしています。2.いいえ。ユーザー空間のバイナリと、下位互換性のあるカーネルAPIのバージョンを組み合わせます。今日コンパイルされたバイナリは、古いカーネルでは機能しない場合があります(含まれているシンボルによっては...ソースコードを読む)。将来のカーネルで動作します。
2014年

1
@suprjami ABIは標準のSysV ABIに準拠していますが、これは変更されないと合理的に見なすことができます。特に、SysV ABIは、選択したコンパイラ(およびバージョン)でカーネルにリンクできる理由であり、必ずしもカーネルバイナリを生成したものと同じではありません。
2014年

1
...また、別のカーネルに同梱されているディストリビューションにchroot / LXCすることもできます。など
2014年

1
(明確にするために、カーネルには、ここで説明している外部ABIと、頻繁に互換性のない変更が行われる可能性があるカーネルモジュール間の内部ABIがあることに注意してください。コード)
2014年

1
(ABI = / = APIにも注意してください。カーネルの(外部)APIにはソースコードで参照されるシンボルが含まれており、カーネル開発者は互換性を維持することを約束しています。シンボルが実際のソフトウェアでほとんど使用されない限り、それは。彼らのために不合理な動きはありません、サードパーティ製の標準的な義務のLinux APIの全体のため、何も技術的に妨げることを)が、互換性のない変更を行います
イグニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.