2010年12月24日金曜日

FPGAでCPU作成

電子工作に興味がわきました。

そもそもの発端は
名著「CPUの創りかた」を読んだからです。

http://www.amazon.co.jp/dp/4839909865

本に従い、ロジックICを買ってきて組み立てようかと誘惑に駆られたのですが、
作ってそこで終わりな気がしたので、ちょっと方向を変えることにし、
以前から気になっていたFPGAに手を出すことにしました。

参考にしたサイトは
触って学ぼう FPGA開発入門です。
非常にわかりやすいです。

ちなみに、同じ著者の「【実践】C言語による組込みプログラミングスタートブック」も買ってはみたものの、Cでロジックを書く意味が見いだせず、こちらはお蔵入りとなりました。

上記サイトにて使用されているEDX-002を購入し、サイトの記述に従って
実際にやってみました。
わからないことはいろいろありますが、まずはLED制御がなんとなくできるようになりました。

わかった気になったので、CPUをつくることにしました。
アーキテクチャは「CPUの~」の設計(TD4)をそのままつかわせてもらいました。
命令セットが見事です。

で、ごにょごにょやっていると、なんとなく動くものができました。
まだバグがあり、
・入力ポートが動かないっぽい
・クロックが適当
という不具合があるものの、
プログラムが動き、LEDが点滅しました。
すばらしい。

ソースは公開しておきますか。

https://subversion.assembla.com/svn/yosinori_public/trunk/fpga/spartan2/cpu1/

cpu.vがソース。たったの187行。
FPGAって楽だなぁ。

ハードのことがわからない人間がFPGAの知識もほぼない状態で
CPUを作るとこんな感じになる、というモデルケースの一つとして参考にしてください。

次なるステップは
・実用的なCPUを作る(設計も自分流に)
・既存のIPコア、picoblaze or pacoblazeを試す
・シリアル通信などのハード制御をしてみる。
あたりですかね。

ゆくゆくはdis VMをハードウェア化したプロセッサを作ればな、
などと考えてはいますが、
disの命令セットが一筋縄では実装できなさそう。
forkとかあるみたいだし。

2010年12月12日日曜日

Inferno 関連書籍

書籍をいくつか購入したのでまとめ。
こうして見ると結構ある。


Principles of Operating Systems: Design & Applications



http://www.amazon.co.jp/Principles-Operating-Systems-Design-Applications/dp/1418837695

OSについての教科書。じっくり読む価値があると思う。


Inferno Programming with Limbo



http://www.amazon.co.jp/Inferno-Programming-Limbo-Phillip-Stanley-Marbell/dp/0470843527


Inferno 3rdの時の本だが有用とのこと。
4thでの変更に注意しながら読む必要がある。

差分がまとまっている所は見つけられなかったので、自分で作ろうかな。


Inferno (Operating System)



http://www.amazon.co.jp/Inferno-Operating-System-Frederic-Miller/dp/6130282990


Wikipediaの記述をまとめただけという驚きの本。やられた。


Limbo (Programming Language)

(画像なし)

http://www.amazon.co.jp/Limbo-Programming-Language-Lambert-Surhone/dp/6133174110

こちらも、wikipediaの記述をまとめたもの。
嫌な予感はしたが、的中。



〜〜〜以下、購入できず。〜〜〜



Inferno Programmer's Manual


(画像なし)

http://www.amazon.co.jp/gp/product/0953870103


The Inferno Programming Book: An Introduction to Programming for the Inferno Distributed System



http://www.amazon.co.jp/Inferno-Programming-Book-Introduction-Distributed/dp/0470849711

2010年10月23日土曜日

Armadillo 440

Armadillo440に触る機会が出来ました。
ひとまずInfernoがインストールできるか確認です。
armadilloでセルフビルドが一番簡単そうなのでそのように。

2011/02/26 utilsのビルドはいらないっぽい。コメント参照

・debian環境の構築

アットマークテクノの提供するソフトウェアマニュアル「7.2. ストレージに配置する」を
参考にし、
Flash ROMの中のLinuxを立ち上げ、micro SDカードにdebianをインストール。
ドキュメントがよく整理されていてわかりやすい。さすが。

