41
一回 カーネル/VM探隊@古 BSD昔ばなし OpenBSD/luna88k 移植語 Nagoya *BSD Users' Group Kenji Aoyama / ⻘⼭ Twitter: @ao_kenji port maintainerになるまで編

A story of porting OpenBSD/luna88k

Embed Size (px)

Citation preview

Page 1: A story of porting OpenBSD/luna88k

第一回 カーネル/VM探検隊@名古屋

BSD昔ばなし

OpenBSD/luna88k移植物語

Nagoya *BSD Users' GroupKenji Aoyama / ⻘⼭ 健治

Twitter: @ao_kenji

〜 port maintainerになるまで編 〜

Page 2: A story of porting OpenBSD/luna88k

2

自己紹介(1)

• ⻘⼭ 健治 / あおやま けんじ– 本業: 電機メーカ勤務

業務プロセス改善を企画するスタッフ

• パソコン歴– MZ-2000– X68000XVI– PC-AT

画像出典: http://www.itoi.jp/time31.html ・SHARP GALAPAGOS STORE より

MZ, Xはソフトが少ないのがあたりまえの機種→「なければ自分で何とかする!」という文化に染まる

Page 3: A story of porting OpenBSD/luna88k

3

自己紹介(2)

• UNIX歴– Sun3 / SunOS 4.0.x ぐらいから?– FreeBSD → NetBSD → OpenBSD

• OpenBSD/luna88k port maintainer– 2004年〜

↑今日は、ここに至るまでのお話です

Page 4: A story of porting OpenBSD/luna88k

4

LUNAとは?

• LUNAシリーズ– オムロン株式会社が1980年代後半〜90年代

初めに販売していたワークステーション• LUNA, LUNA-II

– CPU:モトローラ68030/68040(m68k)– NetBSD/luna68kが動きます

• LUNA-88K, LUNA-88K2 – CPU:モトローラ88100(m88k) MP対応– OpenBSD/luna88kが動きます

⾒かけたら保護を!

Page 5: A story of porting OpenBSD/luna88k

5

LUNA-88K2:こんなマシンです

前面の液晶パネル

個々のCPU動作状況が分かる

LEDマルチプロセッサ対応

比較的コンパクトな筐体

(家庭にもおけます)

CPU動作状況が分かる電源ボタン

Cバススロット(88K2のみ)

Page 6: A story of porting OpenBSD/luna88k

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ページより(現在もこのまま)

Page 7: A story of porting OpenBSD/luna88k

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でテストしまっせ!

Page 8: A story of porting OpenBSD/luna88k

8

2001年秋: 無謀な挑戦!?

• あまり進展がないので、最近の*BSDを自分で動かしてやろうかと思い始める

• まずはCPUのマニュアルを探す

• 12月にオーストラリアの古本屋のWebページで発⾒ → 購入

この本を⾒つけてしまったのが運命の分かれ道(^_^)

Page 9: A story of porting OpenBSD/luna88k

9

m88kとは?

• モトローラがm68kの後継として開発したRISCプロセッサ

• マルチプロセッサ構成を念頭に置いた設計• 開発の遅れ、モトローラの戦略変更(PowerPC

への注⼒)などから、採用機種は非常に少ない– モトローラ MVMEシリーズ– データゼネラル AViiONシリーズ– オムロン LUNA-88Kシリーズ など

• 「CPU⿊歴史」で紹介されています

Page 10: A story of porting OpenBSD/luna88k

10

m88k(MC88100)のレジスタ構成

General Purpose Registers (32bit x 32)

出典:MC88100 User’s Manual (Motorola)

Page 11: A story of porting OpenBSD/luna88k

11

m88k(MC88100)の汎用レジスタ

32bit 汎用レジスタ 32本

r0: 0固定r1: 関数からの戻り場所

r2〜r9: 関数の引数

出典:MC88100 User’s Manual (Motorola)

r30: フレームポインタr31: スタックポインタ

Page 12: A story of porting OpenBSD/luna88k

12

偉大な先達:つついさん記録でイメトレ

