커널은 로드할 장치 트리를 어떻게 알 수 있나요?

커널은 로드할 장치 트리를 어떻게 알 수 있나요?

장치 트리는 ARM 장치에서 실행할 때 올바른 드라이버와 해당 구성을 식별하고 로드하는 데 사용됩니다. 그런데 예를 들어 휴대폰에 로딩된 DT를 보면 /proc/device-tree실제 플랫폼과 전혀 관련이 없는 구성이 많이 있습니다. 예를 들어, 이 특정 장치에는 한 번도 사용한 적이 없고 앞으로도 사용하지 않을 약 15가지의 서로 다른 디스플레이 구성이 있습니다. 지금까지는 해당 DT만 커널에 포함되어 로드되는 줄 알았는데, /arch해당 소스 폴더에 있는 DTS가 모두 로드되는 것 같습니다. 커널은 플랫폼에 적합한 커널을 어떻게 선택합니까? 이건 좀 중복되지 않나요?

답변1

로드할 장치 트리 Blob(DTB) 파일(DTS(장치 트리 소스)에서 컴파일된 파일)을 결정하는 작업은 일반적으로 부트 로더에 의해 처리됩니다.

많은 장치 제조업체는 해당 하드웨어에 로드할 DTB 파일을 결정하는 작업을 자동화하기 위해 제조업체별 코드를 추가하도록 부트로더를 사용자 정의합니다.

한 가지 예USB 부팅, 일반적으로 사용되는 부트로더z이미지 커널 imagefdt_fileSATA 장치의 FAT 파티션의 DTB. 이는 loadaddr지정된 메모리 주소 에 로드된 fdt_addr다음 U-Boot bootz명령으로 전달됩니다.

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

U-부트 bootz사용법:

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

관련 정보