A story of porting OpenBSD/luna88k
-
Upload
kenji-aoyama -
Category
Software
-
view
398 -
download
7
Transcript of A story of porting OpenBSD/luna88k
第一回 カーネル/VM探検隊@名古屋
BSD昔ばなし
OpenBSD/luna88k移植物語
Nagoya *BSD Users' GroupKenji Aoyama / ⻘⼭ 健治
Twitter: @ao_kenji
〜 port maintainerになるまで編 〜
2
自己紹介(1)
• ⻘⼭ 健治 / あおやま けんじ– 本業: 電機メーカ勤務
業務プロセス改善を企画するスタッフ
• パソコン歴– MZ-2000– X68000XVI– PC-AT
画像出典: http://www.itoi.jp/time31.html ・SHARP GALAPAGOS STORE より
MZ, Xはソフトが少ないのがあたりまえの機種→「なければ自分で何とかする!」という文化に染まる
3
自己紹介(2)
• UNIX歴– Sun3 / SunOS 4.0.x ぐらいから?– FreeBSD → NetBSD → OpenBSD
• OpenBSD/luna88k port maintainer– 2004年〜
↑今日は、ここに至るまでのお話です
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
LUNA-88K2:こんなマシンです
前面の液晶パネル
個々のCPU動作状況が分かる
LEDマルチプロセッサ対応
比較的コンパクトな筐体
(家庭にもおけます)
CPU動作状況が分かる電源ボタン
Cバススロット(88K2のみ)
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
2001年5月: port-m88k にアピールSubject: LUNA-88K2
To: None <[email protected]>
From: Kenji Aoyama <[email protected]>
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
2001年秋: 無謀な挑戦!?
• あまり進展がないので、最近の*BSDを自分で動かしてやろうかと思い始める
• まずはCPUのマニュアルを探す
• 12月にオーストラリアの古本屋のWebページで発⾒ → 購入
この本を⾒つけてしまったのが運命の分かれ道(^_^)
9
m88kとは?
• モトローラがm68kの後継として開発したRISCプロセッサ
• マルチプロセッサ構成を念頭に置いた設計• 開発の遅れ、モトローラの戦略変更(PowerPC
への注⼒)などから、採用機種は非常に少ない– モトローラ MVMEシリーズ– データゼネラル AViiONシリーズ– オムロン LUNA-88Kシリーズ など
• 「CPU⿊歴史」で紹介されています
10
m88k(MC88100)のレジスタ構成
General Purpose Registers (32bit x 32)
出典:MC88100 User’s Manual (Motorola)
11
m88k(MC88100)の汎用レジスタ
32bit 汎用レジスタ 32本
r0: 0固定r1: 関数からの戻り場所
r2〜r9: 関数の引数
出典:MC88100 User’s Manual (Motorola)
r30: フレームポインタr31: スタックポインタ
12
偉大な先達:つついさん記録でイメトレ
http://www.ceres.dti.ne.jp/tsutsui/netbsd/port-news68k.html
15年ほど前からお名前は存じ上げていましたが、先週のOSC 2015 関⻄@京都で初めてお会いしました。
13
どのOSを狙う?
• MVME 88Kで動いているOpenBSDをターゲットにする– 他にm88kがサポートされている*BSDはない– 大元はCMU Mach/luna88kなのでなんとかなる?
CMU Mach/luna88k
OpenBSD/mvme88k
OpenBSD/luna88kUniOS Mach
ソース非公開
LUNA-88K LUNA-88K
LUNA-88K2
MVME 88K
ソース公開
ソース公開
14
OpenBSDとは?
• 日本語版Webページより:– OpenBSD プロジェクトでは、フリーでマル
チプラットホーム対応の 4.4BSD ベースのUNIX 系 OS を提供しています。
– 私たちのプロジェクトが特に⼒を入れているのは、 移植性、標準化、正当性、積極的なセキュリティそして暗号機能の統合です。
http://www.openbsd.org/
15
必要なもの(1): クロスコンパイラ
• OpenBSDにはクロス開発環境がある– NetBSDほどは整備されていないようだがH
• SPARCstation LXにm88kのクロス開発環境構築– microSPARC@50MHz– i386ではうまくいかなかった
• バイトオーダ違いのため?
16
必要なもの(2): カーネル起動方法
• Machのカーネル ‘vmunix’ は普通のa.out フォーマット
• 元々入っているUniOS Machの a パーティションにa.out 形式のバイナリを置けばROMモニタから起動できそう
• デバッグシンボルは特別扱いしているようだが、とりあえず後回し– 結局、native boot loaderになるまでシンボ
ルは使えませんでした
17
必要なもの(3): ハードウェア情報
• CPU– ユーザーズマニュアル(本)
• デバイス– CMU Machのソース– NetBSD/luna68kのソース
• とりあえずこれだけあればなんとかなる!?
18
2001年2月3日: 起動&文字出⼒テスト
• 自作プログラムを起動– アセンブラの練習も兼ねる– CMU Machのソースを元に– シリアル出⼒ルーチンで1文字表示
(C) Copyright Omron Corporation 1989, 1990, 1991, 1992ROM Version 1.37, 48 Megabytes RAM, 4 CPUsMemory Check: 3Port passed, main skipped.ROM Monitor0>b sd(0,0,0) mykernelBooting sd(0,0,0) mykernelAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
:
• カーネル起動はこの方法でできそう
19
2001年2月23日: 自前カーネル作成
• mvme88kのソースを元に、コメントアウトやスタブを駆使してカーネルをリンク
(C) Copyright Omron Corporation 1989, 1990, 1991, 1992ROM Version 1.37, 48 Megabytes RAM, 4 CPUsMemory Check: 3Port passed, main skipped.ROM Monitor0>0>0>b sd(0,0,0) bsdBooting sd(0,0,0) bsdsection # error[267]section # error[267]section # error[267]section # error[267]Boot failure ..Boot failure ..Boot failure ..Boot failure ..0>
• 起動しない!?→リンク形式(MAGIC)問題?– つついさん記録にも似たようなことが…
OpenBSDのカーネル名
20
(C) Copyright Omron Corporation 1989, 1990, 1991, 1992ROM Version 1.37, 48 Megabytes RAM, 4 CPUsMemory Check: 3Port passed, main skipped.ROM Monitor0>b sd(0,0,0) bsdBooting sd(0,0,0) bsdLUNA-88K: 4 CPUs 8 CMMUsCPU0 is attached with 2 MC88200 CMMUsCPU1 is attached with 2 MC88200 CMMUsCPU2 is attached with 2 MC88200 CMMUsCPU3 is attached with 2 MC88200 CMMUspanic: m8820x_cmmu_cpu_number: could not determine my panic: m8820x_cmmu_cpu_number: could not determine my panic: m8820x_cmmu_cpu_number: could not determine my panic: m8820x_cmmu_cpu_number: could not determine my cpucpucpucpu numbernumbernumbernumberStopped at 0x1a6d10: tb0 0x0, r0 ,0x84RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC!DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION!ddb> tracestack 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
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
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
コンパイラとの戦い(その1)
• panic時のレジスタダンプを⾒ると、変な値が入っているように思える
• どうにも分からないので、オブジェクトファイル(.o)を逆アセンブルしてみたら、引数がずれているような気がする
• コンパイラの最適化のバグ?• ‘-O’フラグをはずして対応
24
コンパイラとの戦い(その2)
• MIな関数に対して、引数がずれて渡されているところがある
• これもコンパイラのバグ?• アセンブラでwrapper関数を作り、無理
やり引数を合わせてリンク
25
NFS bootへの道
• NFS bootのために、ネットワークI/Fのサポートが必要
• 使われているチップ: Am7990 (Lance)• OpenBSD/sun3の if_le.c を持ってきて
いじる• 自MACアドレスの格納先がまだ発⾒でき
ていないので、とりあえず決め打ち• 先頭アドレス以外のLanceレジスタのマッ
プ先は、ROMモニタで⾒当をつける
26
2002年6月5日: NFS boot動き始める0>b sd(0,0,0) bsdBooting 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 33Mhzreal mem = 50331648avail mem = 40632320 (9920 pages)using 640 buffers containing 2621440 bytes of memorymachdep.c: setupiackvectors() is not implemented.mainbus0 (root)clock0 at mainbus0: ds1397le0 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 buffersboot device: <unknown>root device: le0nfs_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.4nfs_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.jproot 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
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 eee07bd0R00-05: 0x00000000 0x001fbafc 0x0059cff0 0x005a0ff0 0x00001000 0x00000000R06-11: 0x00000000 0x00000000 0x005a0000 0x00000998 0x00000998 0x00000004R12-17: 0x001ed850 0x00000004 0x00002e00 0x00000001 0x0000c400 0x04001000R18-23: 0x00000000 0x40000000 0x00000000 0x00080000 0x00000000 0x026b3000R24-29: 0x00229930 0x00254938 0x02000100 0x00000100 0x00000000 0x00000000R30-31: 0xeee07cf0 0xeee07cd0
: (中略)panic: Data Access ExceptionStopped at 0x203608: tb0 0x0, r0 ,0x84RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC!DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION!ddb>
28
ここまで来たけど…
• 動くかどうか分からないマシンで、コンパイラのバグの可能性を念頭に対応していくのは手間がかかりすぎる
• OpenBSD/mvme88k側の進捗を待つ– この時期はコンパイラの問題で
OpenBSD/mvme88kはリリースされていませんでした
• そして1年が過ぎた頃…
29
2003年8月: コンパイラきたー!
• 実際に動くかどうか分からないマシンで、コンパイラのバグを1つずつ追っていくのは難しい
• 半年ほど進めてきたが、公式treeに入っているOpenBSD/mvme88kの進捗を待つことにする
Changes by: [email protected] 2003/08/01 01:40:19
Modified files:gnu/egcs/gcc : config.gccgnu/egcs/gcc/config/m88k: m88k.c m88k.h m88k.md openbsd.hgnu/usr.bin/binutils/gas: configure configure.ingnu/usr.bin/gas/config: tc-m88k.h
Added files:gnu/egcs/gcc/config/m88k: t-openbsd
Log message:A working A working A working A 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 frommy 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 at de at de at de at ----O0.O0.O0.O0.Optimization is slightly broken for some constructs, and more fixes are inthe pipeline.
ok deraadt@
これで、最適化なしならきちんとバイナリができ
るようになりました
30
2003年12月: サポートデバイス充実
• NetBSD/luna68kよりシリアルドライバを持ってくる– 一部をコメントアウトしたらシングルユーザモード
のシェルプロンプトが出た– 調⼦に乗ってCtrl-Dしたらマルチユーザで起動した!– キーボードもサポート
• NetBSD/luna68kよりフレームバッファドライバを持ってくる– ほぼそのまま使えた
31
2004年1月〜2月: ラスボスはSCSI
• 使われているチップ: 富士通 MB89352– OpenBSDにはMIなドライバなし
• OpenBSDのSCSIは古い形式なので、NetBSDの古いソースを持ってくる
• データ化けに悩む• mvme88kのVM周りのMDな修正をluna88kに
も適用したら動いた!
• これでスタンドアローンで動くようになった!
32
2004年3月: どうやって公開する?
• 公開の方法を考えつつWebページ整理
当時の公式ページをまねて作ってました
33
2004年3月21日: 偉い人に捕捉される
• OpenBSD/mvme88kのport maintainer Miod Vallatさんからメールが来る
• 「Webページを⾒てとても驚いた、ソース⾒せてほしい」
• (ディスククラッシュによりこのメールをなくしてしまいました…残念)
34
2004年4月: developerになる
• ソースを-currentベースにしてMiodさんに送付し、OpenBSDの流儀に直していただく
• 「port maintainerとしてOpenBSDのdeveloperにならないか?」とのメール
• 思わぬ展開に驚きつつ、やってみることにする
• OpenBSDのアカウントができる– Theo様にメールするときはドキドキしました
35
2004年4月21日: 本家にマージChanges by: [email protected]@[email protected]@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: AOYAMARelease Tags: LUNA88K_INIT
N src/sys/arch/luna88k/conf/GENERICN src/sys/arch/luna88k/conf/Makefile.luna88kN src/sys/arch/luna88k/conf/files.luna88kN src/sys/arch/luna88k/ddb/db_disasm.cN src/sys/arch/luna88k/ddb/db_interface.cN src/sys/arch/luna88k/ddb/db_sstep.cN src/sys/arch/luna88k/ddb/db_trace.cN src/sys/arch/luna88k/dev/if_le.cN src/sys/arch/luna88k/dev/lcd.cN src/sys/arch/luna88k/dev/lunafb.cN src/sys/arch/luna88k/dev/lunaws.c
::
36
おまけ: BSD Magazineにも掲載
BSD Magazine No.20(2004年6月発⾏)
OpenBSD短信の一部
37
その後…
• リリースバイナリの作り方を調べたり• Manual pageを書いたり• 電源ユニット故障で4年間起動しなかったり• 各地からLUNAが届いたり• Xサーバやマルチプロセッサ対応をしたり• Cバス拡張ボードを動かしてみたり• OSCで展示・発表したり
• して10年以上たちましたが、その話はまたの機会に…
38
まとめ: 移植に必要なこと(技術編)
• コンパイラを含むtoolchainは最重要– 自分で治せるならいいけど…
• ハードウェアのあらゆる情報を集めよう– 純正OSのヘッダファイル– チップの仕様書– ROMモニタ– objdump –d
• ローカルでもバージョン管理システムを使おう– トライ&エラーの繰り返し– いつでも元に戻せるように
39
まとめ: 移植に必要なこと(マインド編)
• 分からなければ、時間をかけて勉強したらいい– 仕事じゃなくて趣味の開発だし– マイナーマシンなら誰も困らない!?
• 文章で記録をつけよう– 文章で書いてみると自分も整理できる
• ⾏き詰ったらほかの事をやってもいい– その間も頭はいろいろ考えている– ふとした瞬間に気がつく
• 最後は「愛」と「執着心]かな
40
謝辞
• 筒井さん– 「NetBSD/news68kへの道」有用でした– アドバイス&LUNAの電源修理 感謝します
• 荒尾さん・蛯原さん・江富さん– LUNA-88Kを送付いただきました
• Twitterでfavしていただける方– 励みになります
• 家族– 怪しい趣味に対する理解に!
41
Happy Hackingacking!