19
RetroBSDを 味見 2012/7/7 たけおか@たけおかラボ(株)/AXE takelab-BSD

retrobsd-2012-JUL-07 at JNUG BSD BoF

  • Upload
    -

  • View
    2.293

  • Download
    1

Embed Size (px)

Citation preview

RetroBSDを味見

2012/7/7たけおか@たけおかラボ(株)/AXE

takelab-BSD

RetroBSDとは● http://retrobsd.org/● 2.11BSDベース● MMU無しで動く

● PDP-11もマッパしか無かったな…– アドレス変換はあった。– デマンド・ページングは不能

● PIC32という1チップ・マイコンで動く● MIPSコア● 一応、組込みMIPSのメモリ・マッピング機構で、kernelは守って

いるらしい(未確認)● VirtualMIPSというシミュレータが同時に配られている

● PIC32プラットフォームをシミュレート

PIC32というマイコン● ROM,RAM,IO入りの1チップ・マイコン

● MIPS Core● 40MHz~80MHz● キャッシュ無し● 1.56~3 Dhrystone MIPS

● PIC32MX795● 128KBytes of RAM● 512KBytes of Flash ROM● 78 usable I/O pins● CPU runs at 80MHz● USB Bootloader● 80MHz (約3MIPS)

● 私は、別途、PIC32MX220に萌え中● 1.5Mips, ROM:32KB, RAM:8KB, USB I/F入り, ¥210円也

MAX32というマイコンボード● PIC32MX795F512を使用

● 共立の通販で¥5900円

● ホストとの接続&開発は、オンボードのUSBシリアルI/F。電源もUSBから取る

● それに、SDCardをつなぐ

● 4本しか要らない(それに電源 3.3V,GND)

● http://retrobsd.org/wiki/max32-board-2/ のとおりに接続

Max32 board Signal SD/MMC

9 D3 – /CS0 CS card0

10 D4 – /CS1 CS card1

16 TX2 F5 – SDO4 DI

3V3 +3.3V VCC

14 TX3 F13 – SCK4 CLK

GND GND GND

17 RX2 F4 – SDI4 DO

AREF A10 – LED0 Disk(Green)

12 A2 – LED1 kernel(Red)

13 A3 - LED2 UART

RetroBSD MAX32● Arduino用のSDCardシールドをつないだ

● Mega系には合わない(涙)よって長い配線

RetroBSD

RetroBSD 実行例2.11 BSD Unix for PIC32, revision 560M build 18:

     Compiled 2012­07­07 by take@gigant:

     /home/take/docs/retrobsd/src/retrobsd­read­only/sys/pic32/max32

cpu: 795F512L 80 MHz, bus 80 MHz

oscillator: XT crystal, PLL div 1:2 mult x20

console: port UART1

sd0: port SPI4, select pin D3

sd0: type I, size 975360 kbytes, speed 0 Mbit/sec

phys mem  = 128 kbytes

user mem  = 96 kbytes

root dev  = (0,0)

root size = 16384 kbytes

swap dev  = root, offset 65

swap size = 2048 kbytes

/dev/sd0: 294 files, 9550 used, 6769 free

Starting daemons: update 

*** 0x7f00e8f8: bus error

2.11 BSD UNIX (pic32) (console)

login: root

Password:

Welcome to RetroBSD!

erase, kill ^U, intr ^C

# ls

.profile    etc         init.core   lost+found  swap        var

bin         games       lib         sbin        tmp

dev         include     libexec     share       u

RetroBSD 実行例# ps aux

USER       PID NICE SZ TTY TIME COMMAND

root         0   0   3 ?   0:57 swapper

root         1   0  49 ?   0:06 init ­ 

root        10   0   7 ?   0:01 update 

root        11   0  56 co  0:12 ­sh 

root        14   0  54 co  0:02 ps aux 

# date

Fri Jul  6 18:06:09 PST 2012

# ls games

adventure    bcd          fish         ppt          worm

arithmetic   canfield     lib          primes       worms

backgammon   cfscores     morse        rain         wump

banner       factor       number       teachgammon

# morse ­s

cq

 daw dit daw dit,

 daw daw dit daw,

RetroBSD 実行例# nohup cat &

34

# ps auxSending output to 'nohup.out'

USER       PID NICE SZ TTY TIME COMMAND

root         0   0   3 ?   4:27 swapper

root         1   0  49 ?   0:06 init ­ 

root        10   0   7 ?   0:02 update 

root        11   0  56 co  0:48 ­sh 

root        34   5  31 co  0:03 cat 

root        35   0  54 co  0:02 ps aux 

# vmstat

­procs­ ­­­memory­­ ­­­­­disks­­­­­ ­­­faults­­­ ­­­­cpu­­­­

 r b w    avm   fre sd0 sd1 dk2 dk3   in  sy  cs  us  sy  id

 1 0 2 101460     0   1   0   0   0   21   1   0   0  15  85

# kill 34

34: No such process

# ps aux

USER       PID NICE SZ TTY TIME COMMAND

root         0   0   3 ?   4:51 swapper

root         1   0  49 ?   0:06 init ­ 

root        10   0   7 ?   0:02 update 

root        11   0  56 co  0:53 ­sh 

root        38   0  54 co  0:02 ps aux 

# vmstat

