web-dev-qa-db-ja.com

ユーザー空間で使用できるカーネルヘッダーとは何ですか?それらの署名またはインターフェースは、異なるディレクトリのヘッダーとは異なりますか?

カーネルヘッダーと、それがどこでどのように使用されるかについて明確に理解していないため、カーネルヘッダーについては一貫性のない質問かもしれません。フラグが立てられるかもしれません。私の質問は3つの部分に分かれています。

  1. カーネルヘッダーは、モジュールなどのカーネルの他の部分がそれらを使用できるようにするインターフェイスを提供すると思います。それは私の本好きな知識です。カーネルヘッダーを使用するコードを見たことも、見つけたこともありません(誰かが私に指摘してもらえれば幸いです)。ユーザースペースでも使用できますか?任意のコード例をいただければ幸いです。

  2. _make headers_install_カーネルヘッダーを使用すると、ユーザー空間で公開されることがわかりましたが、同時に、ユーザー空間でカーネルヘッダーを使用することはお勧めしません。それが落胆した場合、それをユーザー空間に公開することの用途は何ですか?

  3. this および this に従って、カーネルヘッダーファイル(.hファイル)は3つの場所にある必要があります。 _/usr/include/linux/kernel.h_ユーザースペース用ですb。 /lib/modules/$(uname -r)/build/include/linux/sched.h外部モジュールc。カーネルモジュールに使用される_/usr/src/..._これは、異なるディレクトリにあるヘッダーファイルの目的やインターフェースや署名が異なることを意味しますか?つまり、ユーザー空間コードの_#include <linux/xyz.h>_は、カーネルモジュールの_#include <linux/xyz.h>_とは異なる意味を持っていますか?また、外部モジュールはカーネルモジュールと同じですか?

ありがとう。

3
jlas

UnixおよびLinux StackExchangeへようこそ!

はい、カーネルヘッダーはカーネルの他の部分にインターフェースを提供します-これであなたは完全に正しいです。また、カーネルとユーザースペースの間のインターフェースの定義も含まれていますが、通常、「生の」カーネルインターフェースは直接使用されず、Cライブラリ(多くの場合glibc)を介して使用されます。

ユーザースペースとカーネルのインターフェースには、下位互換性の理由から、特定のシステムコールの複数のバージョンが含まれている場合があります。 Cライブラリを介してシステムコールを行うことにより、すべてのアプリケーションが実際のシステムコールの同じバージョンを取得し、一貫した動作が保証されます。また、カーネルインターフェイスの関連部分が更新された場合は、Cライブラリを更新するだけで新機能を利用できます。

(たとえば、Y2K38の問題を回避するために32ビットアーキテクチャでtime_tが64ビットに拡張された場合、Cライブラリは常に64ビットバージョンのカーネルインターフェースを使用するように移動しますが、アプリケーション用にユーザー空間で構成可能なマッピングがあります。 32ビットバージョンを使用する関数。その時点で、32ビットtime_tを使用する関数は廃止され、カーネルから削除できます。Cライブラリは、32ビットタイプを使用するレガシーアプリケーションに対してより適切な回避策を提供できます。

したがって、独自のバージョンをコンパイルしていない限りod Cライブラリも、カーネルヘッダーを直接使用するよりも、Cライブラリの開発ヘッダーを優先する必要があります。

_/usr/include/linux/_のヘッダーは通常、Cライブラリの開発ヘッダーパッケージに付属しており、Cライブラリがコンパイルされたカーネルのバージョンを示します。これは、ユーザースペースアプリケーション開発者が通常必要とするものです。

/lib/modules/$(uname -r)/buildは、実際のカーネルバージョンのヘッダーまたは完全なソースコードが格納されている_/usr/src/..._へのシンボリックリンクであることがよくあります。これは、外部(別名サードパーティ)カーネルモジュール、つまりメインカーネルソースコードに統合されていないソースからのカーネルモジュールをコンパイルするときに使用されます。これらのヘッダーには、モジュールがバージョン固有のカーネル内部APIを使用できるように、必要なカーネルAPIバージョン署名が含まれています。

3
telcoM