なんと開発用のLinux PC環境を用意しなくても出来ちゃう。

詳細は割愛。
以後はSDカードのdebianを立ち上げてから行う。

・ビルドに必要なパッケージをゲット

armadilloはEthernetでインターネットに接続できるようにしておきます。


apt-get update
apt-get install [パッケージ名]


パッケージ名は、


  • x-window-system-core
  • libxext-dev
  • gcc
  • make
  • mercurial


・infernoのソースをゲット

google codeからmercurialで持ってくる。


cd /
hg clone https://inferno-os.googlecode.com/hg/ inferno-os


・ビルド用の設定

パスの設定、コンフィグの書き換え、その他。


export PATH=$PATH:/inferno-os/Linux/arm/bin
cd /usr/bin
ln -s gcc arm-gcc


/inferno-os/mkconfigを一部書き換え


ROOT=/inferno-os
SYSHOST=Linux
SYSTARG=Linux
OBJTYPE=arm


・ユーティリティとOSのビルド


cd /inferno-os
./makemk.sh

cd /inferno-os/utils/iyacc
mk install

cd /inferno-os/utils
mk install

cd /inferno-os/limbo
mk install

cd /inferno-os
mk install



・実行


cd /inferno-os/Linux/arm/bin
./emu


infernoのプロンプトが現れる。すばらしい。

なお、wm/wmを実行してみたが、画面の色深度が16bppじゃだめと怒られた。
どうしたものか。

※ネットワーク上のxserverに画面を飛ばすのはOK。

2010年6月29日火曜日

一国一城の主に

オシロを買いました。
picoscope 2203というやつです。

http://www.picotech.com/ultracompact-oscilloscopes.html

かっこいい。

別に何か目的があるわけでは無いのですが、使い方を習得したかったので
弾みで購入しました。

いじる時間が取れなさそうなのが悩みです。

なお、このオシロスコープはiPhoneアプリも出ていて、
波形をiPhoneの画面に出すことができます。
これも面白い。

2010年3月14日日曜日

AndroidでStyx、略してStroid

ブログタイトルにサブタイトル入れておきました。なにもひねりがありませんが。

AndroidでStyxを動かしたくなりました。
略してStroid。
最終目標は、wmをAndroidアプリで実装して、ローカルorリモートのInfernoを
タッチパネルから操作できるようにする。

既存のStyxライブラリを検証してみました。

・Jstyx
結構外部ライブラリに依存している。
Androidでの起動に失敗。

・ninedroid
Android上で動く実装もあったので、簡単に動いた。
すばらしい。
サーバー側。

・styx-n-9p2000
Android上で動く実装があったので、簡単に動いた。
クライアント側。

・j9p/styxlib
ざっとソースツリーを眺めると結構大きい。
気力が尽きたのでポーティングは試みていない。
apache/antを使うとか、外部ライブラリへの依存があるのかも。

ちなみに、ninedroid とstyx-n-9pのAndroid端末内でのローカルホスト対向通信は
失敗。なぜだろう。

Styxはシンプルなプロトコルといわれているが、認証とか暗号とか考えると
意外と大変かも。

2010年2月25日木曜日

そういえば、Smart Q5でLinux Emuは動いてます



すっかり報告し忘れていましたが、Smart Q5上のubuntuで、
emuは動いています。

残念ながら、wmは動いていません。理由はXの画面モードのようで、
色深度16bppでは動かないそうです。
24bppにすれば多分動くと思うのですが、設定の仕方がまだわかっていません。
(ブートパラメーターなのか、設定ファイルなのかすら不明)

動かしたInfernoの出所は、Google codeの物を
beagle board上のubuntuでビルドしたものです。
もともとBeagle board用にセルフビルドしたものですが、
それがそのまま動きました。

写真はその時の模様です。
iPhone 3Gにはマクロレンズが無いので、虫めがねごしです。
ボケてゆがんでいるのはそのせいです。