­procs­ ­­­memory­­ ­­­­­disks­­­­­ ­­­faults­­­ ­­­­cpu­­­­

 r b w    avm   fre sd0 sd1 dk2 dk3   in  sy  cs  us  sy  id

 0 0 3 123204     0   1   0   0   0    1   1   0   0  16  84

RetroBSD:オリジナル2.11BSDからの変更点 (1/2)

● http://retrobsd.googlecode.com/files/RetroBSD-BSD-Day-2011.pdf の一部を和訳

● struct textの削除。共有実行コードを持つほど内蔵メモリが無いので…

● 全システムデータ構造をwordサイズ・データ型に修正。

short, charはRISCで良いわけではない

● ブロック・サイズを512Bytesから 1Kbytesに増やした

● ファイルシステム構造を1KBytesブロック構造に変更

● 単一プロセス・ユーザ・メモリ・アロケーションを実装。

コア・メモリについてのmalloc/mfreeは無し。全割り当ては静的

RetroBSD:オリジナル2.11BSDからの変更点 (2/2)● setjmp/longjmpの実装。

二つのUエリアが割り当てられる:● 一つはswapper(プロセス0)

● もう一つは他のすべてのプロセス

● 切り替え(スイッチング)は、データをコピーすることによるlongjmpで実行される。

● rootファイル・システム上のファイルへのswapを実装。

● swapファイルは、mkfsで作られる、特別な連続領域。

● VirtualMIPSエンジン・ベースのPIC32シミュレータを実装。

● キークエスチョン: MMU無しでプロセス・スイッチが実現できるのか?

● Kernel stackは、Uエリアの一部。それは、固定アドレスにあり、割り込みハンドラによって使用される。しかし、新しいプロセスに切り替わる時、スタックは置き換えられなければならない。切り替えが発生したとき、ただ一ヶ所にあるなら、切り替えはlongjmp()ルーチンで実現できる。

4.3BSDでは、それはresume()と呼ばれる。

それは、先にセーブされたスレッドへの標準的なlongjmp()でのジャンプと非常に近い動きをする。

RetroBSD開発環境● ソース (svnチェックアウトして得る)

svn checkout http://retrobsd.googlecode.com/svn/trunk/ retrobsd­read­only

● コンパイラ (うう、Linux版…すみません)

https://github.com/downloads/jasonkajita/chipKIT­cxx/pic32­tools­chipKIT­cxx­master­Linux32­image­20120614.zip

● MAX32へのkernelの書き込みツール

https://github.com/chipKIT32/chipKIT32­MAX/downloads

中の avrdude。(コンパイラなども含まれているが、使わない)

RetroBSDのmake●   target.mkを合わせる

GCCPREFIX   = /opt/pic32­tools/bin/pic32­

● Makefileの TARGETを合わせる(もともとMAX32になってた)

# Select target board

TARGET          ?= $(MAX32)

● filesys.imgがトップ・ディレクトリにできる

# dd if=filesys.img of=/dev/sdb conv=sync

● Kernelは sys/pic32/max32/unix.* にできる(いいね!)

kernelのMAX32への書き込みAVRTOOLS=/opt/mpide­0023­linux32­20111221/hardware/tools/

$AVRTOOLS/avrdude ­C $AVRTOOLS/avrdude.conf ­c stk500v2 ­p pic32 \

        ­P /dev/ttyUSB0 ­b 115200 ­v \

        ­U flash:w:unix.hex:i

● (このツールのバイナリが64bit Linuxだと、うまく動かず

自分で、makeしないといけませんね。ん、Linuxだと!?)

たけおかのやったこと● SDCardのアクセスが速すぎた

● オリジナルは、13Mbps

● SDCardの配線が超いい加減

● 13Mbpsとかで動くはず無い。実際、無理

● 0.3Mbpsで動く (SDCardの配線をちゃんとすれば、43倍速くなる)

● sys/pic32/sd.c 中の値を (0.3)に変更

#define SD_MHZ          (0.3)● 定数計算式中に、小数点が出るが、コンパイルが終了したら整数

● それだけで、動くようになった

● 今日のデモは遅いのですが、SDCardが遅い

● 基本、SDCardへのswapで動作している

● VirtualMIPSでは、動かせてない

● ま、実機優先で

RetroBSD● Kernelバイナリ 約130KBytes

● ROMはまだまだ余裕 (512KBもある)● kernelが太っても大丈夫

● コマンドは、SDCard● 今は2GB以下(であろう)

● Swapしてます

● 全executable● stickしないし、コード共有しないし…

– これは直しにくそう

俺的、まとめ (1/2)● 2.11BSDって、TCP/IP動いてた

● IPv4だけどね● PIC32に入れてみた人も居る

– EtherNICも、Arduino用SPI I/Fがある●4本線+電源でつながる

● PICなBSD。安くて、小さくて楽しい

俺的、まとめ (2/2)● もうuCLinuxなんか要らない\(^^)/

● 弊社は、世界で最もuCLinuxのCPUポーティングを行ったサイトだが…

● UNIX系OSの拡大には寄与した● でも、「Linuxナニソレ」● インターフェース編集部に教えてあげないと

なぁ

● Linuxは疲れるんで、日本企業にはRetroBSDで押す

おしまい

takelab-BSD