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 и восьмеричные эскейпы как %b
ytes с определенным видом формата, а также с форматом %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
Я думаю, это не потому, что ядро загружает все DTS. На самом деле образ прошивки ARM может содержать более одного dts внутри, но при загрузке он загружается только на dts. Вы видите избыточное устройство int /proc/device-tree
, потому что ваше дерево устройств определило их. Даже если в вашем телефоне нет этих устройств, вы все равно можете определить это устройство, потому что эти устройства не могут работать и могут сломать ваше ядро.
Определение того, какой файл большого двоичного объекта (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
В том же каталоге dts
DTS/{manufacturer-name}/some-dts-evb.dts
Существует один файл Makefile, откройте его и вы увидите, для какого файла.dts он будет использоваться.
dtb-$(CONFIG_ARCH_XXXXXX) += some-dts-evb.dtb