
組み込みデバイスでカーネルを起動するときは、Linuxカーネルにデバイスツリーを提供する必要がありますが、通常のx86 PCでカーネルを起動するためにデバイスツリーは必要ありません。なぜですか?
私が理解したように、x86 PCでは、カーネルはハードウェアを「探索」します(間違っている場合は訂正してください)。
答え1
周辺機器はメインプロセッサに接続されます。バス。一部のバスプロトコルは、ホストプロセッサが「このバスにどのデバイスが接続されていますか」と尋ねることができる列挙(検索とも呼ばれる)をサポートしています。デバイスは、そのタイプ、製造元、モデル、および構成に関するいくつかの情報を標準化された形式で応答します。この情報により、オペレーティングシステムは利用可能なデバイスのリストを報告し、各デバイスに使用するデバイスドライバを決定できます。一部のバスプロトコルは列挙をサポートしていないため、ホストプロセッサは推測以外にどのデバイスが接続されているかを知る方法がありません。
すべての最新のPCバスは、特に列挙型をサポートしています。PCI(AGPやPCIeなどのオリジナルおよび拡張および後続の製品)、ほとんどの内部周辺機器が接続されています。USB(すべてのバージョン) ほとんどの周辺機器が接続され、ライブライン、小型コンピュータシステムインタフェース、すべての最新バージョンATA/SATA待つ。最新のモニター接続は、接続されているモニターの検索もサポートします(HDMI、ディスプレイポート、DVIインターフェース、VGAそしてEDID)。したがって、PCでは、オペレーティングシステムはPCIバスを列挙して接続された周辺機器を検索することができ、PCIバスでUSBコントローラを見つけるとUSBバスなどを列挙します。オペレーティングシステムは、PCIバスの存在とそれを検出する方法を想定する必要があります。これはPCアーキテクチャの標準化です(「PCアーキテクチャ」は単なるx86プロセッサ以上を意味します。(現代)PCになるには、コンピュータにPCIバスがあるので何とか起動する必要があります)。
多くの組み込みシステムは、列挙をサポートしないあまりカラフルでないバスを使用しています。これは、PCIが交換された1990年代半ばまでPCの場合でした。ISA。特に、ほとんどのARMシステムバスは列挙型をサポートしていません。 PC アーキテクチャに従わない一部の組み込み x86 システムでも同様です。列挙がない場合、オペレーティングシステムはどのデバイスが存在し、そのデバイスにアクセスするかを知る必要があります。これデバイスツリーこの情報を表現するための標準形式です。
PCバスが検索をサポートする主な理由は、PCに拡張カードを追加したり、外部ポートにケーブルを接続したりするなど、デバイスを追加および取り外しできるモジュール式アーキテクチャを可能にするように設計されているためです。組み込みシステムには通常、固定されたデバイスセット1と製造元が事前にロードして交換しないオペレーティングシステムがあるため、列挙する必要はありません。
1USBなどの外部バスがある場合、USB周辺機器は自動的に検出され、デバイスツリーには記載されていません。
答え2
彫刻実際にはデバイスツリーが必要です。
彼らはそれを別のものと呼びます。
PC / AT準拠のサブオペレーティングシステムと言うのは正しいことではありません。考えるPCIバスのようなものが存在します。彼らはしません。
彼らは尋ねません。 1990年代半ば以降、ハードウェアを検索し、一部のI / Oまたはメモリアドレスを検索して機能していることを確認する必要はありません。
代わりに彼らは以下を引用した。ルートバス。
他の列挙可能バスとは異なり、このバスはバスコントローラデバイスハードウェアと通信して列挙できません。このバスは、システムファームウェアとオペレーティングシステム用の構成でのみ存在します。システムファームウェアを照会して列挙し、マザーボードの製造元は、マザーボードの内容と一致するようにシステムファームウェアに現在の内容を含めます。
これとデバイスツリーの間には概念的な違いはほとんどありません。デバイスツリーと同様に、実際のボードと一致するように作成する必要があります。デバイスツリーと同様にリストです。デバイスノードリソース情報(何よりも)が付属しています。デバイスツリーと同様に、これはオペレーティングシステムの外部にあり、オペレーティングシステム自体のコードに組み込まれている項目のリストを調べるためのものではありません。
これプラグアンドプレイBIOS仕様ファームウェアがメモリに簡単なデバイスツリーをオペレーティングシステムに表示させるようにします。ここで 1 つのノードは (たとえば) PNP0A03
PCI バスを指定するノードとなり、割り当てられた I/O およびメモリリソースを提供し、位置を決定します。発見。
ACPIはこれを置き換えましたが、アイデアは変わりません。 ACPI には次の表があります。差別化されたシステム説明表、一つ追加しました補助システム記述子テーブル、(他のACPIテーブルの情報を含む)ほぼ同じ内容を提供します。
(ファームウェア開発者の観点からは、Corebootの例を見てください。ここには多くのACPIソース言語ファイルがあり、その一部はバイトコードバイナリイメージにコンパイルされ、ファームウェアにマージされます。)設定ツールコントロールによって作成された場合、ツールはターゲット特定のマザーボードを選択するように求められます。
FreeBSDを例に挙げると、プラグアンドプレイBIOS仕様情報はカーネルpnpbios
(現在は削除されています)のバスドライバによって列挙され、(現在)ACPI情報acpi
はバスドライバによって列挙されます。 Linuxにはdrivers/pnp/pnpbios
プラグアンドプレイBIOSテーブルを読み込むバスドライバが(まだ)あり、ACPIテーブルはarch/arm64/kernel/
分散コードで読み込まれますarch/x86/kernel/
。
列挙可能なルートバスは、ルートバスのデバイスであるバスの列挙可能なエントリと重複する可能性がありますが、通常(ACPIを介した侵害を含む)重複しません。たとえば、PNPxxxx
ATAバスにIDがある場合でも、システムファームウェアはそれを使用するルートバスのPCI-ATAブリッジデバイスを一覧表示しません。これらのデバイスは、ルートバスを列挙するときにPCIバスを見つけ、PCIバスを列挙するときにPCI-ATAブリッジを見つけて見つけます。
簡単な事実は、概念的な名前が異なる完全に異なるプラットフォームで動作する基本原則が同じであるということです。システムには、列挙できない他のデバイスと一致する組み込みデバイスのリストがあり、ファームウェアまたは使用中のブートローダは、オペレーティングシステムがそのリストを読み取り、デバイスを構成するためのメカニズムを提供して列挙できるようにします。オペレーティングシステムそれら装置を交互に使用してください。
追加読書
- Compaq Computer Corporation、Phoenix Technologies、およびIntel Corporation(1994-05-05)。プラグアンドプレイBIOS仕様。バージョン1.0A。インテル社。
- ACPI関連ドキュメントへのリンク。統合スケーラブルファームウェアインターフェースフォーラム。 UEFI。
- パトリック・モハー(2002)。 」Linuxカーネルデバイスモデル」。 2002 オタワ Linux シンポジウム進行。 368〜375ページ。
- ヒッテン・パンディア(Hiten Pandya)とトム・ローズ(Tom Rhodes)。 」電力とリソースの管理」。 FreeBSDマニュアル。
- 「レガシードライバ:デバイス検出」。プラットフォームデバイスとドライバ。
Documentation/driver-model/platform.txt
。 Linuxカーネル。 - https://superuser.com/a/1253583/38062