またもやRAMDISK抽出プログラムの作成
環境を作り直す度に毎度毎度同じ所ではまっていて大変時間の無駄使いだと思うのだが、今度こそメモリ配置とか変わっても再利用出来るコードにした。
※この件の背景
HDDにOSが入ってない状態でカーネル起動〜ユーザランド起動まで動作を確かめるには、RAMDISKをカーネルに埋め込んで起動するのが一番。
だがしかし、カーネルにRAMDISKを埋め込むrdsetroot.cがクロス環境を意識してないっぽくて、リトルエンディアン環境でビッグエンディアンなカーネルが扱えないっぽ。
てな訳で、ftpで配布されてるRAMDISK付きカーネルからRAMDISKだけ抜き出してビルドしたカーネルに書き込んじゃえ!
以前のまとめはこちら:
OpenBSD/sgi on octane2 - minirootからの起動 - かーねる・う゛いえむにっき
こちらが改良版:
#!/bin/sh OBJDUMP=/usr/cross/sgi/usr/bin/mips64-unknown-openbsd4.6-objdump get_entry_vaddr() { $OBJDUMP -p $1|grep LOAD|awk '{print $5}' } get_entry_off() { $OBJDUMP -p $1|grep LOAD|awk '{print $3}' } get_root_size_size() { echo -n 0x $OBJDUMP -t $1|grep rd_root_size|awk '{print $5}' } get_root_size_vaddr() { echo -n 0x $OBJDUMP -t $1|grep rd_root_size|awk '{print $1}' } get_root_image_size() { echo -n 0x $OBJDUMP -t $1|grep rd_root_image|awk '{print $5}' } get_md_off() { echo $((`get_root_size_vaddr $1` - `get_entry_vaddr $1` + `get_entry_off $1`)) } get_md_size() { echo $((`get_root_size_size $1` + `get_root_image_size $1`)) } RAMDISK=$1 KERNEL=$2 TMP=/tmp/rd dd if=$RAMDISK of=$TMP bs=1 skip=`get_md_off $RAMDISK` count=`get_md_size $RAMDISK` hexdump -n 1024 -C $TMP dd if=$TMP of=$KERNEL bs=1 seek=`get_md_off $KERNEL` count=`get_md_size $KERNEL` conv=notrunc
全部objdumpの出力からその場で計算するからアドレスの決めうちとかスクリプトから外したよ(`・ω・´)
ただ、この作りだと前回より遅いね。まぁいいや。