http://www.ceres.dti.ne.jp/tsutsui/netbsd/port-news68k.html

15年ほど前からお名前は存じ上げていましたが、先週のOSC 2015 関⻄@京都で初めてお会いしました。

Page 13: A story of porting OpenBSD/luna88k

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

ソース公開

ソース公開

Page 14: A story of porting OpenBSD/luna88k

14

OpenBSDとは?

• 日本語版Webページより:– OpenBSD プロジェクトでは、フリーでマル

チプラットホーム対応の 4.4BSD ベースのUNIX 系 OS を提供しています。

– 私たちのプロジェクトが特に⼒を入れているのは、 移植性、標準化、正当性、積極的なセキュリティそして暗号機能の統合です。

http://www.openbsd.org/

Page 15: A story of porting OpenBSD/luna88k

15

必要なもの(1): クロスコンパイラ

• OpenBSDにはクロス開発環境がある– NetBSDほどは整備されていないようだがH

• SPARCstation LXにm88kのクロス開発環境構築– microSPARC@50MHz– i386ではうまくいかなかった

• バイトオーダ違いのため?

Page 16: A story of porting OpenBSD/luna88k

16

必要なもの(2): カーネル起動方法

• Machのカーネル ‘vmunix’ は普通のa.out フォーマット

• 元々入っているUniOS Machの a パーティションにa.out 形式のバイナリを置けばROMモニタから起動できそう

• デバッグシンボルは特別扱いしているようだが、とりあえず後回し– 結局、native boot loaderになるまでシンボ

ルは使えませんでした

Page 17: A story of porting OpenBSD/luna88k

17

必要なもの(3): ハードウェア情報

• CPU– ユーザーズマニュアル(本)

• デバイス– CMU Machのソース– NetBSD/luna68kのソース

• とりあえずこれだけあればなんとかなる!?

Page 18: A story of porting OpenBSD/luna88k

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

:

• カーネル起動はこの方法でできそう

Page 19: A story of porting OpenBSD/luna88k

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のカーネル名

Page 20: A story of porting OpenBSD/luna88k

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ルーチンのコンソール動く!

Page 21: A story of porting OpenBSD/luna88k

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 */

Page 22: A story of porting OpenBSD/luna88k

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ヶ月悩みました…

Page 23: A story of porting OpenBSD/luna88k

23

コンパイラとの戦い(その1)

• panic時のレジスタダンプを⾒ると、変な値が入っているように思える

• どうにも分からないので、オブジェクトファイル(.o)を逆アセンブルしてみたら、引数がずれているような気がする

• コンパイラの最適化のバグ?• ‘-O’フラグをはずして対応

Page 24: A story of porting OpenBSD/luna88k

24

コンパイラとの戦い(その2)

• MIな関数に対して、引数がずれて渡されているところがある

• これもコンパイラのバグ?• アセンブラでwrapper関数を作り、無理

やり引数を合わせてリンク

Page 25: A story of porting OpenBSD/luna88k

25

NFS bootへの道

• NFS bootのために、ネットワークI/Fのサポートが必要

• 使われているチップ: Am7990 (Lance)• OpenBSD/sun3の if_le.c を持ってきて

いじる• 自MACアドレスの格納先がまだ発⾒でき

ていないので、とりあえず決め打ち• 先頭アドレス以外のLanceレジスタのマッ

プ先は、ROMモニタで⾒当をつける

Page 26: A story of porting OpenBSD/luna88k

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

Page 27: A story of porting OpenBSD/luna88k

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>

Page 28: A story of porting OpenBSD/luna88k

28

ここまで来たけど…

• 動くかどうか分からないマシンで、コンパイラのバグの可能性を念頭に対応していくのは手間がかかりすぎる

• OpenBSD/mvme88k側の進捗を待つ– この時期はコンパイラの問題で

OpenBSD/mvme88kはリリースされていませんでした

• そして1年が過ぎた頃…

Page 29: A story of porting OpenBSD/luna88k

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@

これで、最適化なしならきちんとバイナリができ

