カーネルはロードするデバイスツリーをどのように知っていますか?

カーネルはロードするデバイスツリーをどのように知っていますか?

デバイスツリーは、ARMデバイスで実行するときに正しいドライバとその設定を識別してロードするために使用されます。ところが、例えば携帯電話にロードされたDTを見ると、/proc/device-tree実際のプラットフォームと全く関係のない構成がたくさんあります。たとえば、この特定のデバイスには一度も使用したことがなく、今後使用しない約15の異なるディスプレイ構成があります。これまでは、そのDTだけがカーネルに含まれてロードされると思いましたが、/archそのソースフォルダにあるDTSがすべてロードされるようです。カーネルはプラットフォームに適したカーネルをどのように選択しますか?これは少し重複しませんか?

答え1

ロードするデバイスツリーBLOB(DTB)ファイル(デバイスツリーソース(DTS)からコンパイルされたファイル)を決定する操作は、通常ブートローダによって処理されます。

多くのデバイスメーカーは、そのハードウェアにロードする DTB ファイルを決定する作業を自動化するために、メーカー固有のコードを追加するようにブートローダをカスタマイズします。

一例USBブート、一般的に使用されるブートローダzイメージカーネル imagefdt_fileSATA デバイスの FAT パーティションの DTB。これはloadaddr指定されたメモリアドレスにロードされ、fdt_addrU-Bootbootzコマンドに渡されます。

fatload sata 0:1 ${loadaddr} ${image};
fatload sata 0:1 ${fdt_addr} ${fdt_file};
bootz ${loadaddr} - ${fdt_addr};

U-bootbootzの使い方:

bootz [addr [initrd[:size]] [fdt]]
    - boot Linux zImage stored in memory
        The argument 'initrd' is optional and specifies the address
        of the initrd in memory. The optional argument ':size' allows
        specifying the size of RAW initrd.
        When booting a Linux kernel which requires a flat device-tree
        a third argument is required which is the address of the
        device-tree blob. To boot that kernel without an initrd image,
        use a '-' for the second argument. If you do not pass a third
        a bd_info struct will be passed instead

U-Bootがこれを処理する方法の詳細については、fdt_fileソースコードを参照してください。bootm_find_images、またboot_get_fdt

U-Bootマニュアルでいくつかの情報を収集することもできます。https://www.denx.de/wiki/view/DULG/UBootCmdFDT

答え2

カーネルがすべてのDTSをロードするためではないようです。実際、ARMファームウェアイメージには複数のdtを含めることができますが、起動時にのみdtをロードします。/proc/device-treeデバイスツリーで定義した冗長デバイス整数が表示されます。携帯電話にこれらのデバイスがない場合でも、これらのデバイスは機能せず、カーネルが破損する可能性があるため、デバイスを定義できます。

答え3

同じdtsディレクトリに

DTS/{manufacturer-name}/some-dts-evb.dts

Makefileがあり、それを開くと、どの.dtsファイルが使用されているかを確認できます。

dtb-$(CONFIG_ARCH_XXXXXX) += some-dts-evb.dtb

関連情報