Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NetBSDブートローダー解説と luna68kでの実装

NetBSDブートローダー解説と luna68kでの実装

関西オープンソース 2013 の BSDなひととき での発表に使用したスライドです。
web版は
http://www.ceres.dti.ne.jp/tsutsui/kof2013/NetBSD_bootloader.html
にあります。

Izumi Tsutsui

November 09, 2013
Tweet

More Decks by Izumi Tsutsui

Other Decks in Programming

Transcript

  1. x86 PCのブートストラップ(4) • プライマリブート8KB 先頭512バイトは pbr.s 次の512バイトは disklabel それ以降が bootxx_XXXfs

    本体 8KBではサイズ制約が厳しいので プライマリブートは単一ファイルシステム のみをサポート
  2. x86 PCのブートストラップ(5) • セカンダリブート /boot bootxx_XXXfs は disklabel を見て rootパーティションから

    /boot(セカンダリブート)を 読み込んで実行する bootxx_XXXfs は FFSv1, FFSv2 等々 ファイルシステムに応じて使い分け要
  3. 画面に情報を表示する • とりあえず printf() printf() を動かすためには何が必要? ⇒1文字出力関数の putchar()があれば  あとは standaloneライブラリ(libsa)

     が何とかしてくれる サイズの都合で printf() が無理な場合は 適当に低機能な文字出力ルーチンを用意
  4. ディスクの読み込み • カーネルのDisk I/O APIの縮小版 APIとしては open() と strategy() open()

    でアクセスするデバイスを指定 strategy() でセクタ番号とバッファと バイト数を指定 ⇒read/writeは方向が違うだけ
  5. ファイルシステムの解釈 • これはちゃんと整備されてる MI libsa に各種ファイルシステムの アクセス用ルーチンあり ffsv1, ffsv2, lfsv1,

    lfsv2, dosfs, ext2fs, cd9660, minixfs3, ustarfs 等々 各fsルーチンはディスクを open() / strategy() 関数でアクセス
  6. 4.4BSDブートローダー移植内容 • 流用する部分と NetBSD libsa をくっつける 文字入出力は putchar() と getchar()

    のところで区切って libsa と結合 ディスクI/O の open() と strategy() を libsa の形式に合うように修正 カーネルバイナリ形式(ELF)の解釈は libsa のルーチンを使うように変更
  7. 移植 3日目 • 次はディスク周り 後回しで誤魔化していた部分の修正 SCSIディスクの open(), strategy() 関連を libsa

    に合うように書き換え ⇒再度がしがしデバッグして  ディスクのプローブとセクタリード  まで動作
  8. コミットログ 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.
  9. 移植 Nか月後 • 2013年 10月 28日 OpenBSD/luna88k にも ブートローダーが追加 ⇒Miod

    Vallat さんにより  NetBSD/luna68k のブートローダー  実装を移植
  10. 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.