ところで、Android上でemuを動かす試みは
まだうまくいっていません。
ただ、これがもしうまくいけば、バックグラウンドでInfernoを動かし、
UIはAndroidアプリで構築し、ローカルのInfernoに接続する、
なんてことができるかもしれません。
Android用のDrawtermがあるといいのかな。
(あれ?DrawtermってInfernoに使えるの?)

なお、Drawterm for iPhoneというのは構想があるそうです。
http://cm.bell-labs.com/wiki/plan9/iPhone_drawterm/index.html

2010年2月15日月曜日

曲を聴きながら眠りにつき、良いタイミングで起こしてもらう(Sleep Cycle Clock をiPodとともに使う)

大人気のiPhoneアプリSleep Cycle Clockというのがあります。
寝ている間の体の動きをセンサーで検知し、眠りの深さを計算し、
眠りの浅いときを見計らっておこしてくれる目覚まし時計アプリです。
常にアプリランキングに入っています。
こんなアプリを作れたらいいなぁ。

これを起動している最中は
音楽を鳴らすことが出来ないのが残念でした。
しかし、回避する方法があるそうです。

これをやると、「曲を聴きながら眠りにつき、良いタイミングで起こしてもらう」ができるのです。

参考サイト:
http://holygekko.posterous.com/combining-sleep-cyle-and-ipod-or-how-i-tricke

詳細は引用もとのサイトを参照してください。

やり方だけ抜粋。


1. あらかじめiPodコントロールを有効にしておく。(設定→一般→ホーム→iPodコントロールをONに)これは一度設定すればOK。

2. iPhone標準アプリの時計を起動。寝付くまでの時間を設定し、「タイマー終了時→iPodをスリープ」を設定。こうすることで、いつまでも曲が流れ続けるのを避け、途中で曲をストップしてくれる。

3. iPodを起動し、好みの曲をスタート。

4. Sleep Cycle Clockを起動。起動が完了する前にHOMEボタンをダブルタップ(←ここがコツ)

5. iPodコントロールというウィンドウがポップアップし、裏ではSleep Cycle Clockが起動完了し、iPodの再生を止めるはず。その状態になるまで待つ。

6. Playボタンを押し、iPodの再生を開始し、Closeを押してポップアップを閉じる。あとはSleep Cycle Clockを通常通りに使う。


ちょっと手順が込み入っているけど、慣れればそれほど難しくないかと。
iPhone3Gで試してみたところ、成功しました。

良くこんなウラワザ見つけたなー。

2010年2月11日木曜日

SmartQ5 のスクリーンショットを撮る

SmartQ5のAndroidでスクリーンショットの撮り方がよくわからなかったのですが、
フレームバッファをファイルにダンプすればいいそうです。
たぶんUbuntuでも有効。

参考:
http://hirokuma.justblog.jp/blog/2009/11/q5fb0.html

ネットワーク上の別のパソコンから、SmartQ5にTelnet接続。
特に認証は聞かれず、すぐにプロンプトが現れる。
SDカードを挿した状態でフレームバッファの中身をファイルにダンプする。


cat /dev/graphics/fb0 > /sdcard/fb0.raw


/sdcardにSDカードの第一パーティションがマウントされている。

これをパソコンにもってくる。
Irfan viewで見られるとのことなので、Irfanview32を持ってきて
ファイルを開いてみる。

が、プラグインが要るみたい。
Irfanviewのサイトからiv_formats.zipを持ってきて、
pluginsディレクトリに展開。

ただ、そのままでは開けず、Irfanviewにドラッグ&ドロップすると
ダイアログが開く。

サイズ:800x480
色:16 BPP 5:6:5


でOK。
表示方向に関係なく、横方向の画が得られる。

パソコンの画面に表示すると結構大きいね。
相当タッチパネルの画素密度は高いんじゃなかろうか。

※遠隔からログインしなくても、自身で操作できる。
アンドロイドマーケットにtelnetというアプリケーションがあるので、それをインストール。
自身に接続できるようだ。ターミナル代わりに使える。

2010年2月7日日曜日

Inferno Phone構想

Smart Q5をベースに、Inferno Phoneの仕様を考えてみます。

まずはプロトタイプです。現実的な目標をたてます。

・ハードウェア
Smart Q5そのもの

・OSブート方法

