x86 Boot Loader for iPod

iPod と一緒に amazon.co.jp に注文した MacBook がいまだに届かないので、 この週末は iPod 用の x86 ブートローダを書いた。
前回のエントリで iPod を PC の USB-HDD ブートデバイスにするために MBR に lilo や grub をインストールすると iTunes で使えなくなってしまうと書いたが、それを回避するためのものである。
なんだかすごそうに聞こえるかもしれないが実際はそんなに大したものではなく、 iPod Updater による復元時に MBR に書かれる x86 コードをちょっと上書きしてみただけである。 iPod の MBR は この図 のようになっており、 黄色で示した x86 コードの部分なら書き換えてもたぶん問題ない。
うまい具合に iPod の MBR の次のセクタは使われていないみたいなので、 ここに本来の実行させたい MBR を格納しておき、 起動時にそれを 0x7c00 に読み込んでジャンプするという作戦でいくことにした。 実際のコード も BIOS ファンクションコールにブロックコピーをするだけのごく単純なものだ。
#define LOAD_ADDR 0x7c00 #define BUF0_ADDR 0x0600 #define BUF1_ADDR 0x0800 #define START_OFFSET 0x5a #define TABLE_OFFSET 0x1be .org BUF0_ADDR jmp entry_point .org BUF0_ADDR+START_OFFSET entry_point: cld xor ax,ax mov ss,ax mov sp,ax mov ds,ax mov es,ax mov si,#LOAD_ADDR mov di,#BUF0_ADDR mov cx,#0x100 rep movsw jmp 0:next next: mov ax,#0x0201 mov bx,#BUF1_ADDR mov cx,#0x0002 mov dx,#0x0080 int 0x13 mov si,#BUF1_ADDR mov di,#LOAD_ADDR mov cx,#TABLE_OFFSET/2 rep movsw jmp 0:LOAD_ADDR .org BUF0_ADDR+0x1fe dw 0xaa55
MBR の次のセクタに格納する本来の MBR は Neil Turton の MBR プログラムを使わせてもらった。 1 セクタサイズながらランタイムにブートするパーティションを選択できる非常に便利なブートローダである。
インストールは以下のようにする。 こういうバイナリファイル操作ではやはり dd コマンドが活躍する。 日本 dd ユーザ会会員のみならずすべてのバイナリアン必携のツールといえよう。
% gcc -E -xc ipodmbr.S86 | as86 -0 -b ipodmbr.bin -s /dev/null % sudo dd if=/dev/sda count=1 > sda.bin % dd conv=notrunc if=ipodmbr.bin of=sda.bin bs=1 skip=$((0x5a)) seek=$((0x5a)) count=$((0x180-0x5a)) % sudo dd if=sda.bin of=/dev/sda % sudo install-mbr --force --offset=512 -p3 /dev/sda
これで iPod を購入した本来の目的をほぼ達成することができた。 たいていの PC で起動する フルスペックの Debian GNU/Linux に GNOME Desktop (VESA X サーバだけど) の環境を持ち歩けるので、 なかなか便利である。
カテゴリ
iPodトラックバック(0)
このブログ記事を参照しているブログ一覧: x86 Boot Loader for iPod
このブログ記事に対するトラックバックURL: http://www.keshi.org/mt/mt-tb.cgi/42
コメントする