Share
Embed
NetBSDブートローダー解説と luna68kでの実装
関西オープンソース 2013 の BSDなひととき での発表に使用したスライドです。
web版は
http://www.ceres.dti.ne.jp/tsutsui/kof2013/NetBSD_bootloader.html
にあります。
Izumi Tsutsui
November 09, 2013
Transcript
47 slides
-
ブート / ブートストラップ とは(3) • Wikipedia 「ブート」項より引用 コンピュータはソフトウェアをロード しないと動作できない ソフトウェアをロードするにも
ソフトウェアが必要 というパラドックスに着目した呼称 -
x86 PCのブートストラップ(3) • まだまだ続くサイズ制限 pbr.s は再度MBRパーティションを 見て、自身のパーティションの先頭 8KBにある bootxx_XXXfs を読み込む
4.3BSD由来のFFSだと先頭8KBは空き領域 EXT2FSだと1KBしか空いてなかったり UFS2だと64KB空いてたり -
x86 PCのブートストラップ(4) • プライマリブート8KB 先頭512バイトは pbr.s 次の512バイトは disklabel それ以降が bootxx_XXXfs
本体 8KBではサイズ制約が厳しいので プライマリブートは単一ファイルシステム のみをサポート -
x86 PCのブートストラップ(5) • セカンダリブート /boot bootxx_XXXfs は disklabel を見て rootパーティションから
/boot(セカンダリブート)を 読み込んで実行する bootxx_XXXfs は FFSv1, FFSv2 等々 ファイルシステムに応じて使い分け要 -
x86 PCのブートストラップ(6) • ようやくカーネルに到達 /boot には特にサイズの制限は無く、 各種のファイルシステムをサポート ⇒任意のファイルシステムから カーネルを読み込んで実行 つまり
/boot は各ファイルシステムで 共通に使用可能 -
4.4BSD/luna68k ブートローダー • 純正OS以外の存在について 4.4BSD-Lite2/luna68kには 実はブートローダーが存在 開発者の藤田さん曰く: 「LUNAのブートROMは SCSI ID
5,6の ドライブからしか起動できなくて めんどくさいからローダー書いた」 -
画面に情報を表示する • とりあえず printf() printf() を動かすためには何が必要? ⇒1文字出力関数の putchar()があれば あとは standaloneライブラリ(libsa)
が何とかしてくれる サイズの都合で printf() が無理な場合は 適当に低機能な文字出力ルーチンを用意 -
putchar() 実装 レベル1 • たかが1文字出力、されど以下略 BIOSを使う場合は大抵 putchar() に 相当するルーチンあり シリアルコンソールなら
「送信データレジスタに文字データを 書き込んで送信完了まで待つ」 みたいな感じ -
putchar() 実装 レベル2 • 端末に必要な機能とは スクリーンコンソールなら 自前で端末機能の実装が必要 対応する文字のビットマップを画面に書く CTRL-Hでカーソル戻して文字を消す CTRL-Mでカーソルを次の行の先頭に
カーソルが画面右端に来たら改行して左に戻す カーソルが画面下端に来たらスクロールする ……その他もろもろ -
ディスクの読み込み • カーネルのDisk I/O APIの縮小版 APIとしては open() と strategy() open()
でアクセスするデバイスを指定 strategy() でセクタ番号とバッファと バイト数を指定 ⇒read/writeは方向が違うだけ -
パーティション情報の解釈 • といっても単に先頭からのoffsetだけ MBRセクタ もしくは disklabel のある セクタを読んで、そのパーティション 情報に従ってセクタオフセットを調整 ただし、各機種共通で使える
MIルーチンは用意されていないので、 微妙にコピペ実装が氾濫気味 -
ファイルシステムの解釈 • これはちゃんと整備されてる MI libsa に各種ファイルシステムの アクセス用ルーチンあり ffsv1, ffsv2, lfsv1,
lfsv2, dosfs, ext2fs, cd9660, minixfs3, ustarfs 等々 各fsルーチンはディスクを open() / strategy() 関数でアクセス -
4.4BSDブートローダー移植内容 • 流用する部分と NetBSD libsa をくっつける 文字入出力は putchar() と getchar()
のところで区切って libsa と結合 ディスクI/O の open() と strategy() を libsa の形式に合うように修正 カーネルバイナリ形式(ELF)の解釈は libsa のルーチンを使うように変更 -
移植 2日目 (続き) • コンパイル→デバッグ 後回しの部分をひたすら誤魔化して とりあえずリンク printf() 動作前デバッグ方法の確立 ⇒未定義命令実行でモニタに落ちる
がしがしデバッグしてキーボードと スクリーンコンソールprintf()動作! -
移植 3日目 • 次はディスク周り 後回しで誤魔化していた部分の修正 SCSIディスクの open(), strategy() 関連を libsa
に合うように書き換え ⇒再度がしがしデバッグして ディスクのプローブとセクタリード まで動作 -
コミットログ Module Name: src Committed By: tsutsui Date: Sat Jan
5 17:44:25 UTC 2013 Added Files: src/sys/arch/luna68k/include: loadfile_machdep.h src/sys/arch/luna68k/stand/boot: Makefile autoconf.c bmc.c bmd.c boot.c boot.ldscript conf.c cons.c device.h devopen.c disklabel.c font.c getline.c init_main.c ioconf.c kbd.c kbdreg.h locore.S machdep.c omron_disklabel.h parse.c preset.h prf.c rcvbuf.h romcons.c romvec.h samachdep.h sc.c screen.c scsi.c scsireg.h scsivar.h sd.c sio.c sioreg.h status.h stinger.h trap.c ufs_disksubr.c vectors.h version Log Message: First cut at NetBSD/luna68k native bootloader. Based on 4.4BSD-Lite2/luna68k "Stinger" loader revision "Phase-31" http://svnweb.freebsd.org/csrg/sys/luna68k/stand/ and MI libsa glue stuff are taken from hp300 etc. Tested on LUNA-I and old DK315C SCSI disk drive. -
移植 Nか月後 • 2013年 10月 28日 OpenBSD/luna88k にも ブートローダーが追加 ⇒Miod
Vallat さんにより NetBSD/luna68k のブートローダー 実装を移植 -
OpenBSD/luna88k コミットログ CVSROOT: /cvs Module name: src Changes by: [email protected]
2013/10/28 16:13:13 Added files: sys/arch/luna88k/stand: Makefile Makefile.inc sys/arch/luna88k/stand/boot: Makefile autoconf.c awaitkey.c bcd.c bmc.c bmd.c boot.c boot.ldscript conf.c cons.c dev_net.c dev_net.h device.h devopen.c fault.c font.c getline.c getsecs.c if_le.c init_main.c ioconf.c kbd.c kbdreg.h lance.c lance.h locore.S parse.c prf.c rcvbuf.h samachdep.h sc.c scsireg.h scsivar.h sd.c setjmp.S sio.c sioreg.h status.h ufs_disksubr.c Log message: The first steps of a native OpenBSD/luna88k bootloader. Able to boot ELF kernels with symbols from disk or network. Based upon the NetBSD/luna68k bootloader which got recently overhauled from 4.3BSD (thanks, tsutsui@ !), updated to match the luna88k hardware layout and turned into a polling-only binary. Tested on luna88k (not -2) only so far. -
まとめ (2) 「なんでそんなものを実装するの?」 自分がそのマシンを使い続ける限り、 ブートローダーは起動時毎回使います! OpenBSD/luna88k にも流用されて ほかの人の役にも立ちましたよ!! 日々記録を残しつつ作業することで、
こんな発表をすることができました! 詳細は togetterまとめ参照: http://togetter.com/li/433650