インストール済みのubootにてホストOSをブート(おそらくLinuxになると思われる)。
ホストOS上でemuを起動する。

・有効デバイス

タッチパネル、WIFI、SDカード

・ユーザーインターフェース

wm/wmをそのまま使用。
ただし、アプリケーションラウンチャがあると感じが出るので
limboで書くと良いかも。

ソフトウェアキーボードは既にあるので、それを利用。

ただし、日本語入力はまったく考えられていないので、
日本語FEP、日本語用ソフトウェアキーボードは別途開発の必要がある。

ペンでの手書き入力は特に考えていない。

その他、3ボタンマウスのエミュレーションは必要だろう。
本体のボタンを使うのが良いか?

・有用なソフトウェア

ウェブブラウザ

テキストエディタ

メーラー(む、どうするんだこれ)

Smart Q5



Smart Q5を購入しました。
http://www.covia.net/main/product-smartq5.html

タッチパネルつきの筐体に収まったネットワーク端末で、
Androidがインストールされています。

わりと自由にいじれるようで、Linuxも動かせるそうです。
マルチブートもいけるので、常用しつつ開発とかよさそう。

Smart Q5の良い点は

・日本での入手性が良い
・回線の契約がいらない
・単価が安い
・サポートがある

ですね。
なにより普通に国内で買えるのが良いです。
ある程度数売れるとネット上に情報も増えるはず。
個人的にうれしいのが、SDブートできる、ARMなのでInfernoが載せられそう、
と言う点。

気になる点は
・カメラが無い
・メモリが128Mbyte
・USBコネクタがminiB
・電池の持ちが良くない
・タッチパネルが感圧式
とかですかね。

地味に困るのが
・シリアルが外に出ていない
だったりします。
どうやら基板にシリアルのパターンはあるそうで、引き出せるそうですが、
筐体開けたくないなぁ。

Smart Q5に関してはいろいろと野望がありまして、

1. Inferno Phoneを作る
2. Android アプリを作る
3. 普通にネット端末として使う

といろいろと期待しています。
2,3,はまあいいとして、一番やりたいのはやはり
この上でInfernoを動かすことです。
できればPDAっぽくしたい。

なお、シリアルが出ていないので、Native Infernoのポーティングは
難儀しそうなので、まずはLinux上のemuを動かすこととしたいと思います。
emuでInferno Phoneの風味が味わえる所までするのが第一目標です。

よって、TODOとしては、

・Linuxを動かす
・emuを動かす
・GUIをそれっぽくする
・日本語入力を作る(あー全然進んでないな)

平行して、
・Native Infernoのポーティング(Beagleboard)

※気づいたら、自分はNative Infernoを使ったことが無いのだった。
 一度VMで386のNative Infernoを動かしてみた方がよいかも。

2010年2月4日木曜日

Beagleboard のDVIでInfernoのGUIが表示できた

以前Beagleboardの上でLinuxを動かし、その上でInfernoのemuを動かし、
GUIをネットワーク越しにXサーバーに飛ばすという試みをしましたが、
今回BeagleboardのDVIから直接ディスプレイに表示することに成功しました。

ただし、USBマウスが認識できなかったので何も出来ません。



・DVI(HDMI)ポートはディスプレイのDVIポートに
・デバッグシリアルポートはパソコンのCOMポートに
・OTGはパソコンのUSBから給電
・SDカードにLinux + Infernoのシステムを入れておく

今回いじったのは、ディスプレイの色深度です。
前回の設定では画面が16bitで、それではだめでした。
色の設定を変えるのは、ubootの設定で、カーネルオプションを変更します。

omapfb.mode=dvi:1280x720MR-16@60


としていたので、

omapfb.mode=dvi:1024x768MR-24@60


などとする。
Linux側では特に設定を変更することは無かった。

その後の手順は、

login: ubuntu
password:


でログイン

$ sudo startx


しばらくすると画面にxtermが表示されるので、ctrl-zでいったんストップ。

$ bg


でXを動かしつつ、さらにコンソールで作業。


$ export DISPLAY=unix:0
$ /path.../emu -r /path... -g 1024x768
;


