Linux カーネルは、プラットフォームに関係なくどのように動作しますか?

Linux カーネルは、プラットフォームに関係なくどのように動作しますか?

ここで特に知りたいのは、基盤となるハードウェアに関係なく、Linux カーネルがどのようにしてさまざまな PC 上で動作するのかということです。

または、一般的に、PC のハードウェア構成に関係なく、どのカーネル (Microsoft の NT カーネル、Mac OS、Linux) もどの PC でも動作できる仕組みです。

ここでの私の疑問を説明すると、PC-2 と比較して、PC-1 の Bluetooth、キーボード、Wi-Fi などは構成が異なり、異なるメーカーによって開発されています。これらすべてのハードウェアを機能させるには、カーネルにそれらのハードウェアを有効にするハードウェア固有のコードが必要だと思います。カーネルにはこれらのハードウェアを有効にするデバイス ドライバー レイヤーがあると思いますか? それとも、デバイス固有のファームウェアをどこか別の場所からロードするだけですか? ハードウェア固有のコードはカーネルのどこにあるのでしょうか? また、疑問を解消しているときに、HAL や BSP に遭遇しました。これらは何ですか? これらのレイヤーはカーネルのどこにあるのですか?

答え1

ここで特に知りたいのは、基盤となるハードウェアに関係なく、LinuxカーネルがどのようにしてさまざまなPCで動作するのかということです。

まず第一に、カーネルは特定のアーキテクチャ用にコンパイルされている限り、どの PC でも実行できます。汎用コンピュータの場合、アーキテクチャは同じになる傾向があります (x86_64/amd64) が、組み込みデバイスを扱う場合は異なります。

デバイスツリー

コンパイル以外では、カーネル自体はハードウェアに依存しません。デバイスツリー

Linux カーネルが検出不可能なハードウェアを処理する方法は、デバイス ツリーを介して行われます。これにより、CPU、メモリ、バス、I2C や SPI などを介して接続されたデバイスに関する情報がカーネルに伝えられます。デバイス レイアウトはハードコードされるのではなく、デバイス ツリーを介して変更できます。理解すると、すべてが本当に魔法のようです。デバイス ツリーは、パラメーターを介して、特定のデバイスにどのドライバーを使用するかをカーネルに伝えますcompatible

デバイスツリーは、カーネルのコンパイル方法に応じてさまざまな方法で保存できますが、一般的に階層は/proc/device-treeまたはの下に表示されます/sys/firmware/devicetree/base

USB デバイスなどについては、すべて USB ドライバーによって処理されます。カーネルには、キーボードやマウスなどを制御するための基本コードがあります。ベンダーによっては、カスタム ドライバーを用意し、それをデバイスに同梱しているところもあります。

モジュール

ドライバについては、Linuxカーネルはカーネルモジュール。すべてのモジュールは にあります/lib/modules。モジュールには、ロード可能なモジュールと組み込みモジュールの 2 種類があります。 コマンドを使用して、ロードされたすべてのモジュールを表示できますlsmod。カーネルがデバイス ツリーで特定のデバイスを見つけた場合、またはデバイスを周辺機器に接続した場合、カーネルはそのデバイスにロードできるモジュールがあるかどうかを確認し、そのモジュールがそのデバイスのドライバーになります。

ロード可能なモジュールのよいところは、カーネル イメージを小さく保てることです。モジュールは個別にコンパイルできます。組み込みモジュールはカーネルにコンパイルされるため、実際のイメージ サイズが大きくなります。カーネルの実行中にモジュールをコンパイルしてカーネルにロードすることもできますが、これはまったく別の話です。

BSPS の

ベンダーがカーネルと自社のハードウェア (プロセッサと接続されたハードウェアを含む) 用の一連の特定モジュールを出荷すると、BSP (ボード サポート パッケージ) になります。ベンダーが既存のモジュールに変更を加えたり、カーネルとともにカスタム モジュールを出荷したりすることがあります。ベンダーによってはカーネル自体に変更を加え、そのカスタム パッケージ全体が BSP になることもあります。組み込みの世界では、このようなことがよく起こります。

ハル

HAL (ハードウェア抽象化レイヤー) は BSP と同義です。Linux の世界ではあまり使われていませんが、マイクロコントローラーの世界ではよく使われています。基本的に、HAL はハードウェアにアクセスするために使われるライブラリの集まりで、ハードウェアとのインターフェイスを非常に簡単にします。たとえば、WiFi チップでは、AP に接続したり、ネットワークをスキャンしたり、アクセス ポイントを作成したりするための基本的なルーチンが提供されます。その意味では、HAL はドライバーのような役割を果たします。

関連情報