Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

A story of porting OpenBSD/luna88k

1,437 views

Published on

A story of porting OpenBSD/luna88k, at the 1st Kernel/VM explorer @ Nagoya.

Published in: Software
  • Be the first to comment

A story of porting OpenBSD/luna88k

  1. 1. 第一回 カーネル/VM探検隊@名古屋 BSD昔ばなし OpenBSD/luna88k 移植物語 Nagoya *BSD Users' Group Kenji Aoyama / ⻘⼭ 健治 Twitter: @ao_kenji 〜 port maintainerになるまで編 〜
  2. 2. 2 自己紹介(1) • ⻘⼭ 健治 / あおやま けんじ – 本業: 電機メーカ勤務 業務プロセス改善を企画するスタッフ • パソコン歴 – MZ-2000 – X68000XVI – PC-AT 画像出典: http://www.itoi.jp/time31.html ・SHARP GALAPAGOS STORE より MZ, Xはソフトが少ないのがあたりまえの機種 →「なければ自分で何とかする!」という文化に染まる
  3. 3. 3 自己紹介(2) • UNIX歴 – Sun3 / SunOS 4.0.x ぐらいから? – FreeBSD → NetBSD → OpenBSD • OpenBSD/luna88k port maintainer – 2004年〜 ↑今日は、ここに至るまでのお話です
  4. 4. 4 LUNAとは? • LUNAシリーズ – オムロン株式会社が1980年代後半〜90年代 初めに販売していたワークステーション • LUNA, LUNA-II – CPU:モトローラ68030/68040(m68k) – NetBSD/luna68kが動きます • LUNA-88K, LUNA-88K2 – CPU:モトローラ88100(m88k) MP対応 – OpenBSD/luna88kが動きます ⾒かけたら保護を!
  5. 5. 5 LUNA-88K2:こんなマシンです 前面の 液晶パネル 個々のCPU動作 状況が分かる LEDマルチプロセッサ 対応 比較的 コンパクトな筐体 (家庭にもおけます) CPU動作状況が 分かる電源ボタン Cバススロット (88K2のみ)
  6. 6. 6 2000年8月: はじめは他⼒本願 • LUNA-88K2を廃棄物置場から保護 • 絶対にNetBSDが移植されると思っていた ので、しばらく様⼦⾒する ※:NetBSD/luna68kは2000/01/05に登場 http://wiki.netbsd.org/ports/luna68k/luna68k_info/#futurework Future work LUNA-88K support would be a fun project; CMU Mach3 MK84 release contains code for the LUNA-88K hardware, and its peripheral devices are nearly identical to those of the LUNA. NetBSD/luna68kの Webページより (現在もこのまま)
  7. 7. 7 2001年5月: port-m88k にアピール Subject: LUNA-88K2 To: None <port-m88k@netbsd.org> From: Kenji Aoyama <aoyama@nk-home.net> Date: 05/14/2001 22:56:57 Hi, I have an OMRON LUNA-88K2 (DT9581), which is driven by four 33MHz 88100 processors. I think it is the final model of OMRON LUNA-88K series. I'm not sure about the difference between LUNA-88K and LUNA-88K2, but when NetBSD/luna88k binaries are ready, I will be able to test if they are running on LUNA-88K2. And I have the hardware manuals of LUNA-88K and LUNA-88K2 written in Japanese, so if someone interested, please let me know. (But I think they are not so much informative...) NetBSD/luna88kができたら、 LUNA-88K2でテストしまっせ!
  8. 8. 8 2001年秋: 無謀な挑戦!? • あまり進展がないので、最近の*BSDを自 分で動かしてやろうかと思い始める • まずはCPUのマニュアル を探す • 12月にオーストラリアの 古本屋のWebページ で発⾒ → 購入 この本を⾒つけてしまった のが運命の分かれ道(^_^)
  9. 9. 9 m88kとは? • モトローラがm68kの後継として開発したRISC プロセッサ • マルチプロセッサ構成を念頭に置いた設計 • 開発の遅れ、モトローラの戦略変更(PowerPC への注⼒)などから、採用機種は非常に少ない – モトローラ MVMEシリーズ – データゼネラル AViiONシリーズ – オムロン LUNA-88Kシリーズ など • 「CPU⿊歴史」で紹介されています
  10. 10. 10 m88k(MC88100)のレジスタ構成 General Purpose Registers (32bit x 32) 出典:MC88100 User’s Manual (Motorola)
  11. 11. 11 m88k(MC88100)の汎用レジスタ 32bit 汎用レジスタ 32本 r0: 0固定 r1: 関数からの戻り場所 r2〜r9: 関数の引数 出典:MC88100 User’s Manual (Motorola) r30: フレームポインタ r31: スタックポインタ
  12. 12. 12 偉大な先達:つついさん記録でイメトレ http://www.ceres.dti.ne.jp/tsutsui/netbsd/port-news68k.html 15年ほど前からお名前 は存じ上げていましたが、 先週のOSC 2015 関⻄ @京都で初めてお会いし ました。
  13. 13. 13 どのOSを狙う? • MVME 88Kで動いているOpenBSDをターゲッ トにする – 他にm88kがサポートされている*BSDはない – 大元はCMU Mach/luna88kなのでなんとかなる? CMU Mach /luna88k OpenBSD /mvme88k OpenBSD /luna88k UniOS Mach ソース非公開 LUNA-88K LUNA-88K LUNA-88K2 MVME 88K ソース公開 ソース公開
  14. 14. 14 OpenBSDとは? • 日本語版Webページより: – OpenBSD プロジェクトでは、フリーでマル チプラットホーム対応の 4.4BSD ベースの UNIX 系 OS を提供しています。 – 私たちのプロジェクトが特に⼒を入れている のは、 移植性、標準化、正当性、積極的なセ キュリティそして暗号機能の統合です。 http://www.openbsd.org/
  15. 15. 15 必要なもの(1): クロスコンパイラ • OpenBSDにはクロス開発環境がある – NetBSDほどは整備されていないようだが • SPARCstation LXにm88kのクロス開発環 境構築 – microSPARC@50MHz – i386ではうまくいかなかった • バイトオーダ違いのため?
  16. 16. 16 必要なもの(2): カーネル起動方法 • Machのカーネル ‘vmunix’ は普通の a.out フォーマット • 元々入っているUniOS Machの a パー ティションにa.out 形式のバイナリを置け ばROMモニタから起動できそう • デバッグシンボルは特別扱いしているよ うだが、とりあえず後回し – 結局、native boot loaderになるまでシンボ ルは使えませんでした
  17. 17. 17 必要なもの(3): ハードウェア情報 • CPU – ユーザーズマニュアル(本) • デバイス – CMU Machのソース – NetBSD/luna68kのソース • とりあえずこれだけあればなんとかなる!?
  18. 18. 18 2001年2月3日: 起動&文字出⼒テスト • 自作プログラムを起動 – アセンブラの練習も兼ねる – CMU Machのソースを元に – シリアル出⼒ルーチンで1文字表示 (C) Copyright Omron Corporation 1989, 1990, 1991, 1992 ROM Version 1.37, 48 Megabytes RAM, 4 CPUs Memory Check: 3Port passed, main skipped. ROM Monitor 0>b sd(0,0,0) mykernel Booting sd(0,0,0) mykernel AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA : • カーネル起動はこの方法でできそう
  19. 19. 19 2001年2月23日: 自前カーネル作成 • mvme88kのソースを元に、コメントアウ トやスタブを駆使してカーネルをリンク (C) Copyright Omron Corporation 1989, 1990, 1991, 1992 ROM Version 1.37, 48 Megabytes RAM, 4 CPUs Memory Check: 3Port passed, main skipped. ROM Monitor 0> 0> 0>b sd(0,0,0) bsd Booting sd(0,0,0) bsd section # error[267]section # error[267]section # error[267]section # error[267] Boot failure ..Boot failure ..Boot failure ..Boot failure .. 0> • 起動しない!?→リンク形式(MAGIC)問題? – つついさん記録にも似たようなことが… OpenBSDの カーネル名
  20. 20. 20 (C) Copyright Omron Corporation 1989, 1990, 1991, 1992 ROM Version 1.37, 48 Megabytes RAM, 4 CPUs Memory Check: 3Port passed, main skipped. ROM Monitor 0>b sd(0,0,0) bsd Booting sd(0,0,0) bsd LUNA-88K: 4 CPUs 8 CMMUs CPU0 is attached with 2 MC88200 CMMUs CPU1 is attached with 2 MC88200 CMMUs CPU2 is attached with 2 MC88200 CMMUs CPU3 is attached with 2 MC88200 CMMUs panic: m8820x_cmmu_cpu_number: could not determine mypanic: m8820x_cmmu_cpu_number: could not determine mypanic: m8820x_cmmu_cpu_number: could not determine mypanic: m8820x_cmmu_cpu_number: could not determine my cpucpucpucpu numbernumbernumbernumber Stopped at 0x1a6d10: tb0 0x0, r0 ,0x84 RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb> trace stack base = 0x1b6b50 (0) 0x1a6d10(stackless) ← _Debugger() (1) 0x5f0d8(?, 4, 0, 0xf6cb1400, 0, 1, 1cfc84, 0) ← panic() (2) 0x19586c ← m8820x_cmmu_cpu_number() (3) 0x19e6d8 ← luna88k_bootstrap() (4) 0x200ec ← start_text() ddb> 「生意気にもpanic」 ((c)つついさん) リンク形式をOMAGICに変えて再トライ ROMルーチンの コンソール動く!
  21. 21. 21 ILLADDRESSの謎 • CMMU識別のため、faultになるアドレス (=ILLADDRESS)にアクセスしている /* access faulting address */ badaddr((vaddr_t)ILLADDRESSILLADDRESSILLADDRESSILLADDRESS, 4); /* check which CMMU is reporting the fault */ for (cmmu = 0; cmmu < max_cmmus; cmmu++) { : • CMU Machではこのようになってる • でも自分の環境ではfaultが起きないぞ!? #define ILLADDRESS 0x0F0000000x0F0000000x0F0000000x0F000000 /* any faulty address */
  22. 22. 22 2002年3月: ILLADDRESSの謎(解決) • いろいろと試したが分からない • ふとUniOS Machを⽴ち上げてヘッダファ イルを⾒てみると… • 実はLUNA-88K2ではILLADDRESSの値が 変更になっていた! : * HISTORY * $Log: board.h,v $ * Revision 1.5 92/09/24 10:51:14 moti * Change ILLADDRESS for LUNA88K2.Change ILLADDRESS for LUNA88K2.Change ILLADDRESS for LUNA88K2.Change ILLADDRESS for LUNA88K2. : #define ILLADDRESS 0x3FFFFFF00x3FFFFFF00x3FFFFFF00x3FFFFFF0 /* any faulty address */ 1ヶ月悩みました…
  23. 23. 23 コンパイラとの戦い(その1) • panic時のレジスタダンプを⾒ると、変な 値が入っているように思える • どうにも分からないので、オブジェクト ファイル(.o)を逆アセンブルしてみたら、 引数がずれているような気がする • コンパイラの最適化のバグ? • ‘-O’フラグをはずして対応
  24. 24. 24 コンパイラとの戦い(その2) • MIな関数に対して、引数がずれて渡され ているところがある • これもコンパイラのバグ? • アセンブラでwrapper関数を作り、無理 やり引数を合わせてリンク
  25. 25. 25 NFS bootへの道 • NFS bootのために、ネットワークI/Fのサ ポートが必要 • 使われているチップ: Am7990 (Lance) • OpenBSD/sun3の if_le.c を持ってきて いじる • 自MACアドレスの格納先がまだ発⾒でき ていないので、とりあえず決め打ち • 先頭アドレス以外のLanceレジスタのマッ プ先は、ROMモニタで⾒当をつける
  26. 26. 26 2002年6月5日: NFS boot動き始める 0>b sd(0,0,0) bsd Booting sd(0,0,0) bsd : (中略) OpenBSD 3.0-current (SMALL) #42: Wed Jun 5 20:58:15 JST 2002 aoyama@solaria:/sys/arch/luna88k/compile/SMALL OMRON LUNA-88K 33Mhz real mem = 50331648 avail mem = 40632320 (9920 pages) using 640 buffers containing 2621440 bytes of memory machdep.c: setupiackvectors() is not implemented. mainbus0 (root) clock0 at mainbus0: ds1397 le0 at mainbus0: address 00:00:0a:03:49:0900:00:0a:03:49:0900:00:0a:03:49:0900:00:0a:03:49:09 ←←←← 決め打ち決め打ち決め打ち決め打ち le0: 32 receive buffers, 8 transmit buffers boot device: <unknown> root device: le0 nfs_bootnfs_bootnfs_bootnfs_boot: using network interface 'le0': using network interface 'le0': using network interface 'le0': using network interface 'le0' nfs_bootnfs_bootnfs_bootnfs_boot:::: client_addrclient_addrclient_addrclient_addr=192.168.2.4=192.168.2.4=192.168.2.4=192.168.2.4 nfs_bootnfs_bootnfs_bootnfs_boot:::: server_addrserver_addrserver_addrserver_addr=192.168.2.1 hostname==192.168.2.1 hostname==192.168.2.1 hostname==192.168.2.1 hostname=aurora.nk.mcu.or.jpaurora.nk.mcu.or.jpaurora.nk.mcu.or.jpaurora.nk.mcu.or.jp root on xroad2:/usr/export/aurora/rootroot on xroad2:/usr/export/aurora/rootroot on xroad2:/usr/export/aurora/rootroot on xroad2:/usr/export/aurora/root
  27. 27. 27 2002年6月5日: NFS boot動き始める WARNING: clock lost 2227 days -- CHECK AND RESET THE DATE! swap on xroad2:/usr/export/aurora/root/swapswap on xroad2:/usr/export/aurora/root/swapswap on xroad2:/usr/export/aurora/root/swapswap on xroad2:/usr/export/aurora/root/swap Data access fault (Bus Error) v = 1ed868, frame eee07bd0 R00-05: 0x00000000 0x001fbafc 0x0059cff0 0x005a0ff0 0x00001000 0x00000000 R06-11: 0x00000000 0x00000000 0x005a0000 0x00000998 0x00000998 0x00000004 R12-17: 0x001ed850 0x00000004 0x00002e00 0x00000001 0x0000c400 0x04001000 R18-23: 0x00000000 0x40000000 0x00000000 0x00080000 0x00000000 0x026b3000 R24-29: 0x00229930 0x00254938 0x02000100 0x00000100 0x00000000 0x00000000 R30-31: 0xeee07cf0 0xeee07cd0 : (中略) panic: Data Access Exception Stopped at 0x203608: tb0 0x0, r0 ,0x84 RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb>
  28. 28. 28 ここまで来たけど… • 動くかどうか分からないマシンで、コン パイラのバグの可能性を念頭に対応して いくのは手間がかかりすぎる • OpenBSD/mvme88k側の進捗を待つ – この時期はコンパイラの問題で OpenBSD/mvme88kはリリースされていま せんでした • そして1年が過ぎた頃…
  29. 29. 29 2003年8月: コンパイラきたー! • 実際に動くかどうか分からないマシンで、 コンパイラのバグを1つずつ追っていくの は難しい • 半年ほど進めてきたが、公式treeに入って いるOpenBSD/mvme88kの進捗を待つこ とにする Changes by: miod@cvs.openbsd.org 2003/08/01 01:40:19 Modified files: gnu/egcs/gcc : config.gcc gnu/egcs/gcc/config/m88k: m88k.c m88k.h m88k.md openbsd.h gnu/usr.bin/binutils/gas: configure configure.in gnu/usr.bin/gas/config: tc-m88k.h Added files: gnu/egcs/gcc/config/m88k: t-openbsd Log message: A workingA workingA workingA working gccgccgccgcc 2.95/m88k compiler,2.95/m88k compiler,2.95/m88k compiler,2.95/m88k compiler, for some low standard value of working. Configuration settings mostly borrowed from the former gcc 2.8 configuration. A few typos and fixes backported from gcc 3.3, and a hell lot of fixes from my fingertips. This is enough to yield a compiler which will produce correct coThis is enough to yield a compiler which will produce correct coThis is enough to yield a compiler which will produce correct coThis is enough to yield a compiler which will produce correct code atde atde atde at ----O0.O0.O0.O0. Optimization is slightly broken for some constructs, and more fixes are in the pipeline. ok deraadt@ これで、最適化なしなら きちんとバイナリができ るようになりました
  30. 30. 30 2003年12月: サポートデバイス充実 • NetBSD/luna68kよりシリアルドライバを持っ てくる – 一部をコメントアウトしたらシングルユーザモード のシェルプロンプトが出た – 調⼦に乗ってCtrl-Dしたらマルチユーザで起動した! – キーボードもサポート • NetBSD/luna68kよりフレームバッファドライ バを持ってくる – ほぼそのまま使えた
  31. 31. 31 2004年1月〜2月: ラスボスはSCSI • 使われているチップ: 富士通 MB89352 – OpenBSDにはMIなドライバなし • OpenBSDのSCSIは古い形式なので、NetBSD の古いソースを持ってくる • データ化けに悩む • mvme88kのVM周りのMDな修正をluna88kに も適用したら動いた! • これでスタンドアローンで動くようになった!
  32. 32. 32 2004年3月: どうやって公開する? • 公開の方法を考えつつWebページ整理 当時の公式ページを まねて作ってました
  33. 33. 33 2004年3月21日: 偉い人に捕捉される • OpenBSD/mvme88kのport maintainer Miod Vallatさんからメールが来る • 「Webページを⾒てとても驚いた、ソー ス⾒せてほしい」 • (ディスククラッシュによりこのメールを なくしてしまいました…残念)
  34. 34. 34 2004年4月: developerになる • ソースを-currentベースにしてMiodさん に送付し、OpenBSDの流儀に直していた だく • 「port maintainerとしてOpenBSDの developerにならないか?」とのメール • 思わぬ展開に驚きつつ、やってみること にする • OpenBSDのアカウントができる – Theo様にメールするときはドキドキしました
  35. 35. 35 2004年4月21日: 本家にマージ Changes by: aoyama@cvs.openbsd.orgaoyama@cvs.openbsd.orgaoyama@cvs.openbsd.orgaoyama@cvs.openbsd.org 2004/04/21 09:24:15 Log message: Initial commit for OpenBSD/luna88k, based on OpenBSD/mvme88k, NeInitial commit for OpenBSD/luna88k, based on OpenBSD/mvme88k, NeInitial commit for OpenBSD/luna88k, based on OpenBSD/mvme88k, NeInitial commit for OpenBSD/luna88k, based on OpenBSD/mvme88k, NetBSD/luna68k and CMU MachtBSD/luna68k and CMU MachtBSD/luna68k and CMU MachtBSD/luna68k and CMU Mach. Status: Vendor Tag: AOYAMA Release Tags: LUNA88K_INIT N src/sys/arch/luna88k/conf/GENERIC N src/sys/arch/luna88k/conf/Makefile.luna88k N src/sys/arch/luna88k/conf/files.luna88k N src/sys/arch/luna88k/ddb/db_disasm.c N src/sys/arch/luna88k/ddb/db_interface.c N src/sys/arch/luna88k/ddb/db_sstep.c N src/sys/arch/luna88k/ddb/db_trace.c N src/sys/arch/luna88k/dev/if_le.c N src/sys/arch/luna88k/dev/lcd.c N src/sys/arch/luna88k/dev/lunafb.c N src/sys/arch/luna88k/dev/lunaws.c : :
  36. 36. 36 おまけ: BSD Magazineにも掲載 BSD Magazine No.20 (2004年6月発⾏) OpenBSD短信の一部
  37. 37. 37 その後… • リリースバイナリの作り方を調べたり • Manual pageを書いたり • 電源ユニット故障で4年間起動しなかったり • 各地からLUNAが届いたり • Xサーバやマルチプロセッサ対応をしたり • Cバス拡張ボードを動かしてみたり • OSCで展示・発表したり • して10年以上たちましたが、 その話はまたの機会に…
  38. 38. 38 まとめ: 移植に必要なこと(技術編) • コンパイラを含むtoolchainは最重要 – 自分で治せるならいいけど… • ハードウェアのあらゆる情報を集めよう – 純正OSのヘッダファイル – チップの仕様書 – ROMモニタ – objdump –d • ローカルでもバージョン管理システムを使おう – トライ&エラーの繰り返し – いつでも元に戻せるように
  39. 39. 39 まとめ: 移植に必要なこと(マインド編) • 分からなければ、時間をかけて勉強したらいい – 仕事じゃなくて趣味の開発だし – マイナーマシンなら誰も困らない!? • 文章で記録をつけよう – 文章で書いてみると自分も整理できる • ⾏き詰ったらほかの事をやってもいい – その間も頭はいろいろ考えている – ふとした瞬間に気がつく • 最後は「愛」と「執着心]かな
  40. 40. 40 謝辞 • 筒井さん – 「NetBSD/news68kへの道」有用でした – アドバイス&LUNAの電源修理 感謝します • 荒尾さん・蛯原さん・江富さん – LUNA-88Kを送付いただきました • Twitterでfavしていただける方 – 励みになります • 家族 – 怪しい趣味に対する理解に!
  41. 41. 41 Happy Hackingacking!

×