として、Inferno起動。-gオプションはディスプレイサイズ。
で、wmを実行。

; wm/wm


さて、この状態では何も出来ませんが、一応なにかアプリケーションを動かしてみます。
wmの起動のときにオプションを追加してやり、

; wm/wm wm/bounce


とbounceというデモアプリケーションを起動してやると、



と、動きました。
このアプリケーションはただボールがウィンドウ内を飛び交うだけです。
一つ一つのボールにスレッドが割りあたっているそうです。

2010年2月2日火曜日

CharonのツールバーとCharon on Acme

ふと思い出しました。

1. Charonはもっと派手なツールバーがあったような記憶がある
2. Acme上でウェブページの閲覧が出来た

思い違いかと思ったら、どちらも真実だったようです。

1. Charonのツールバー

実際にツールバーを触った記憶が無かったのですが、
これはスクリーンショットで見た記憶があるだけでしょう。
リンク先の画像を見ると、確かにツールバーにホームやらブックマークやらの
アイコンがある。

あるバージョンとないバージョンの違いは、Infernoのエディションの違いと思われる。
スクリーンショットを見ると3rd editionとなっている。
おそらく3rdエディションでは派手だったのではないだろうか。

3rdエディションがダウンロードできたので持ってきてソースコードを見てみたが、
どうもそれっぽい記述がない。

次に、2ndエディションを持ってきてソースコードを見てみた。
charon.bにどうもそれっぽい記述があった。

結論:3rdエディションのどっかのタイミングでツールバーがシンプルになった。

2. Acme上でウェブページ

acmeでurlを指定してウェブページを開いた覚えがあった。
これはacme-sacの機能だったようだ。
URLを開くというコマンドは見つけられなかったが、
/acme/dis/にDict, Goog, Pediaというスクリプトがある。
これらはウェブから辞書、Google検索、Wikipediaの結果を返すようになっており、
acme上で Dict [単語], Goog [単語], Pedia [単語]と実行してやると、
acmeのウィンドウ上にウェブの内容を表示してくれた。
これらの中身はplumber(アプリケーション間通信のしくみ)でURLを送っているようだ。

そこで、/acme/dis/Webというスクリプトを以下のように作ってみた。


#!/dis/sh.dis
plumb -d web $*


で、acmeでWeb [URL]とするとウェブが表示された。

ウェブの表示はCharonのモジュールを利用しているようだ。
/usr/[User]/lib/plumbing というファイルにplumberの設定がある。


kind is text
data matches '(https?|file)://[a-zA-Z0-9_@\-]+([.:][a-zA-Z0-9_@\-]+)*/?[a-zA-Z0-9_?,%#~&/\-+=@]+([:.][@a-zA-Z0-9_?,%#~&/\-+=]+)*'
plumb to web
plumb start /dis/charon.dis $0


このように、webというメッセージを送るとcharonがダンプしてくれるようだ。

standalone charonに関してはリンク先参照

2010年1月31日日曜日

画面を飛ばす



Xのように画面をリモートに飛ばせるようです。

cpuサーバーにログインして、ローカルのwmを
指定してサーバー側のGUIを起動するようです。

※前エントリーのcpuサーバーへの接続の設定済みとします

%mount {wmexport} /mnt/wm
%cpu tcp!サーバー
; wmimport -w /n/client/mnt/wm wm/wm &

→ ウィンドウが開き、その中でwmが動く。

手前の赤枠のウィンドウ:リモートのGUIを表示させた入れ子のwm(unameがlinux)
左上のシェル:cpuサーバーに接続したシェル。(unameがlinux)
左下のシェル:ローカルのシェル。(unameがdarwin)

※専用アプリがあるようです。wm/dmwm、wm/dmviewを使うらしい。
wmview,wmdmを使う方法はあらかじめサーバー/クライアントでwmが
立ち上がることを前提としているような。

Infernoのサーバーの機能について

Infernoのサーバー機能についてちょっと解って来ました。
Plan9のサーバーは
- CPUサーバー
- 認証サーバー
- ファイルサーバー
にわかれるそうです。
どうやらInfernoもそういう分け方という理解で良さそう。

