Upload
-
View
2.293
Download
1
Embed Size (px)
Citation preview
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 実行例2.11 BSD Unix for PIC32, revision 560M build 18:
Compiled 20120707 by take@gigant:
/home/take/docs/retrobsd/src/retrobsdreadonly/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/ retrobsdreadonly
● コンパイラ (うう、Linux版…すみません)
https://github.com/downloads/jasonkajita/chipKITcxx/pic32toolschipKITcxxmasterLinux32image20120614.zip
● MAX32へのkernelの書き込みツール
https://github.com/chipKIT32/chipKIT32MAX/downloads
中の avrdude。(コンパイラなども含まれているが、使わない)
RetroBSDのmake● target.mkを合わせる
GCCPREFIX = /opt/pic32tools/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/mpide0023linux3220111221/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で押す