またもや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の出力からその場で計算するからアドレスの決めうちとかスクリプトから外したよ(`・ω・´)
ただ、この作りだと前回より遅いね。まぁいいや。