なお、それぞれのサーバー機能で、サービス名のニーモニック(styxとか、ポート番号を文字列で表現する)とか、ネットワークアクセスをする場合は、あらかじめ
ndb/cs
を実行しておく。

・認証サーバー
認証サーバーのプログラムはsvc/auth。
アカウント情報はauth/changeloginで追加する。

例えば、ユーザー/パスワードを追加するには、
auth/changelogin [ユーザー]
と実行する。

また、auth/createsignerkeyで鍵の生成も必要。
auth/createsignerkey [ユーザー]

認証サーバーを使う場合は、getauthinfoで
認証を行う。

例えば、後述のCPUサーバーの機能を使う場合は、
CPUサーバー、クライアントそれぞれでgetauthinfoを実行する。

・CPUサーバー
サービス名はrstyx。
サーバー側では、getauthinfoを実行するか、svc/rstyxを
実行するとサービスが立ち上がるんじゃなかろうか(自信無い)。
getauthinfo default
signer: 認証サーバー(cpuサーバーと同じ所で認証サーバーを動かすときはlocalhost)
user: ユーザー

保存しますか?にYESと答えると、認証情報が保存される。
再起動後はsvc/net or svc/rstyxの起動だけでよい。

クライアントからはまず認証。
getauthinfo tcp!接続先アドレス
signer: 認証サーバー
user: ユーザー

つぎに、接続コマンド
cpu tcp![CPUサーバー]
とすると、サーバーにログインし、
プロンプトが表示される。
抜けるときはexit。

ほかに、クライアントからはrcmdというのもつかえそう。
こちらはおそらくコマンドの単品実行でしょう。

・ファイルサーバー

ファイルサーバー側ではgetauthinfoを行う。
やり方はCPUサーバーと同じ。
getauthinfoの結果ファイルサーバーが立ち上がるようだ。
save file = yes としたときだけかな?

サーバー立ち上げはsvc/styxで。
または、細かくオプションを選ぶ場合はlisten。
認証(引数にキーを選ぶ)、エクスポートするディレクトリを選べるようだ。

クライアントからはgetauthinfoで認証し(CPUサーバーと同じ)
mountする。
mountは、こんな感じで。
mount tcp![ファイルサーバー] /n/remote
でOK。

※マウント後のファイルの使い方はいろいろ面白いことがありそう。
 例えば、Xみたいに画面を飛ばすのが面白かった。

※svc/net というサーバーコマンドもあるけど、これは
CPUサーバーとファイルサーバー両方まとめて立ち上げるように
思われる。

2010年1月26日火曜日

Inferno-kirkwoodのビルド

Linux環境を壊して、その復旧をしたりとのろのろやっていて
時間がかかってしまいましたが、
先日話題にしたInferno-kirkwood(sheevaplugで動かすInferno)をビルドしてみました。

結局ビルドできた環境はi386上のLinuxのみ。
arm上のLinux、i386上のOSXではいずれも失敗。

以下試したビルド方法。
Infernoのディレクトリは既にある物とする。

os/にinferno-kirkwoodのtrunkを持ってくる。
os/kirkwoodというディレクトリ名にしておく。

os/kirkwoodにsheevainit.bというファイルがあるので、
このファイルをinit/にコピー。

os/Linux/386/binにパスを通す。
まだやっていなかったらmakemk.shを実行。
あ、そのまえにmkconfigの編集が要るかも。
SYSTARGをLinuxに、SYSARCHを386にしておく。

os/kirkwood/mkuimageというディレクトリがあるので、
ここで、mk all;mk install実行。
これは、生成するバイナリをubootで使用できる形式に変換する物。

続いて、os/kirkwood/でmk allを実行。
/usr/以下の○○というファイルが無い、とか言われたら、
空のファイル/ディレクトリで良いので作って再トライ。

すると、uisheeva.gzというファイルができた!
サイズは700kbyte程。

実機で動かしたいけど、動かした後何かしたい訳でもないのでまあいいや。

Acheron Limbo Compiler

Limbo コンパイラーとその実行環境をPOSIXに移植したプロジェクトがあるそうです。

Acheron Limbo Compiler

