ここでもう少し、Armadillo-9のROMの内容に触れてみましょう。まず、Armadillo-9のメモリマップを記します。
Start Address |
End Address |
デバイス |
0x1000 0000 | 0x1000 000F | I/O Control Register |
0x1200 0000 | 0x1200 FFFF | PC/104 I/O 空間(8bit) |
0x1300 0000 | 0x13FF FFFF | PC/104 Memory 空間(8bit) |
0x2200 0000 | 0x2200 FFFF | PC/104 I/O 空間(16bit) |
0x2300 0000 | 0x23FF FFFF | PC/104 Memory 空間(16bit) |
0x4000 0000 | 0x47FF FFFF | Compact Flash(I/O空間) |
0x4800 0000 | 0x4BFF FFFF | Compact Flash(Attribute空間) |
0x4C00 0000 | 0x4FFF FFFF | Compact Flash(Memory空間) |
0x6000 0000 | 0x607F FFFF | Flash Memory(8Mbytes) |
0x8000 0000 | 0x8008 FFFF | EP9315 Internal Register(AHB) |
0x8009 0000 | 0x8009 3FFF | Internal Boot ROM(16kbytes) |
0x800A 0000 | 0x800F FFFF | EP9315 Internal Register(AHB) |
0x8080 0000 | 0x8094 FFFF | EP9315 Internal Register(APB) |
0xC000 0000 | 0xC1FF FFFF | SDRAM(32Mbytes) |
0xC400 0000 | 0xC5FF FFFF | SDRAM (32Mbytes) |
第1回で説明したように、組み込み機器は各種デバイスを制御するためのレジスタをすべてアドレスにマッピングしています。つまり、単純にメモリとして使うのはRAM/ROMとしての空間のみで、それ以外のアドレスはデバイス制御のために存在するということを意味します。従って、
各アドレスを触ること=デバイスの制御 |
を意味します。例えば、アドレス:0x40000000から始まる空間をアクセスすることは、Compact Flashデバイスの制御を行うということです。
ただしよく見ると、デバイスマップ以外にSDRAMが32Mbytes単位で分割されているのが分かるはずです。このままだと、64Mbytesの連続した空間として使用できないように見えますが、前述したMMU機能を用いるので、結果としてプログラム(組み込みLinux)は連続したメモリ空間として使用することができるのです。
それでは、本題のROMに注目してみましょう。Armadillo-9には、0x60000000から始まるFLASH ROMと、0x80090000から始まるInternal Boot ROMの2種類のROMが実装されています。Internal Boot ROMにはFLASH ROMの書き換えを行うための専用プログラムが格納されており、通常は使用しません(注)。電源投入時に最初に起動するプログラムが格納される領域がFLASH ROMであり、ここにはカーネルイメージなども格納されています。
注:Internal Boot ROMは、本体側面のジャンパをショートすることにより使用(Internal Boot ROMからの起動)できます。ブートローダが壊れた場合などに使用します。 |
FLASH ROMの領域は、具体的には以下のように分割して使用されています。
アドレス |
リージョン |
サイズ |
説明 |
0x60000000 〜 0x6000FFFF |
bootloader | 64kbytes | Hermitブートローダ 「loader-armadillo9.bin」のイメージ |
0x60010000 〜 0x6017FFFF |
kernel | 約1.44Mbytes | Linuxカーネル「linux.bin.gz」のイメージ (非圧縮イメージ、gz圧縮イメージに対応) |
0x60180000 〜 0x607EFFFF |
userland | 約6.44Mbytes | ユーザーランド「romfs.img」のイメージ (非圧縮イメージ、gz圧縮イメージに対応) |
0x607F0000 〜 0x60800000 |
config | 64kbytes | コンフィグ領域 |
ブートローダHermitは、起動するとアドレス:0x60010000〜0x6017FFFFにあるLinuxカーネルとアドレス:0x60180000〜0x607EFFFFにあるRAMディスクイメージを展開する機能を持っています。このアドレスはブートローダが固定で管理しているので、このアドレス以外に配置すると正常に動かないことになります。なお、アドレス:0x607F0000〜0x60800000のコンフィグ領域は、Hermitの動作設定情報が格納されています。
図3 アドレスマップとブートストラップ |
このように、組み込みLinuxのカーネルイメージはディスクなどのストレージに存在するのではなく、ROM上にあるのが分かったと思います。また、前回紹介したように、RAMディスクを用いてファイルシステムを実現していることも読み取れたと思います。もちろんこれ以外の実装方法もありますが、ここでは割愛します。
◆
今回は、取りあえず動作確認も兼ねてArmadillo-9を立ち上げるところまでを解説しました。次回は、この環境に対してどのように自作プログラムを実装するかについて解説します。
Copyright © ITmedia, Inc. All Rights Reserved.