コンピューティング において、デバイスツリー(デバイス ツリーとも表記) は、特定のコンピュータのハードウェア コンポーネントを記述するデータ構造であり、オペレーティング システムのカーネルがCPU、メモリ、バス、統合周辺機器などのコンポーネントを使用および管理できるようにします。
デバイスツリーは、Open Firmwareプロジェクトを通じてSPARCベースのコンピュータから派生したものです。現在のデバイスツリー仕様[1]は 、小規模システムや組み込みシステムを対象としていますが、一部のサーバークラスのシステム(たとえば、Power Architecture Platform Referenceで説明されているシステム)でもまだ使用されています。
x86アーキテクチャのパーソナルコンピュータは一般にデバイスツリーを使用せず、代わりにさまざまな自動構成プロトコル (例: ACPI ) を利用してハードウェアを検出します。デバイスツリーを使用するシステムは、通常、静的デバイスツリー (おそらくEEPROMに格納されているか、eUFSなどの NAND デバイスに格納されている) をオペレーティングシステムに渡しますが、ブートの初期段階でデバイスツリーを生成することもできます。たとえば、Das U-Bootとkexec は、新しいオペレーティングシステムを起動するときにデバイスツリーを渡すことができます。デバイスツリーをサポートしないブートローダーを持つシステムでは、静的デバイスツリーがオペレーティングシステムと一緒にインストールされる場合があります。Linuxカーネルはこのアプローチをサポートしています。
Devicetree 仕様は現在、 LinaroやArmなどと提携している devicetree.org というコミュニティによって管理されています。
フォーマット
デバイス ツリーは、内部的には名前付きノードとプロパティのツリーであるため、あらゆる種類のデータを保持できます。ノードにはプロパティと子ノードが含まれ、プロパティは名前と値のペアです。
デバイスツリーには、オペレーティングシステムが使用するバイナリ形式と、編集や管理に便利なテキスト形式の両方があります。[1]
使用法
リナックス
正しいデバイスツリーがあれば、同じコンパイル済みカーネルで、より幅広いアーキテクチャ ファミリ内の異なるハードウェア構成をサポートできます。ARC 、ARM、C6x、H8 / 300、MicroBlaze、MIPS、NDS32、Nios II、OpenRISC、PowerPC、RISC-V、SuperH、Xtensaアーキテクチャ用のLinux カーネルは、デバイスツリー情報を読み取ります。ARM では、2012 年以降、すべての新しいSoCでデバイスツリーが必須となっています。 [2]これは、歴史的に (わずかに) 異なる ARM ボードをサポートするために作成されてきた膨大な数のフォーク (Linux および Das U-Boot の) に対する救済策と見ることができます。その目的は、ハードウェア記述の大部分をカーネル バイナリから、ブートローダーによってカーネルに渡されるコンパイル済みデバイスツリー ブロブに移動し、カーネル内のさまざまなボード固有のCソース ファイルとコンパイル時オプションを置き換えることです。[2]
これはデバイスツリーソースファイル(.dts)で指定され、デバイスツリーコンパイラ(DTC)によってデバイスツリーBLOBまたはデバイスツリーバイナリ(.dtb)ファイルにコンパイルされます。デバイスツリーソースファイルには、デバイスツリーソースインクルードと呼ばれる他のファイルを含めることができます。 [3] [1]
ARMベースのLinuxディストリビューションにはブートローダが含まれるのが通例で、これはRaspberry PiやHackberry A10などの特定のボード向けにカスタマイズする必要がありました。このため、Linuxディストリビューションの作成者にとって問題が生じていました。OSの一部をボードの種類ごとに特別にコンパイルするか、新しいボードをサポートするために更新する必要があるためです。ただし、最近のSoCの中には(Freescale i.MX6など)、OSとは別のチップ上にデバイスツリーを備えたベンダー提供のブートローダが搭載されています。[4]
同様の目的で使用される独自の構成ファイル形式であるFEXファイル形式[5]は、 Allwinner SoC の事実上の標準です。
Devicetree は、ARM ベースのAndroidデバイスで広く使用されています。
ウィンドウズ
Windows( Windows CEを除く)は、ここで説明したようにDeviceTree(DTBファイル)を使用しません。代わりに、ACPIを使用してデバイスの検出と管理を行います。[6]
りんご
iOS、iPadOS、ARM macOSの起動プロセスでは、Low Level Bootloader (LLB) が Apple によって暗号化された devicetree をメインメモリに読み込み、次にiBoot を読み込みます。
コアブート
corebootプロジェクトはデバイスツリーを利用しますが、Linuxカーネルで使用されるフラット化されたデバイスツリーとは異なります。[7]
例
Devicetree Source (DTS) 形式の例:
/dts-v1/ ;
/ { soc { flash_controller : flash-controller @ 4001e000 { reg = < 0x4001e000 0x1000 > ; flash0 : flash @ 0 { label = "SOC_FLASH" ; erase-block = < 4096 > ; }; }; }; }; };
上記の例では、行はDTS 構文のバージョン 1 を示します。
/dts-v1/;
ツリーには 4 つのノード/(ルート ノード)、 (「システム オン チップ」のsoc略) 、 (フラッシュ コントローラを使用するフラッシュのインスタンス) があります。これらのノード名の他に、後者の 2 つのノードにはそれぞれとというラベルがあります。
flash-controller@4001e000flash@0 flash_controllerflash0
最後の 2 つのノードには、名前と値のペアを表すプロパティlabelがあります。プロパティは文字列型、プロパティerase-blockは整数型、プロパティは整数の配列 (32 ビットの符号なし値) です。プロパティ値は、デバイスツリー内の他のノードをそのファンドルで参照できます。ラベルを持つノードのファンドルは と記述されます。ファンドルも 32 ビットの値です。
regflash0&flash0
ノード名の「アットマーク」記号 ( ) の後の部分はユニット アドレス@です。ユニット アドレスは、親ノードのアドレス空間におけるノードのアドレスを指定します。
上記のツリーは、標準のDTCコンパイラによってバイナリDTB形式またはアセンブリにコンパイルできます。ただし、 Zephyr RTOSでは、DTSファイルはCヘッダーファイル(.h)にコンパイルされ、ビルドシステムによって特定のボード用のコードをコンパイルするために使用されます。[8]
参照
参考文献
- ^ abc 「Devicetree 仕様」(PDF)。リリース v0.3。devicetree.org。2020-02-13。
- ^ ab 「ARM SoC Linux サポート チェックリスト」(PDF)。
- ^ Simmonds, Chris (2017). 組み込み Linux プログラミングの習得: 組み込み Linux の可能性を最大限に引き出す (第 2 版). バーミンガム、イギリス. ISBN 978-1-78728-885-0. OCLC 995052708.
{{cite book}}: CS1 メンテナンス: 場所が見つかりません 発行者 (リンク) - ^ 「Boundary Devices ボードの u-boot アップデート」 2013 年 11 月 8 日。
- ^ 「Fex ガイド」. linux-sunxi.org. 2014-05-30 . 2014-06-12閲覧。
- ^ 「Windows ACPI ドライバー」。microsoft.com。2021 年 12 月 14 日。2022 年 9 月 19 日に閲覧。
- ^ Sun, Jiming (2015). 組み込みファームウェアソリューション: IoT の開発ベストプラクティス。Vincent Zimmer、Marc Jones、Stefan Reinauer。[米国]。p. 82。ISBN 978-1-4842-0070-4. OCLC 902804314.
{{cite book}}: CS1 メンテナンス: 場所が見つかりません 発行者 (リンク) - ^ 「devicetree の紹介 – Zephyr プロジェクト ドキュメント」。2.6.0。Zephyrプロジェクト。2021-06-05。
外部リンク
- 公式サイト
- デバイスツリーリファレンス – eLinux.org
- 組み込み電源アーキテクチャ プラットフォーム要件 (ePAPR)
- デバイスツリーについて