もしこれが普通に使えそうなら、普段からLimboがいかせるかもしれない。


コンパイルしてみようと思ったが、ごにょごにょしているうちに、
Linuxマシンをおかしくしてしまった。
やる気を失ったので後日・・

なお、ソースはアーカイブになっていないようなので、CVSで持ってくる必要がありそう。
また、コンパイルにはocamlが必要っぽい。



ほかに、Parrotについてもちょっと見てみた。
これは、仮想マシン(レジスタマシン)の実装らしい。
色々な言語に対応しているようだ。
しかし、Limboには対応していないようだ。残念。

Parrot Language

2010年1月23日土曜日

mkuimageがあると便利

Plan9日記にて
inferno-kirkwoodの紹介があった。
InfernoをSheevaplugで動かすプロジェクトらしい。
これは参考になりそう。

で、そこのソースツリーにmkuimageというのがあった。
ubootでブートするためのイメージファイルを作るためのものだと思う。
これ使えないだろうか(OSXで動くといいなぁ)。

それはともかく、このプロジェクトはBeagle Boardの
ネイティブポートの参考になるはずなので見てみることにする。

Sheevaplugもちょっと気になっているが、たぶん買わないと思う。

2010年1月20日水曜日

BeagleboardのLinux emuでUIが動いた



Beagleboard上のLinux上のInferno emuでGUIが動きました。

スタンドアロンではなく、他のマシンのXserverに画面を飛ばしています。

やったこと

・ubuntu on beagleboardの環境整備

apt-getにてxorg, xorg-dev, gcc, mercurialを持ってくる。

・Infernoのビルド

google codeのtrunkをmercurialで持ってきて、ごにょごにょとビルド。

・Xserverの用意。

今回はWinXP上のcygwinのXserverを使ってみた(図)。
いい感じでwm/wmが表示された。

charonを立ち上げようとしたら固まった。まだ完全ではないらしい。

ちなみに、ネットワーク経路はかなりひねくれていて、

beagleboard -(usb)- MAC -(wlan)- hub -(ether)- Win

といった感じ。OSもinferno,linux,osx,win、経路はUSB, wlan, Ethernet、
アーキテクチャもarm, i386と、ふんだんにまたがっています。
MACはネットワークブリッジとシリアルコンソールとして機能している。

※Linuxと対向だったらもっと素直にいけたかも。

なお、スタンドアロンも試みたのですが、startx自体は実行でき、xtermも立ち上がったっぽいのですが、USBキーボードをさしたらXが落ちたっぽい。
引き続き調査予定。

2010年1月16日土曜日

InfernoのHTTPでCGIを書く

InfernoのHTTPでCGIを作成する方法が分かりました。

・HTTPサーバーの起動

svc/httpd/httpd

オプションは
-D デバッグログを出す
-p ポート

・まずは普通のウェブページの表示方法

/services/httpd/rootというディレクトリの下に
htmlソースを置くとアクセスできる。
index.htmlというファイルを置くと、

http://host/index.htmlまたはhttp://host/ でアクセス可能。

サブディレクトリを作ってもOK。

・CGIのサンプル

CGIはhttp://host/magic というパスでアクセスする。
まずはhttp://host/magic/echo
とアクセスしてみる。
すると、なにやら情報が表示される。
これはファイルシステム上の/dis/svc/httpd/echo.disに当たる。
LimboでかかれたCGIファイルで、ソースは/appl/svc/httpdの下にecho.bがある。
これを真似して、例えば同じ場所にtest.disを置くと、
http://host/magic/test
でアクセスできる。

詳細はecho.bをみると大体わかるが、
通常のシェルコマンドと書き方がちょっと違う。

覚えきれるものでもないので、雛形にしてしまうのがよいか。


implement test;

include "sys.m";
sys: Sys;
include "draw.m";

include "bufio.m";
include "cache.m";
include "contents.m";
include "httpd.m";
Private_info: import Httpd;
include "cgiparse.m";
cgiparse: CgiParse;

test: module {
init: fn(g: ref Private_info,
req: Httpd->Request);
};

