Как сделать так, чтобы dtb blob работал, когда установлен CONFIG_BLOCK - PullRequest
0 голосов
/ 28 января 2019

У меня есть устройство, и я пытаюсь собрать для него правильное встроенное ядро ​​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.Как заставить ядро ​​добавить некоторые диапазоны адресов в отображение памяти, чтобы ядро ​​могло управлять данными в этих диапазонах?

...