いくつかの文字をシリアル インターフェイスに書き込むためのアセンブリ プログラムを作成しました (最初から)。Linux カーネルと同様に、これをビーグルボーンのカーネルとして実行したいと考えています。
あなたが書いたものは「スタンドアロンプログラム」と呼ばれます。リソースとサービスを OS に依存するアプリケーション プログラムとは異なり、外部コードを操作する必要はありません。カーネルが持つべき機能を何も持っていないので、それをカーネルと呼ぶべきではありません (まだともかく)。
私のプログラムのリンクアドレスは何ですか?
注: 典型的なスタンドアロン プログラムの場合、通常、スタンドアロン コードは再配置可能でなく、位置に依存しないため、"ロード アドレス" と "リンク アドレス" は同じ値になることがよくあります。
U-Boot は通常、上位の物理メイン メモリでリンク、ロード、および実行されます。
Linux カーネルは、通常、物理メイン メモリの先頭+ 0x8000 (ARM の場合) で実行するようにリンクされています。しかし、特に zImage や uImage などの圧縮ファイルの場合、カーネル イメージは通常、より高いアドレスでメモリにロードされ、解凍ルーチンは Linux カーネルを適切なロードおよび開始アドレスにインストールします。
そのため、物理メイン メモリが少ない「適切な」アドレスは、プログラムをリンクしてロードするのに適しています。
デフォルトでu-bootから起動する方法は?
U-Boot は、実行を 2 種類の「プログラム」(およびスクリプト) に転送できます。プログラムの 1 つのタイプは、 bootmコマンド
を使用する「カーネル」です。
これは、完全に自己完結型で、システムを引き継ぐ mkimage ユーティリティによってヘッダーがインストールされたカーネルまたはプログラム用です。U-Boot をカスタマイズして、このカーネル用にシステムを準備できます。Linux の場合、メモリ バッファーが割り当てられ、ユーザー定義のテキストで初期化され、カーネル コマンド ラインとして Linux カーネルに渡されます。ARM Linux の場合、別のメモリ バッファが割り当てられ、データで初期化され、ATAGとして ARM Linux カーネルに渡されます。
もう 1 つのタイプのプログラムは、goコマンドを使用します。
これは、U-Boot のサービス機能を使用でき、完了時に制御を U-Boot に戻すことさえできる、より単純なプログラム用です。バッファーの準備が不要な場合は、単純なスタンドアロン プログラムでこのgo
コマンドを使用する必要があります。
bootcmd
環境変数の定義でいずれかのコマンドを使用できます。これは、ブート タイマーが期限切れになったときに実行/実行される変数です。