ここで特に知りたいのは、基盤となるハードウェアに関係なく、Linuxカーネルがすべての異なるPCでどのように機能するかということです。
または、一般に、PCのハードウェア構成に関係なく、任意のカーネル(MicrosoftのNTカーネル、mac os、およびLinux)が任意のPCでどのように機能するか。
ここで私の疑問を説明するのはシナリオです。PC-2と比較して、PC-1のBluetooth、キーボード、wifiなどは構成が異なり、異なるメーカーによって開発されています。これらすべてのハードウェアを機能させるには、カーネルにこれらのハードウェアを有効にするハードウェア固有のコードが必要だと思います。カーネルには、これらのハードウェアを有効にする必要があるデバイスドライバーレイヤーがあると思いますか?それとも、デバイス固有のファームウェアを別の場所からロードするだけですか?ハードウェア固有のコードはカーネルのどこにありますか?また、疑問を解消しているときに、HAL、BSPに出くわしました。これらは何であり、これらのレイヤーはカーネルのどこにありますか?
ここで特に知りたいのは、基盤となるハードウェアに関係なく、Linuxカーネルがすべての異なるPCでどのように機能するかです。
何よりもまず、カーネルは、その特定のアーキテクチャ用にコンパイルされている限り、どのPCでも実行できます。汎用コンピューターでは、アーキテクチャーは同じ(x86_64/AMD64)になる傾向がありますが、組み込みデバイスを扱う場合はこれが変わります。
コンパイルを除いて、カーネル自体はハードウェアに依存しません。 device-tree !
Linuxカーネルが検出不可能なハードウェアを処理する方法は、デバイスツリーを使用することです。これにより、CPU、メモリ、バス、I2Cを介して接続されたデバイス、SPIなど)に関するカーネル情報が通知されます。デバイスレイアウトをハードコーディングする代わりに、デバイスを介して変更できます。ツリー。それを理解すると、それはすべて本当に魔法のようです。デバイスツリーは、compatible
パラメータを介して、特定のデバイスに使用する必要のあるドライバもカーネルに通知します。
デバイスツリーは、カーネルのコンパイル方法に応じてさまざまな方法で格納できますが、通常、階層は/proc/device-tree
または/sys/firmware/devicetree/base
の下に表示されます。
USBデバイスのようなものについては、それはすべてUSBドライバーによって処理されます。カーネルには、キーボードやマウスなどを制御するための基本的なコードがあります。一部のベンダーにはカスタムドライバーがあり、デバイスに同梱されています。
ドライバーの場合、Linuxカーネルは カーネルモジュール と呼ばれるものを使用します。すべてのモジュールは/lib/modules
の下にあります。モジュールには、ロード可能なモジュールと組み込みモジュールの2種類があります。 lsmod
コマンドを使用して、ロードされたすべてのモジュールを表示できます。カーネルがデバイスツリーで特定のデバイスを検出した場合、またはデバイスを周辺機器に接続した場合でも、そのデバイスにロードできるモジュールがあるかどうかを確認し、そのモジュールがそのデバイスのドライバーになります。
ロード可能なモジュールの良いところは、カーネルイメージを小さく保つことです。モジュールは個別にコンパイルできます。組み込みモジュールはカーネルにコンパイルされるため、実際のイメージサイズが大きくなります。実行中にモジュールをコンパイルしてカーネルにロードすることもできますが、それはまったく別のトピックです。
ベンダーがカーネルと独自のハードウェア(プロセッサと接続されたハードウェアを含む)用の特定のモジュールの束を出荷すると、BSP(ボードサポートパッケージ)に入ります。ベンダーが既存のモジュールに変更を加えたり、カーネルにカスタムモジュールを同梱したりする場合があります。一部のベンダーはカーネル自体に変更を加えており、そのカスタムパッケージ全体がBSPになります。これは、組み込みの世界でよく起こります。
HAL(ハードウェア抽象化レイヤー)はBSPと同義です。 Linuxの世界ではそれほど使用されているのを見たことがありませんが、マイクロコントローラーに入ると、かなり頻繁に使用されます。基本的に、HALはハードウェアへのアクセスに使用される一連のライブラリであり、ハードウェアとのインターフェイスをはるかに簡単にします。たとえば、wifiチップを使用すると、APに接続し、ネットワークをスキャンし、アクセスポイントを作成するための基本的なルーチンが提供されます。そういう意味ではちょっとドライバーのように振る舞います。