Как ядро ​​узнает, какое дерево устройств загружать?

printf применяет свою строку формата к каждому аргументу, который следует за ним на выходе. Это встроенный модуль оболочки bash, который можно использовать для применения строки-разделителя к списку аргументов.

Например:

printf %s:delimit: arg1 arg2 arg3

arg1:delimit:arg2:delimit:arg3:delimit:

Дело в том, что printf не останавливается на применении своей строки формата в конце аргументов, и поэтому последний получает добавленный разделитель. С этим можно справиться в некоторых случаях:

printf %b:delimit: \\0150 \\0145 \\0171\\c

h:delimit:e:delimit:y

printf интерпретирует C и восьмеричные эскейпы как %bytes с определенным видом формата, а также с форматом %b вы \cут его вывод в определенной точке, поэтому printf не следует за y выше с : delimit: строкой, на что указывала бы его форматная строка.

Поэтому если вы хотите, чтобы каждый аргумент интерпретировался буквально и без разделителя в конце, то вам нужно решить проблему в самом списке аргументов:

set -- arg1 arg2 arg3
for arg do shift
    set -- "$@" :delimit: "$arg"
done; shift
printf %s "$@"

arg1:delimit:arg2:delimit:arg3
6
10.06.2018, 22:52
3 ответа

Я думаю, это не потому, что ядро ​​загружает все DTS. На самом деле образ прошивки ARM может содержать более одного dts внутри, но при загрузке он загружается только на dts. Вы видите избыточное устройство int /proc/device-tree, потому что ваше дерево устройств определило их. Даже если в вашем телефоне нет этих устройств, вы все равно можете определить это устройство, потому что эти устройства не могут работать и могут сломать ваше ядро.

1
27.01.2020, 20:30

Определение того, какой файл большого двоичного объекта (DTB )дерева устройств, который скомпилирован из источника дерева устройств (DTS ), для загрузки, обычно обрабатывается загрузчиком.

Многие производители устройств настраивают загрузчик, добавляя специальный -код производителя для автоматизации задачи определения того, какой файл DTB следует загрузить для данного оборудования.

Пример для U -Boot , широко используемого загрузчика, который загружает ядро ​​zImageimageи DTB fdt_fileиз раздела FAT на устройстве SATA. Они загружаются по адресам памяти, указанным 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 _, найти _изображения , а также boot _. ] получить _fdt .

Вы также можете попытаться почерпнуть некоторую информацию из U -Boot manual:https://www.denx.de/wiki/view/DULG/UBootCmdFDT

3
27.01.2020, 20:30

В том же каталоге dts

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

Существует один файл Makefile, откройте его и вы увидите, для какого файла.dts он будет использоваться.

dtb-$(CONFIG_ARCH_XXXXXX) += some-dts-evb.dtb
1
26.03.2020, 01:33

Теги

Похожие вопросы