るようになりました

Page 30: A story of porting OpenBSD/luna88k

30

2003年12月: サポートデバイス充実

• NetBSD/luna68kよりシリアルドライバを持ってくる– 一部をコメントアウトしたらシングルユーザモード

のシェルプロンプトが出た– 調⼦に乗ってCtrl-Dしたらマルチユーザで起動した!– キーボードもサポート

• NetBSD/luna68kよりフレームバッファドライバを持ってくる– ほぼそのまま使えた

Page 31: A story of porting OpenBSD/luna88k

31

2004年1月〜2月: ラスボスはSCSI

• 使われているチップ: 富士通 MB89352– OpenBSDにはMIなドライバなし

• OpenBSDのSCSIは古い形式なので、NetBSDの古いソースを持ってくる

• データ化けに悩む• mvme88kのVM周りのMDな修正をluna88kに

も適用したら動いた!

• これでスタンドアローンで動くようになった!

Page 32: A story of porting OpenBSD/luna88k

32

2004年3月: どうやって公開する?

• 公開の方法を考えつつWebページ整理

当時の公式ページをまねて作ってました

Page 33: A story of porting OpenBSD/luna88k

33

2004年3月21日: 偉い人に捕捉される

• OpenBSD/mvme88kのport maintainer Miod Vallatさんからメールが来る

• 「Webページを⾒てとても驚いた、ソース⾒せてほしい」

• (ディスククラッシュによりこのメールをなくしてしまいました…残念)

Page 34: A story of porting OpenBSD/luna88k

34

2004年4月: developerになる

• ソースを-currentベースにしてMiodさんに送付し、OpenBSDの流儀に直していただく

• 「port maintainerとしてOpenBSDのdeveloperにならないか?」とのメール

• 思わぬ展開に驚きつつ、やってみることにする

• OpenBSDのアカウントができる– Theo様にメールするときはドキドキしました

Page 35: A story of porting OpenBSD/luna88k

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

::

Page 36: A story of porting OpenBSD/luna88k

36

おまけ: BSD Magazineにも掲載

BSD Magazine No.20(2004年6月発⾏)

OpenBSD短信の一部

Page 37: A story of porting OpenBSD/luna88k

37

その後…

• リリースバイナリの作り方を調べたり• Manual pageを書いたり• 電源ユニット故障で4年間起動しなかったり• 各地からLUNAが届いたり• Xサーバやマルチプロセッサ対応をしたり• Cバス拡張ボードを動かしてみたり• OSCで展示・発表したり

• して10年以上たちましたが、その話はまたの機会に…

Page 38: A story of porting OpenBSD/luna88k

38

まとめ: 移植に必要なこと(技術編)

• コンパイラを含むtoolchainは最重要– 自分で治せるならいいけど…

• ハードウェアのあらゆる情報を集めよう– 純正OSのヘッダファイル– チップの仕様書– ROMモニタ– objdump –d

• ローカルでもバージョン管理システムを使おう– トライ&エラーの繰り返し– いつでも元に戻せるように

Page 39: A story of porting OpenBSD/luna88k

39

まとめ: 移植に必要なこと(マインド編)

• 分からなければ、時間をかけて勉強したらいい– 仕事じゃなくて趣味の開発だし– マイナーマシンなら誰も困らない!?

• 文章で記録をつけよう– 文章で書いてみると自分も整理できる

• ⾏き詰ったらほかの事をやってもいい– その間も頭はいろいろ考えている– ふとした瞬間に気がつく

• 最後は「愛」と「執着心]かな

Page 40: A story of porting OpenBSD/luna88k

40

謝辞

• 筒井さん– 「NetBSD/news68kへの道」有用でした– アドバイス&LUNAの電源修理 感謝します

• 荒尾さん・蛯原さん・江富さん– LUNA-88Kを送付いただきました

• Twitterでfavしていただける方– 励みになります

• 家族– 怪しい趣味に対する理解に!

Page 41: A story of porting OpenBSD/luna88k

41

Happy Hackingacking!