У меня есть устройство, и я пытаюсь собрать для него правильное встроенное ядро Linux.
Версия ядра - 4.14.79.
Я использую файл blob-дерева устройств для этого ядра,Ядро и файл dtb объединяются в один файл itb при сборке. kernel.its используется для сборки, и его содержимое составляет
/dts-v1/;
/ {
description = "Simple image with single Linux kernel";
#address-cells = <1>;
images {
kernel@1 {
description = "Vanilla Linux kernel";
data = /incbin/("./zLinux.bin.gz");
type = "kernel";
arch = "arm";
os = "linux";
compression = "gzip";
load = <0x70008000>;
entry = <0x70008000>;
hash@1 {
algo = "crc32";
};
};
fdt@1 {
description = "FDT_blob";
data = /incbin/("./at91.dtb");
type = "flat_dt";
arch = "arm";
compression = "none";
};
};
configurations {
default = "config@1";
config@1 {
description = "Boot Linux kernel";
kernel = "kernel@1";
fdt = "fdt@1";
};
};
};
Диапазон адресов ОЗУ на устройстве: 0x70000000 - 0x74000000 .Образ ядра загружается в положение 0x72000000 и распаковывается в 0x70000000 при запуске.Начальный адрес сплюснутой древовидной структуры устройства выглядит примерно так: 0x722e3bf0 в образе itb, который загружается с 0x72000000 .И при распаковке эта структура FDT излучает по адресу 0x722e3bf0 - 0x01c00000 = 0x706e3bf0 .Я немного изменил исходный код U-boot, поэтому U-boot вычисляет распакованный адрес структуры FDT и передает этот адрес в качестве значения регистра ядру.Ядро находит структуру FDT по этому адресу и устанавливает некоторые параметры, необходимые для корректной работы ядра.Начальный адрес 0x722e3bf0 если передан в ядро неверно: ядро не может управлять этим адресом, оно как-то не входит в отображение виртуальной памяти ядра.
Таким образом, это выходной журнал на putty при запуске ядра:
## Booting kernel from FIT Image at 72000000 ...
FIT CHECK FORMAT
Using 'config@1' configuration
Trying 'kernel@1' kernel subimage
Description: Vanilla Linux kernel
Type: Kernel Image
Compression: gzip compressed
Data Start: 0x720000e0
Data Size: 2857468 Bytes = 2.7 MiB
Architecture: ARM
OS: Linux
Load Address: 0x70008000
Entry Point: 0x70008000
Hash algo: crc32
Hash value: 9399403c
Verifying Hash Integrity ... crc32+ OK
DTB 1
DTB 2
FIT CHECK FORMAT
## Flattened Device Tree from FIT Image at 72000000
Using 'config@1' configuration
Trying 'fdt@1' FDT blob subimage
Description: FDT_blob
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x722b9bb0
Data Size: 33455 Bytes = 32.7 KiB
Architecture: ARM
Verifying Hash Integrity ... OK
Booting using the fdt blob at 0x722b9bb0
Uncompressing Kernel Image ... OK
do_bootm_linux
setup_start_tag
setup_memory_tags
setup_commandline_tag "mem=64M console=ttyS0,115200n8 initrd=0x70700000,0x31768 root=/dev/ram0 rw, ramdisk_size=31768, quiet"
setup_revision_tag
machid = 0x000008a4
dtb_blob = 0x706b9bb0
Starting kernel ...
START KERNEL
По какой-то причине мне нужно включить опцию ядра CONFIG_BLOCK.Но когда я это делаю, структура FDT перестает проецировать на адрес initial_address - 0x01c00000 и недоступна на своем начальном адресе (например, 0x722e70bf ).И я не нашел эту структуру в диапазоне 0x70000000 - 0x72000000 .Поэтому ядро не может прочитать структуру FDT и не может быть запущено:
## Booting kernel from FIT Image at 72000000 ...
FIT CHECK FORMAT
Using 'config@1' configuration
Trying 'kernel@1' kernel subimage
Description: Vanilla Linux kernel
Type: Kernel Image
Compression: gzip compressed
Data Start: 0x720000e0
Data Size: 3029564 Bytes = 2.9 MiB
Architecture: ARM
OS: Linux
Load Address: 0x70008000
Entry Point: 0x70008000
Hash algo: crc32
Hash value: 2046e5ff
Verifying Hash Integrity ... crc32+ OK
DTB 1
DTB 2
FIT CHECK FORMAT
## Flattened Device Tree from FIT Image at 72000000
Using 'config@1' configuration
Trying 'fdt@1' FDT blob subimage
Description: FDT_blob
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x722e3bf0
Data Size: 33511 Bytes = 32.7 KiB
Architecture: ARM
Verifying Hash Integrity ... OK
Booting using the fdt blob at 0x722e3bf0
Uncompressing Kernel Image ... OK
do_bootm_linux
setup_start_tag
setup_memory_tags
setup_commandline_tag "mem=64M console=ttyS0,115200n8 initrd=0x70700000,0x31768 root=/dev/ram0 rw, ramdisk_size=31768, quiet"
setup_revision_tag
machid = 0x000008a4
dtb_blob = 0x706e3bf0
Starting kernel ...
no ATAGS support: can't continue
RomBOOT
Ядро .config Файл находится здесь: https://pastebin.com/CA28Shqq
Как можно решить эту проблему?
ОБНОВЛЕНИЕ
Добавлены некоторые строки в файл kernel.its :
/dts-v1/;
/ {
description = "Simple image with single Linux kernel";
#address-cells = <1>;
images {
kernel@1 {
description = "Vanilla Linux kernel";
data = /incbin/("./zLinux.bin.gz");
type = "kernel";
arch = "arm";
os = "linux";
compression = "gzip";
load = <0x70008000>;
entry = <0x70008000>;
hash@1 {
algo = "crc32";
};
};
fdt@1 {
description = "FDT_blob";
data = /incbin/("./at91.dtb");
type = "flat_dt";
load = <0x70700000>;
entry = <0x70700000>;
arch = "arm";
compression = "none";
};
};
configurations {
default = "config@1";
config@1 {
description = "Boot Linux kernel";
kernel = "kernel@1";
fdt = "fdt@1";
};
};
};
Ядро зависает при запуске:
## Booting kernel from FIT Image at 72000000 ...
FIT CHECK FORMAT
Using 'config@1' configuration
Trying 'kernel@1' kernel subimage
Description: Vanilla Linux kernel
Type: Kernel Image
Compression: gzip compressed
Data Start: 0x720000e0
Data Size: 3029568 Bytes = 2.9 MiB
Architecture: ARM
OS: Linux
Load Address: 0x70008000
Entry Point: 0x70008000
Hash algo: crc32
Hash value: 5fac1bbd
Verifying Hash Integrity ... crc32+ OK
DTB 1
DTB 2
FIT CHECK FORMAT
## Flattened Device Tree from FIT Image at 72000000
Using 'config@1' configuration
Trying 'fdt@1' FDT blob subimage
Description: FDT_blob
Type: Flat Device Tree
Compression: uncompressed
Data Start: 0x722e3bf4
Data Size: 33511 Bytes = 32.7 KiB
Architecture: ARM
Verifying Hash Integrity ... OK
Loading FDT from 0x722e3bf4 to 0x70700000
Booting using the fdt blob at 0x70700000
Uncompressing Kernel Image ... OK
do_bootm_linux
setup_start_tag
setup_memory_tags
setup_commandline_tag "mem=64M console=ttyS0,115200n8
initrd=0x70700000,0x31768 root=/dev/ram0 rw, ramdisk_size=31768,
quiet"
setup_revision_tag
machid = 0x000008a4
dtb_blob = 0x70700000
Starting kernel ...
RomBOOT
Ядро не запускается, но теперь при запуске ядра имеется уплощенная древовидная структура устройства по адресу 0x70700000.Как заставить ядро добавить некоторые диапазоны адресов в отображение памяти, чтобы ядро могло управлять данными в этих диапазонах?