7

Jetson TK1 ボードで Linux を起動する U-Boot の独自のビルドを取得しようとしています。検証済みの起動を推進しているため、フラット イメージ ツリー (カーネル イメージの統合、デバイス ツリーのブロブなど) を使用してシステムを説明しています。U-Boot は ITB ファイルをロードしてカーネルを起動しようとしますが、このメッセージの後にシステムがハングします。

これは、ブート引数がカーネルに渡されていないためだと思います (元の起動では引数の負荷が追加されます) が、引数をカーネルに渡す方法については少し唖然としています。bootargs 環境変数を設定してみましたが、状況は変わりませんでした。

ITB ファイルを使用する場合、カーネル引数をカーネルに渡すにはどうすればよいですか?

コマンドライン引数 (サンプル extlinux.conf の APPEND コマンドから取得):

console=ttyS0,115200n8 console=tty1 no_console_suspend=1 
lp0_vec=2064@0xf46ff000 video=tegrafb mem=1862M@2048M memtype=255 ddr_die=2048M@2048M 
section=256M pmuboard=0x0177:0x0000:0x02:0x43:0x00 vpr=151M@3945M tsec=32M@3913M 
otf_key=c75e5bb91eb3bd947560357b64422f85 usbcore.old_scheme_first=1 core_edp_mv=1150 
core_edp_ma=4000 tegraid=40.1.1.0.0 debug_uartport=lsport,3 power_supply=Adapter 
audio_codec=rt5640 modem_id=0 android.kerneltype=normal usb_port_owner_info=0 
fbcon=map:1 commchip_id=0 usb_port_owner_info=0 lane_owner_info=6 emc_max_dvfs=0 
touch_id=0@0 tegra_fbmem=32899072@0xad012000 board_info=0x0177:0x0000:0x02:0x43:0x00 
root=/dev/mmcblk0p1 rw rootwait tegraboot=sdmmc gpt

ITS ファイルの内容:

/dts-v1/;

/ {
    description = "Simple image with single Linux kernel and FDT blob";
    #address-cells = <1>;

    images {
        kernel@1 {
            description = "Vanilla Linux kernel";
            data = /incbin/("./zImage");
            type = "kernel";
            arch = "arm";
            os = "linux";
            compression = "none";
            load = <0x81008000>;
            entry = <0x81008000>;
            hash@1 {
                algo = "crc32";
            };
            hash@2 {
                algo = "sha1";
            };
        };
        fdt@1 {
            description = "Flattened Device Tree blob";
            data = /incbin/("./tegra124-pm375.dtb");
            type = "flat_dt";
            arch = "arm";
            compression = "none";
            hash@1 {
                algo = "crc32";
            };
            hash@2 {
                algo = "sha1";
            };
        };
    };

    configurations {
        default = "conf@1";
        conf@1 {
            description = "Boot Linux kernel with FDT blob";
            kernel = "kernel@1";
            fdt = "fdt@1";
        };
    };
};

U-Boot 出力:

Tegra124 (Jetson TK1) # fatload mmc 1 0x90000000 /kernel_fdt.itb
reading /kernel_fdt.itb
5946200 bytes read in 497 ms (11.4 MiB/s)
Tegra124 (Jetson TK1) # bootm 0x90000000
## Loading kernel from FIT Image at 90000000 ...
   Using 'conf@1' configuration
   Verifying Hash Integrity ... OK
   Trying 'kernel@1' kernel subimage
     Description:  Vanilla Linux kernel
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x900000ec
     Data Size:    5910168 Bytes = 5.6 MiB
     Architecture: ARM
     OS:           Linux
     Load Address: 0x00000000
     Entry Point:  0x00000000
     Hash algo:    crc32
     Hash value:   c5b4b377
     Hash algo:    sha1
     Hash value:   f001007efe83f563425bfe0659186a32395c946c
   Verifying Hash Integrity ... crc32+ sha1+ OK
## Loading fdt from FIT Image at 90000000 ...
   Using 'conf@1' configuration
   Trying 'fdt@1' fdt subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x905a30ac
     Data Size:    34678 Bytes = 33.9 KiB
     Architecture: ARM
     Hash algo:    crc32
     Hash value:   e466b23e
     Hash algo:    sha1
     Hash value:   ec909ae16e62233d0ed1e1f4c909085abc9b5879
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Booting using the fdt blob at 0x905a30ac
   Loading Kernel Image ... OK
   Using Device Tree in place at 905a30ac, end 905ae821

Starting kernel ...
4

3 に答える 3

6

顕著な問題は、U-Boot がテキストを出力した後にシステムがハングしたように見えることです。

Starting kernel ...

圧縮されていないカーネルイメージファイルが読み込まれている場合は、実際のカーネル スタートアップ コードが次に実行されます。
ただし、uImageまたはzImageファイルがロードされている場合 (これらは自己解凍型であるため、「非圧縮」としても報告されます)、次に実行されるコードは、zImage ファイルに添付されている解凍ルーチンになります。通常、この解凍ルーチンは次のようなテキストを出力します。

Uncompressing Linux............ done, booting the kernel.

実際のカーネル スタートアップ コードが実行される前、カーネル コマンド ラインの処理前、デバイス ツリー blob の処理前、およびカーネルからのコンソール出力 ( Earlyprintkを含む) の前。


イメージ ヘッダーで指定されたカーネル ロードと開始アドレスの間に不一致があります

 Load Address: 0x00000000
 Entry Point:  0x00000000

対 DT で指定されているもの:

        load = <0x81008000>;
        entry = <0x81008000>;

カーネルイメージは一時的にロードされるため、

## Loading kernel from FIT Image at 90000000 ...

DT 内のアドレスは正しいように見えますが、イメージ ヘッダー内のアドレスは偽物です。

0x00000000 に物理 RAM がないと仮定すると、カーネル イメージが偽のロード アドレス 0 にコピー (または解凍) され、偽のエントリ ポイント 0 に分岐してカーネル イメージが実行されます。 CPU は、存在しないメモリからガベージを実行しようとしてハングする可能性が高く、それは報告内容と完全に相関しています。

解決策は、(1) カーネルが正しいアドレスにリンクされていることを確認し、(2) コマンド オプションとコマンド オプションを使用してmkimageコマンドで正しいアドレスを指定することです。 この修正により、少なくともこの 1 つのポイントを乗り越えることができます。-a-e

于 2014-10-30T01:11:58.340 に答える
2

デバイス ツリーを使用する場合でもbootargs、引数を指定するために使用します。

それを確認します:

  • ツリーをコンパイルしました ( scripts/dtc/dtcLinux カーネル内のコンパイラを使用)
  • デバイス ツリーのサポートは、カーネル構成 (シンボル) で有効になっていますCONFIG_USE_OF(ここで、OF は「Open Firmware」を表します) 。
  • U-Boot にツリーのアドレスを提供しました。bootm <uImage address> - <dtb address>
  • シリアル コンソールは、[デバイス ドライバー] -> [キャラクター デバイス] -> [シリアル ドライバー] の下のカーネル構成で有効になっています。
  • コンソールが有効になっているbootargs(例: console=ttyS0,115200)
于 2014-10-29T09:31:16.137 に答える