ここで特に知りたいのは、基盤となるハードウェアに関係なく、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 はドライバーのような役割を果たします。