読者です 読者をやめる 読者になる 読者になる

μT-Kernel for Raspberry Pi おぼえがき(1)

似たような環境に移植する人の参考になるかもしれないことを記録しておこうと思います
ソースコードはこちらに http://github.com/metanest/utkernel-pi

ローダ

Das U-Boot を使用。Raspberry Pi 用は、FreeBSD を移植しているプロジェクトのものが使える http://github.com/gonzoua/u-boot-pi

U-Boot にロードしてもらうためのバイナリの生成

アドレス 0(割込みベクタテーブル)からベタに置くようなイメージを使用する。生成に関係するのは、
etc/sysdepend/app_raspib/makerules.sysdepend の最後

OUTPUT_BINARY = -O binary

kernel/sysmain/src/Makefile.common の

$(TARGET_BIN): $(TARGET_ELF)
	$(OBJCOPY) $(OUTPUT_BINARY) $< $@

といった記述。これらによって U-Boot 用のベタイメージが作られるので、U-Boot でアドレス 0 にロードして、0 番地から実行する(0 番地にあるのはリセットベクタなので、そこからリセットエントリに飛ぶ)
(もしかしたら割込みベクタをいきなり書き換えてしまうのはまずいかもしれない)

リンカスクリプトとアセンブリ言語ソース

バイナリを生成するためのリンカスクリプト kernel/sysmain/build/app_raspib/kernel.lnk はこんな感じである。配布されている AT91 の RAM 用、および ROM 用のものを参考に修正し作成した。

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)

SECTIONS
{
	.init 0 : {
		*(.vector)
		*(.ftext)
	}

	.text : {
		*(.text)
		*(.rodata)
	} =0
	__data_org = . ;
	.data : {
		__data_start = . ;
		*(.data)
		__data_end = .;
	}
	.bss : {
		__bss_start = .;
		PROVIDE (__noinit_start = .);
		*(.noinit)
		PROVIDE (__noinit_end = .);
		*(.bss)
		*(COMMON)
		__bss_end = .;
	}
}

init セクションの中身が記述されているアセンブリ言語ソースは kernel/sysdepend/device/app_raspib/icrt0.S である。