uARM (1)


あー

ここには昨日の続報っぽいのを書いていたのだけれど、つまんねー、ってことで削除。

uARM とは?

uARM は Dmitry Grinberg さんが、8bit マイコン上で Linux を動かしてやるぜ! というイカれた(誉め言葉)ARM エミュレータのことです。

いまどきは車輪の再発明なんかしなくても、最先端の技術が全部入りのソース付きライブラリが比較的容易に手に入ったりので、勉強目的以外での再発明はあまり歓迎されないし、むしろありものをそういうのをいかにうまく使いこなしていくか、という能力が大事なケースが多いですが、uARM の他にこの方の作ったものを見てみると、「車輪?なにそれ?うまいの?おれは知らないなぁ。うん?すでにあるかもしれない?だから何?おれはおれの道を行くぜぇ!どこまでもなぁ!え?これのこと車輪っていうの?そんなん知らねー!ハハハハハ!」じゃないかと思われるくらいイカれてます。(誉め言葉)

電子工作がさくさくできれば、実際に作ってみました、というネタを出せるのでしょうが、残念ながらソフト屋の私にはそれ実現する能力がありませんので、すでに #kernelvm でブイブイ言わせているモヒカン族が Linux だの、BSD だので動かした結果を横目に、「バーカバーカ!リトルエンディアンだけでやってんじゃねーよ!」と m9 しながら PowerPC な Mac mini をひっぱり出してきて、動かすまでの軌跡をちょっとばかしまとめてみました。

残念ながら、エンディアンに依存しないソフトを書きたい!という方の参考にはならないと思います。何を考えたか、くらいは参考になるかなぁ。ならないと思うなぁ。

PowerPC Mac mini のセットアップ

一番大変だったのはここなんですが、思い出したくない話しかないので、はしょりましょう。PowerPC に対応した Mac OS X は 10.5.8 で今はもう入手しづらいかもしれません、ということと、どこに対応した XCode があるのか探すのが大変である、くらいにしておきます。

uARM on PowerPC Mac mini

とりあえず無修正のままコンパイルして実行した結果がこちら。

何もしないとこうなります。 twitter.com/cvsync/status/…

— MAEKAWA Masahideさん (@cvsync) 2013年4月27日

まぁ、当然動きません。どう見ても変な場所にアクセスしてます。

ここからは論理的に進めるべきなんですが、私はほぼ直感で突き進んでいきます。整理とかめんどいじゃないですか...

そもそも Linux とか BSD ってどう動いているんだ?という基本にまず立ち返ってみます。大雑把すぎますがたぶん本質を見失っていない程度にざっくり書くと、

1. 外部記憶とかどこかにある命令を RAM に展開する。

2. RAM から CPU のレジスタに読み込んで実行する。

ってな具合になっています。これだと、何をするにも逐一メモリーにアクセスすることになるので、最近の CPU (というと、おっさんくさい表現ですが)ではキャッシュが搭載されていて、メモリーへのアクセスが発生した場合、ある程度まとまった単位でメモリーからキャッシュにコピーしておいて、uARM はデータキャッシュを実装していませんので、そこは無視します。

(この説明があまりにアレなのはわかっていますので、バーカバーカという非難だけでなく、この本を紹介したら?という提案をお待ちしております。)

ビッグエンディアン対応といっても、この 1. および 2. の計2つを修正してやれば動きます。

次に行く前に、ここまでの流で想定される質問と答えを書いておきます。

想定される質問と答え

Q. ペリフェラルとかどうなるんですか?

A. ペリフェラルはエンディアンとは無関係です。
単純に「この 32bit レジスタの 1bit 目」というとき、エンディアンは関係ないでしょう?

Q. でもでも PCI デバイスとかだと問題起きません?

A. それは規格というかバスというかがうんぬんかんぬん...

Q. でもでもそのレジスタが 8bit でも 16bit でもアクセスできたら?

A. しないからいいんです。

Q. でもでも...

A. あー、分かった。分かったから。問題になったら考えるから。

疲れたのだ

実際に、どこを、どういう意図で、変更したのかは、また今度書きます。


戻る