2009年4月7日火曜日

kernel 2.6.29 と差し替えてみる

QEMU のサイトからダウンロードできる arm-test 0.2 の kernel を差し替えてみる。

http://www.nongnu.org/qemu/arm-test-0.2.tar.gz

kernel.org から最新の 2.6.29 を取ってくる。

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.tar.bz2

クロスコンパイラは、結局 CodeSourcery から持ってきた。

http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite

VMWare 上に最低限の Debian 5.0.0 環境を作ってインストール (単に tarball を展開するだけでも OK)。
.bashrc に

export LANG=C
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=/path/to/CodeSourcery/Sourcery_G++_Lite/bin:$PATH

ARCH が大文字じゃないと駄目なので注意(参考サイト [1] では小文字になっててはまった…)。

参考サイト

[1] http://fedoraproject.org/wiki/Architectures/ARM/HowToQemu
[2] http://d.hatena.ne.jp/himainu/20080430


$ cp arch/arm/configs/versatile_defconfig .config
$ make menuconfig

Enable DHCP Support (CONFIG_IP_PNP_DHCP).

Networking -> Networking Support -> Networking Options -> TCP/IP Networking ->

Enable Universal Tun/Tap Driver Support (CONFIG_TUN)

Device Drivers -> Network Device Support ->

Enable ARM EABI Support (CONFIG_AEABI)

Kernel Features ->

Enable tmpfs support (CONFIG_TMPFS)
File Systems -> Pseudo File Systems ->

Enable PCI (CONFIG_PCI)

SCSI LOW level drivers -> CONFIG_SCSI_SYM53C8XX_2

$ make

できた arch/arm/boot/zImage を持ってきて、arm-test 以下に置いたと仮定して。

$ qemu-0.9.1/arm-softmmu/qemu-system-arm.exe -M versatilepb -kernel arm-test/zImage -initrd arm-test/arm_root.img

で起動した。ちょっとフォントが変だけど…

2009年4月3日金曜日

machine number

Linux Kernel は、ブートローダの中でマシンチェックを行っているので、r1 レジスタに適切な machine number を入れておかないとブートできない。

http://www.arm.linux.org.uk/developer/machines/

を見ると ARM Versatile Porting Board (versatile_pb) は 387 と書いてある。

QEMU の hw/versatilepb.c を見ると、vab_init() の中で versatile_init() の最後の引数に 0x183 を指定して呼び出している。まさしく 0x183 = 387。

というわけで、マジックナンバーの謎が解けた。linux kernel のロードのための引数だったのね。static

void vpb_init(int ram_size, int vga_ram_size,
const char *boot_device, DisplayState *ds,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename, const char *cpu_model)
{
versatile_init(ram_size, vga_ram_size,
boot_device, ds,
kernel_filename, kernel_cmdline,
initrd_filename, cpu_model, 0x183);
}

...

QEMUMachine versatilepb_machine = {
"versatilepb",
"ARM Versatile/PB (ARM926EJ-S)",
vpb_init,
};