組み込みデバイスでカーネルをブートする場合、Linuxカーネルにデバイスツリーを提供する必要がありますが、通常のx86 pcでカーネルをブートする場合はデバイスツリーは必要ありません。なぜですか?
私が理解しているように、x86 PCではハードウェアのカーネル「プローブ」(間違っている場合は修正してください)で、カーネルが組み込みシステムおよびハードウェアのハードウェアをプローブできないのはなぜですか?
周辺機器は バス を介してメインプロセッサに接続されています。一部のバスプロトコルはエニュメレーション(ディスカバリーとも呼ばれます)をサポートしています。つまり、メインプロセッサは「このバスに接続されているデバイスは何か」と尋ねることができます。デバイスは、タイプ、製造元、モデル、および構成に関する情報を標準化された形式で返信します。その情報を使用して、オペレーティングシステムは使用可能なデバイスのリストを報告し、それぞれに使用するデバイスドライバーを決定できます。一部のバスプロトコルは列挙をサポートしておらず、メインプロセッサは推測以外にどのデバイスが接続されているかを見つけることができません。
すべての最新のPCバスは列挙、特に [〜#〜] pci [〜#〜] をサポートします(オリジナルと、AGPおよびPCIe)、ほとんどの内部周辺機器が接続されている [〜#〜] usb [〜#〜] (すべてのバージョン)、ほとんどの外部周辺機器が接続されている Firewire 、 [〜#〜] scsi [〜#〜] 、最新バージョンの ATA/SATA など。最新のモニター接続も、接続されたモニターの検出をサポートします( [〜#〜] hdmi [〜#〜] 、 DisplayPort 、 [〜#〜] dvi [〜#〜] 、- [〜#〜] vga [〜#〜] with [〜#〜] edid [〜#〜] )したがって、PCでは、オペレーティングシステムは接続された周辺機器を検出できますPCIバスを列挙し、PCIバス上でUSBコントローラが検出されたときにUSBバスを列挙するなど。OSはPCIバスの存在とそのプローブ方法を想定する必要があることに注意してください。これはPCで標準化されています。アーキテクチャ(「PCアーキテクチャ」は、x86プロセッサを意味するだけではありません。(モダン)PCであるためには、コンピュータもPCIバスを持っていると特定の方法で起動する必要があります)。
多くの組み込みシステムは、列挙をサポートしていない豪華なバスを使用しています。これは、PCIが [〜#〜] isa [〜#〜] を追い抜く前の1990年代半ばまでのPCに当てはまりました。ほとんどのARMシステムは、特に、列挙をサポートしていないバスを持っています。これは、PCアーキテクチャに準拠していない一部の組み込みx86システムの場合にも当てはまります。列挙がないと、オペレーティングシステム デバイスツリー は、この情報を表す標準形式です。
PCバスがディスカバリーをサポートする主な理由は、デバイスを追加および削除できるモジュール式アーキテクチャーを可能にするように設計されていることです。 PCへの拡張カードの追加、または外部ポートでのケーブルの接続。組み込みシステムには通常、固定されたデバイスのセットがあり、オペレーティングシステムはメーカーによってプリロードされており、交換されないため、列挙は必要ありません。
¹ USBなどの外部バスがある場合、USB周辺機器は自動検出されますが、デバイスツリーには表示されません。
彼らはそれを別のものと呼ぶだけです。
PC/AT互換の子孫のオペレーティングシステムがPCIバスなどの存在を想定していると言っているのは間違いです。彼らはしない。
調査もしません。ハードウェアをプローブすること、I/Oアドレスまたはメモリアドレスを調べて、それらが機能するかどうかを確認することは、1990年代中頃以来必要ではありませんでした。
むしろ、ルートバスを列挙します。
これは、他の列挙可能なバスと同様に、バスコントローラーデバイスハードウェアと通信することによって列挙できないバスです。これは、システムファームウェアとオペレーティングシステムの構成要素として純粋に存在するバスです。これは、システムファームウェアを照会することによって列挙され、そこに存在するものは、メインボードの製造元によってシステムファームウェアに焼き付けられ、メインボード上のものと一致します。
これとデバイスツリーの概念にはほとんど違いがありません。デバイスツリーと同じように、実際のボードと一致するように作成する必要があります。デバイスツリーと同じように、デバイスノードのリストであり、リソース情報(特に)が接続されています。デバイスツリーと同様に、これはオペレーティングシステムの外部にあり、オペレーティングシステム独自のコードに組み込まれていることをプローブするためのリストではありません。
プラグアンドプレイBIOS仕様のファームウェアでは、メモリ内の単純なデバイスツリーをオペレーティングシステムに提供します。そのノードの1つは(たとえば)PNP0A03
PCIバスを指定するノードで、I/Oとメモリリソースが割り当てられているため、バスが見つかる場所を指定します。
ACPIはこれに取って代わりますが、考え方は同じです。 ACPIには、Differentiated System Description Tableと呼ばれるテーブルがあり、Secondary System Descriptor Tableによって拡張され、(他のいくつかのACPIテーブル)は、ほとんど同じものを提供します。
(ファームウェア開発者側からこれを確認したい場合は、1つの例としてCorebootを参照してください。このファイルには、ACPIソース言語ファイルの大きな本体があり、その一部はファームウェアに組み込まれたバイトコードバイナリイメージにコンパイルされます。選択は、ターゲットとなる特定のメインボードを選択するように促す構成ツールによって制御されます。)
たとえば、FreeBSDでは、プラグアンドプレイBIOS仕様情報がカーネル内のpnpbios
バスドライバによって列挙されました(これは削除されています)。最近)ACPI情報はacpi
バスドライバーによって列挙されます。 Linuxでは、(まだ)drivers/pnp/pnpbios
プラグアンドプレイBIOSテーブルを読み取るバスドライバー、およびACPIテーブルは、コード全体に読み取られますArch/arm64/kernel/
およびArch/x86/kernel/
。
列挙可能なルートバスは、ルートバス上のデバイスであるバス上で列挙可能なものと重複することはできますが、一般的には重複しません(ACPIによる一部の侵害に対応します)。たとえば、ATAバスにはPNPxxxx
IDがありますが、システムファームウェアはそれらを使用して、ルートバス上のPCI-to-ATAブリッジデバイスをリストしません。このようなデバイスは、ルートバスを列挙するときにPCIバスを見つけ、PCIバスを列挙するときにPCIからATAへのブリッジを見つけることによって見つかります。
問題の単純な事実は、概念の名前が異なる非常に異なるプラットフォームでは、同じ基本原理が動作していることです。システムのその他の列挙不可能なデバイスと一致するデバイスの組み込みリストがあり、ファームウェアまたは使用中のブートローダーは、オペレーティングシステムがそのリストを読み取り、そのデバイスを構成するためのメカニズムを提供します。次に、オペレーティングシステムがこれらのデバイスを順番に列挙します。
Documentation/driver-model/platform.txt
。 Linuxカーネル。