たけおか ぼちぼち日記

思いついたらメモ


テーマ:

RetroBSD (http://retrobsd.org/)というBSDがある。
PIC32というワンチップマイコンで、2.11BSDが動く

PIC32は、MIPSコアだが、MMUもキャッシュも無い。
たけおか ぼちぼち日記-RetroBSD running



2.11 BSDというのは、PDP11で動いていたBSDの最終版だ。
4.2BSDは、仮想記憶とTCP/IPが動作した。4.2BSDを動かす代表的なハードウェアは、VAX11だ。
VAX11で 4BSDが開発された時、PDP11のBSDにもTCP/IPが実現された。
2.11BSDは、TCP/IPを備え、rシリーズコマンド(rlogin, rcp, rshなど)が動作した。
(ssh, scpは、rsh, rcpを真似して、電文が暗号化されたものだ)

PDP11は、AT&T ベル研で、近代的なUNIXが最初に開発されたマシンだ。

PDP11は、16bit マシンで、論理空間は64KBytes。
PDP11の上位機種は実記憶(実メモリ)は4MBytes搭載できた。
メモリのマッパを備えており、ページ単位で論理ページを、任意の物理メモリにマッピングできた。
しかし、ページ不在(ページ・フォールト)などを検出する機構は無く、デマンド・ページングを行うことはできない。
PDP11のUNIX(AT&T UNIX SystemIII, UNIX Ver.7、2BSD)では、実メモリに余裕がある間は、複数のプロセスは、なるべく実メモリに置かれる。
実メモリが足りなくなると、プロセスのメモリの内容は、ハード・ディスク上のスワップ領域に書き出され(スワップ・アウト)され、空いた実メモリに、別のプロセスがロードされる。

仮想記憶の無いUNIXでも、テキスト(プログラム・コード)は、マッパを使用して、複数のプロセスで共有される。
また、この頃のUNIXでは、実行イメージ・ファイルに、sticky bit(ファイル・モードの1000(八進))がセットされていると、
テキストが、スワップ領域に張り付いて、そのコマンドの再起動が高速になった。



PIC32は、マッパも無い。
したがって、実メモリに複数のプロセスを共存させることは難しい。
(不可能ではないが、ツールやローダなどの整備が非常に手間を食う)

RetroBSDでは、なんと、プロセスは、一時には、一つのプロセスしか実メモリに居られない。
(厳密には、swapperという特別なプロセスが、実メモリ上に常駐&同居している)

RetroBSDでは、全アプリケーションは、すべて同じ開始アドレスでリンクされている(これは、現在のUNIXでも普通)。
PIC32には、マッパが無いので、当然に、実メモリには、1つのプロセスしか居られない。

あるプロセスがアクティブになる(走行する)時には、今、実メモリ上に居るプロセスが、
スワップ領域に書き出され、その後、アクティブになるプロセスが実メモリに読み込まれる。
その後、longjmp()と同様のメカニズムによって、プロセスが再開される。


例えば、shellから、lsを実行する場合、shellがスワップに書き出され、それからlsが読み込まれ、
コマンドを実行し、それが終了したら、また、shellがスワップから読み込まれ、再開される。

マルチ・タスクで、並列(並行)にプロセスが実行される時にも、プロセス・スイッチの度に、
スワップ・アウトとスワップ・インが行われる。

スワップ・アウト/スワップ・インは特別な常駐プロセス swapper の仕事である。

また、RetroBSDの実行形式は a.out である。
クロス開発環境で、elf2aoutコマンドによって、elf形式を、a.outに変換している。

テキストがスワップに張り付く機能は無くされた。(sticky bitによる指定は無効)



RetroBSDが動くハードウェアはいくつかある
RetroBSDのサポートするHardware

  • UBW32 board by Sparkfun
  • MAX32 board by Digilent
  • Multimedia board for PIC32MX7 by MikroElektronika
  • Maximite Computer by Dontronics
  • DuinoMite Mega Computer by Olimex
  • Bare Metal – a chip and nothing else


僕は
Digilent社の ChipKit MAX32
を買った。
MAX32は、大阪日本橋の共立電子が、¥5900円で通信販売している。
通信販売ページ
国際宅配便の送料を考えると、共立から買うのも悪くないであろう。

たけおか ぼちぼち日記-Chipkit MAX32

MAX32には、PIC32MX795F512というワンチップマイコンが載っている。
PIC32MX795F512は、
オンチップROM: 512KBytes
オンチップRAM: 128KBytes

CPU内部のクロック周波数は80MHzで、約3 Dhrystone MIPSの実行速度だと言われている。

MAX32には、USB-シリアル変換のFT232RQが載っており、
また、Arduino Mega(AVRを使用したマイコン・ボード)とピン互換になっている。

MAX32を買うと、bootloaderなるものが仕込まれており、特別な治具無しで、
PCにUSBケーブルで接続し、ソフトウェアのツールだけで、ROMの書き換えができる。




SDCardを読み書きするために、SDCardのコネクタ(スロット)を、MAX32につなぐ必要がある。
SDCardは、I2Cに接続され、13Mbpsの速度で読み書きされる。
信号線は4本、電源2本なので、簡単な工作である。
僕は、秋月の
「SDカードスロットDIP化モジュール」通販コード K-05818
を買ってきて配線した。

SDCardは、スワップ領域と、ファイル・システムである。UNIXコマンドは、SDCardに収められる。

たけおか ぼちぼち日記-RetroBSD hardware

接続は次の通り。


MAX32 SDコネクタコメント
9 D3 CS (card0)/CS0 (SDCard 0のセレクト)
10 D4 今回、未使用(CS card1)/CS1(SDCard 1があれば、そのセレクト。今回は使用せず)
16 TX2 (SDO4) SDI PIC32の出力を、SDCardの入力に
3V3 +3.3V VCC
14 TX3 (SCK4) CLK SCK
GNDGND GND
17 RX2 (SDI4) SDO PIC32の入力を、SDCardの出力に
AREF(A10) LED0(緑LED) ディスク・アクセス
12(A2)LED1(赤LED) kernel走行
13(A3)LED2 UART


ちなみに、MAX32(Arduino)のコネクタの一部は、標準のピッチのユニバーサル基板だと、ずれてしまうように作られている。
多分、誤挿入防止のためであろうが、つまらないことをしてくれるものだ。

たけおか ぼちぼち日記-LED




RetroBSDでは、kernelは、PIC32のオンチップROMに書きこむ。
kernelは、約 130KBytes(TCP/IP無し) なので、まだまだ、ROMには余裕がある。

RAMは、128KBytesだが、PDP11の論理空間が64KBytesだったので、2.11BSDのコマンドを使っている分には、
リーズナブルである。



開発環境など

  • 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

    1. target.mkを合わせる
    GCCPREFIX = /opt/pic32-tools/bin/pic32-

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

    # Select target board
    TARGET ?= $(MAX32)

    そして、make する。

    3. filesys.imgがトップ・ディレクトリにできる
    filesys.imgを SDCardに書き込む。

    # dd if=filesys.img of=/dev/sdb conv=sync
    (「/dev/sdb」 の部分は、SDCardに合わせる)

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

    5. kernelのMAX32への書き込み
    USBでMAX32とPC を接続。USBシリアルで接続される。

    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

    「/dev/ttyUSB0」は、環境に合わせる。

    (このavrdudeツールのバイナリが64bit Linuxだと、うまく動かず。自分で、makeしないといけませんね)



    起動
    USBでMAX32とPC を接続。
    USBシリアルで、BSDのコンソールになっている。
    シリアルの通信速度は、115200bps。
    kermit などで接続する。
    ~/.kermrcの内容
    --
    set line /dev/ttyUSB0
    set speed 115200
    set flow-control none
    set carrier-watch off
    set parity none
    --

    SDCardを挿さずに起動すると、「SDCardが無いよ」と kernelがいう。
    SDCardをスロットに挿して、リターンを押下すると、2.11BSDが起動する。

    login:が出たら、アカウントは、root。パスワードは無し(単にリターンを押下)。


    あとは、普通の BSD。
    端末は、vt100 を期待しているので、xtermなどからkermitを起動していれば、
    viやwormなど、端末のスクリーンを2次元的に使用するソフトウェアも、普通に使える。


    -- 実行例

    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


    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
    # 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,
    #
    # 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
    #





    fsutil

    PC Linuxなどで、RetroBSDのファイル・システムをメンテナンスするコマンドがある。
    (RetroBSDのファイル・システムは、ブロックサイズが1KBytesにしてしまった)

    # tools/fsutil/fsutil -c filesys.img
    ファイル・システムのチェックを行う。
    (ここで指定するイメージには、/dev/sdbなどのデバイスも指定可能)

    # tools/fsutil/fsutil -x filesys.img
    ファイル・システムの内容を、カレント・ディレクトリに展開する。

    # tools/fsutil/fsutil -a filesys.img files...
    files... を、イメージに加える。



    PIC32シミュレータ

    tools/virtualmips/pic32としてPIC32のシミュレータができる。

    virtualmipsのmake を成功させるには、libelf とか libconfuse とかのライブラリを要求される。
    virtualmipsが無くても、RetroBSDには何の支障もないので、RetroBSDを実機で早く動かしたい人は、
    virtualmipsは無視しよう。

    また、このvirtualmipsは、私の 64bit Linuxでは、うまく動かない。
    32bit Linuxでは、非常に快調。

    tools/virtualmips/pic32は、いくつかのハードウェアをシミュレートできる。
    デフォールトでは、MAX32をシミュレートするようになっている。
    そのコンフィギュレーション内容は、tools/virtualmips/pic32_max32.confに書かれている。

    tools/virtualmips/pic32を起動すると、sys/pic32/max32/unix kernelを読み込み、filesys.img を読んでブートする。
    その後は、実ハードウェアの RetroBSDと同様である。



    SDCard インターフェース

    私は、最初の動作確認をするために、SDCard コネクタは、Arduino用の
    Seeed studioという会社の「SDCard Shield」を千石で買って使用した。
    このシールドは、Aruduino Megaにはそのまま接続できないものであった。
    MAX32は、Aruduino Megaとコンパチであるため、やはりそのままでは接続できない。
    たけおか ぼちぼち日記-Prototype
    そこで、長い線で試しに配線をして、RetroBSDが起動するかを、確認した。
    しかし、当然ながら、どよーんと長い線では、13Mbpsの速さで動作するはずもない。
    そこで
    sys/pic32/sd.c 中の、SDのクロック値を (0.3)に変更
    #define SD_MHZ (0.3)
    定数計算式中に、小数点数が出るが、コンパイルが終了したら整数の定数になっているので、大丈夫。

    SD_MHZを 0.3 にすると、kernelがSDCardを読み書きできるようになって、RetroBSDが動作した。

    (私は、Arduinoの通常版も持っているので、今後、SDCardシールドはそちらで使用する)



    2.11BSDはそもそもTCP/IPが動いていた。
    RetroBSDでも、TCP/IPを入れた人も居るようだ。
    SPIでつながる Ethernet NICも存在する。(Arduinoのシールドとして使用されている)

    是非、誰かに動かしてもらいたいものだ。(自分でやれよ)



    --- EOF



  • AD
    いいね!した人  |  コメント(2)  |  リブログ(0)

    たけおかさんの読者になろう

    ブログの更新情報が受け取れて、アクセスが簡単になります

    最近の画像つき記事  もっと見る >>

    AD

    Ameba人気のブログ

    Amebaトピックス

        ランキング

        • 総合
        • 新登場
        • 急上昇
        • トレンド

        ブログをはじめる

        たくさんの芸能人・有名人が
        書いているAmebaブログを
        無料で簡単にはじめることができます。

        公式トップブロガーへ応募

        多くの方にご紹介したいブログを
        執筆する方を「公式トップブロガー」
        として認定しております。

        芸能人・有名人ブログを開設

        Amebaブログでは、芸能人・有名人ブログを
        ご希望される著名人の方/事務所様を
        随時募集しております。