init(g: ref Private_info,
req: Httpd->Request)
{
sys = load Sys Sys->PATH;
cgiparse = load CgiParse CgiParse->PATH;
if(cgiparse == nil){
return;
}
cgidata := cgiparse->cgiparse(g, req);
bufio := g.bufio;
Iobuf: import bufio;

# Send header
g.bout.puts(cgidata.httphd);

# Send body
g.bout.puts("<head><title>test</title></head><body>test</body>\r\n");

g.bout.flush();
}


リクエストデータはcgiparseの結果に格納され、
method, uri, headerなどのメンバーで参照できて便利。
フォームデータはformでアクセス出来るのでこれでCGIが実現できるはず。
これはtag, valのペアのリストになっているのでhd, tlメソッドで
簡単に取り出せる。

(tag, val) = hd cgidata.form;
cgidata.form = tl cgidata.form;

のループでOK。

cgidataに関してはcgiparse.mを見ると良い。
関係ないけどacme(エディタ)でimport "cgiparse.m";の所で右クリックすると
ヘッダファイルにジャンプしてくれるので実に便利。

・その他

認証には対応していないように見える。

情報があんまり無いので、結局ソースコードから追った。
時間かかった〜。

2010年1月14日木曜日

Inferno on Ubuntu on Beagleboard

さて、新年が始まったわけですが、いきなりインフルエンザに罹患し出遅れています。
とはいえ、自由時間が取れるようになってきたので開発を再開しました。

Inferno on Ubuntu on Beagleboardを試してみました。
BeagleboardというARMボードの上でUbuntu Linuxをまず動かします。
その上でHosted Infernoを動かしてみました。
結果はうまくいきました。
wmは無理ですが、シェルは動きました。
ネットワークも未検証です。

なお、すべてネットに転がっていたビルド済みバイナリを利用しました。
何一つ自力でコンパイルしていない・・・

Ubuntuのインストール

まずはUbuntuのインストールです。
http://pyohn.blog.so-net.ne.jp/2009-11-18
の通りです。
作業はdebianで行いました。古いマシンなので遅かった・・・

・ビルド済みデモイメージを持ってくる
・カーネルとルートファイルシステムが含まれている。
・カーネルをuImageに変換し、SDカードのfatパーティションにコピー
・ルートファイルシステムをSDカードのext3パーティションに展開
・SDカードをbeagleboardに取り付け、ブート。
・以下のコマンド

setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; bootm 0x80300000'
setenv bootargs 'console=ttyS2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait rootfstype=ext3 ro vram=12M omapfb.mode=dvi:1280x720MR-16@60'
boot

で、めでたくログインプロンプトが出る。
このデモイメージはubuntu/temppwdというアカウントでログインできるようだ。

ひとまずubuntuが立ち上がった。

Infernoのインストール

つづいてInfernoのインストールです。
ubuntuのext3パーティションのどこかにInfernoのシステムをおきます。
たとえば/Infernoとか。

必要なものはInfernoのバイナリ。
これは、
http://code.google.com/p/inferno-bin/
にあるものを使いました。
Downloadから
「emug Linux arm Google Android emulator」
を選択しました。ダウンロードしてemu-gなどという名前にしておきます。

これだけでは動作せず、いくつかdisファイルが必要なようです。
選ぶのも面倒なので、既存のdis一式を丸ごとコピーしました。
コピー元は
http://code.google.com/p/inferno-os/
のtrunkのdisディレクトリでよいかと。
※disはアーキテクチャに依存しないので、どれでも共通です。

これらをたとえば以下のようなディレクトリ構成に配置します。

dis/
Linux/arm/bin/emu-g

Ubuntuでログインし、
cd path.../Linux/arm/bin
とディレクトリを移動し、
emu-g -r ../../../
とすると見事シェルが立ち上がりました。
-rはルートディレクトリです。
プロンプトは;です。
lcとするとファイル一覧が表示されます。

今後

これにて組み込みボードでInfernoが動く感じが再現できました。
しかし、できればNativeで動かしたいので引き続きNative Infernoを動かす努力を
していきたいと思います。
また、Hosted Infernoも、ネットワークがまだ動かせていないなど、課題があるので
そちらもやっていこうかと。