組み込みLinuxの原則を理解しようとしていますが、u-boot出力でアドレスを理解できません。
たとえば、i.MX6クワッドプロセッサをベースにしたUDOOボードを使用していて、U-Bootから次の出力を取得しました。
U-Boot 2013.10-rc3 (Jan 20 2014 - 13:33:34)
CPU: Freescale i.MX6Q rev1.2 at 792 MHz
Reset cause: POR
Board: UDOO
DRAM: 1 GiB
MMC: FSL_SDHC: 0
No panel detected: default to LDB-WVGA
Display: LDB-WVGA (800x480)
In: serial
Out: serial
Err: serial
Net: using phy at 6
FEC [PRIME]
Warning: FEC MAC addresses don't match:
Address in SROM is 00:c0:08:88:a5:e6
Address in environment is 00:c0:08:88:9c:ce
Hit any key to stop autoboot: 0
Booting from mmc ...
4788388 bytes read in 303 ms (15.1 MiB/s)
## Booting kernel from Legacy Image at 12000000 ...
Image Name: Linux-3.0.35
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4788324 Bytes = 4.6 MiB
Load Address: 10008000
Entry Point: 10008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
Starting kernel ...
ロードアドレス0x10008000の値がわかりません。この特定のプロセッサのドキュメントによると、アドレスゾーン0x10000000-0xffffffffはメインメモリにマップされています。しかし、0x8000オフセットとは何ですか?この値の理由がわかりません。
カーネルイメージのロード元のアドレス0x12000000も理解できません。 SDカード用にマップされたメモリ領域はありますか?
これらのアドレス、またはさらに良いことに、このトピックに関するリソースへの参照について説明してください。私の目標は、u-bootとLinuxカーネルを別のボードに移植する方法を学ぶことです。
ありがとうございました!
U-bootの環境変数を確認すると、カーネルイメージがブートデバイスからRAM location(ここでは、12000000
)にfatload
のようなコマンドでコピーされていることがわかります。
さて、これはLOADADDRESS
ではありません。カーネルのコンパイル中にLOADADDRESS
をコマンドラインに指定します。このアドレスの大部分は、プロセッサの物理アドレススペースのRAMの先頭からのオフセットが32Kです。
RAMは10000000
にマッピングされ、カーネルLOADADDRESS
は10008000
(32Kオフセット)です。bootm
コマンドは、カーネルイメージを12000000
から10008000
アドレスに解凍してから、kernel entry point
を呼び出します。
include/configsフォルダーを確認してください。すべてのボード定義が含まれています
Ubootを別のポートに移植するには、非常によく似たボードに基づいて、そこから変更します。