Windowsでもarm
南米の火山爆発、ネパールの地震、大湧谷の微小地震、蒸気発生の異常とまあ、怪しい事 しきり。去年は木曽の御嶽山が噴火したしね。
『富士山大噴火』(講談社)なんて言う小説を読んだ。
出だしはうまい展開。結婚をまじかに控えたカップルが公園でデート。そこで、かわいい犬が 大きな犬に襲われる。そして次に襲いかかられたのは、恋人の女性。男性は必死で彼女を 守ろうとダッシュするが。。。
普段はおとなしい犬なんですよと、その飼い主は言う。動物達の異常な行動が頻発。 その頃、天文台に勤める観測員が趣味で始めていた地震予知法で、ピタリと地震の 予知に成功。その方法とは地震雲の観測とFM電波の異常伝播を組み合わせたもの。
ハムな人にはおなじみのEスポ現象ですな。地核変動によって強い電荷が発生し、それが 電離層に影響を及ぼして、電波が回折するってのが根拠らしい。他の予知法としては、 ラドンの空気中濃度測定ってのもあるようだ。後は、ナマズの観測か。
富士山の近辺で異常な事が頻発。動物の異常な行動。樹海にある鍾乳洞で氷柱が溶け出す、 水蒸気が盛んに噴出する、山体が膨張する、地面の傾斜が変化する等々。 傾斜ってのは、 傾斜計で測るそうだ。 単位は、マイクロラジアンらしい。1Kmで1mmの変化をマイクロラジアンと言うそうな。 そんなの初めて聞いたぞ。
外部観察から勘案して、噴火が迫っている事は想像出来るけど、そのXdayを知りたい。 そこで、地震予知の出番ですよ。でも地震学者は、そんなの無理、予知は神かかりだから 予測と言えと言い出す始末。でも、失敗を恐れてか、学者は腰を上げない。
カメラマンは、噴火で山容が変わらないうちに、ありし日の美しい富士の写真を撮って おこうとする。新幹線に乗って、海側の席に座り、ずっと海を見ていると、一瞬だけ、富士山が 見える所が有るとか。その場所を求めて奔走する。やがて、噴火。。。
なんだか、現実っぽくなってきたな。くわばら、くわばら。
本物のRaspberry Pi
資料によると、イギリスの大学の先生がコンピュータが複雑になって触る事が難しいのに 腹を立てて、簡単に触れられようにプロジェクトを始めたらしい。
果物の名前がいい、アプルとかオレンジとか主だった果物の名前が使われていたので、残り滓から ラズベリーにしたとか。そしてそのコンピュータの上でPythonを動かしたいな。で、ひっかけでPiを 付け足した。
思いは実って、最近では女子も触ってますよ。 第1回 甘くないラズベリーパイをいただきました。 から始まるシリーズは野郎が群がっていますよ。 インターネットラジオの受信 も出来るとか。
パソコン自体は、3000円ぐらいで手に入るようだけど、電源やSSDカードを自分で用意する 必要が有る。更に、SSDカードにデータを書き込むための、パソコンとカードリーダーも 必要になるんで、大変だぞ。 でも、ラズパイで作ろう! ゼロから学ぶロボット製作教室 を見てたら、日経Linuxが選ぶ電子工作入門キット なんて言うのが発売されてた。これで楽出来るな。でも、相変わらず、自前でディスプレーと キーボードとマウスは用意しなきゃいけないけどね。やっぱり大変か。
そんなこんなで、仮想ラズパイを前回はやってみたんだけど、ちょいとオイラーの目指す 方向とラズパイの方向が一致してなかった。で、ミニマムなdebianを入れたんだった。
qemuって速いの?
お得意のqemuを使ってarmさせたんだけど、本物のラズパイに比べて速いの遅いの?
本物のラズパイは、Raspberry Pi(ラズベリーパイ) メモ (16)
pi@raspberrypi ~ $ cat /proc/cpuinfo Processor : ARMv6-compatible processor rev 7 (v6l) BogoMIPS : 697.95 Features : swp half thumb fastmult vfp edsp java tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb76 CPU revision : 7 Hardware : BCM2708 Revision : 0002 Serial : 0000000079fd....
こんな感じのようです。注目は、 BogoMipsって所。 ウブ上のarmでは、
root@debian-armel:~# cat /proc/cpuinfo Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 437.45 Features : swp half thumb fastmult vfp edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Hardware : ARM-Versatile PB Revision : 0000 Serial : 0000000000000000
ざっと、実機の2/3ぐらいのスピードで動いているのか。bogomipsなので違う石とは 比べるのはナンセンスだけど、あえて比べてみると、
sakae@uB:~$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel model name : Intel(R) Celeron(R) CPU 900 @ 2.20GHz bogomips : 4389.00
ざっと10倍の違いが有る。ウブはvmwareの上で動くi386だけど、同じ石の真似だから、 実な石の助けを借りているんだろうな。vbox上で動く万次郎Linuxも、ほぼ同様なbogomips になった。
だったら、今動かしてるqemuをWindowsへ持って行ったら、どうだろう。間にvmwareが挟まって いない分だけ速くなるはず。 やってみんべ。 ああ、その前にdmesgの最後を見ておくか。
[ 156.392250] Installing knfsd (copyright (C) 1996 okir@monad.swb.de). [ 198.179017] ipv6: Unknown symbol ip_idents_reserve (err 0) [ 198.947992] ipv6: Unknown symbol ip_idents_reserve (err 0)
起動してから、200秒かかって、loginプロンプトが出てきたんだな。
Windowsでもarm
qemu win32から、32Bit用のqemuを落としてきました。 インストールすると、いつもの場所に鎮座しましたよ。
ウブに入ってるarmなdebian一式と、下記のboot用スクリプトをWindowsへ持ってきました。
sakae@uB:~/qemu/arm$ cat boot.sh #!/bin/sh qemu-system-arm -M versatilepb \ -kernel vmlinuz-3.2.0-4-versatile \ -initrd initrd.img-3.2.0-4-versatile \ -hda debian_wheezy_armel_standard.qcow2 \ -append "root=/dev/sda1 console=ttyAMA0" \ -nographic \ -redir tcp:2222::22
boot.shをboot.batに変更するだけで動くかと思ったら、qemuが見つからんと言われた。 何時もの場所に鎮座してるくせにPATHが通っていない。PATHを通すのが面倒なので、 オイラーに取って明確な場所に移動させたよ。ついでに、64Bitのマシンの真似は 削除しといた。
そんなこんなで、調整したバッチは、次の通り
c:\app\qemu\qemu-system-arm.exe ^ -M versatilepb ^ -kernel vmlinuz-3.2.0-4-versatile ^ -initrd initrd.img-3.2.0-4-versatile ^ -hda debian_wheezy_armel_standard.qcow2 ^ -append "root=/dev/sda1" ^ -redir tcp:2222::22
バッチスクリプトの継続行って、unix userにはハットするような記号なのね。 それから、コンソールに何も出ないのは寂しいので、生かしてあげた。 PuTTYから、port2222、host localhostでも接続出来るぞ。ああ、バッチファイルって、 ダブルクリック出来るのね。知らんかったぞ。
後大事な注意、shutdownした後、コンソールから qemuを終了(Ctrl+Alt+q)する事。これを忘れるとプロセスが残ってCPU資源を食い潰す。 また、フルスクリーンは絶対に選ぶな。元に戻す自信が無ければ!
一応bogomipsを調べてみると、
sakae@debian-armel:~$ cat /proc/cpuinfo Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 451.99 :
気持ちvmwareを介していない分速くなったのかな?
[ 131.830923] Installing knfsd (copyright (C) 1996 okir@monad.swb.de). [ 161.164160] ipv6: Unknown symbol ip_idents_reserve (err 0) [ 162.112802] ipv6: Unknown symbol ip_idents_reserve (err 0)
bootする方も40秒程速くなってる。それじゃ、bogomipsじゃなくて、fib比べでもして みるか。
proc fib(n: int): int = if n < 2: return n return fib(n - 2) + fib(n - 1) echo(fib(42))
sakae@uB:~/src/nim-dev/t$ time ./fib 267914296 real 0m2.228s user 0m2.224s sys 0m0.000s
sakae@debian-armel:~$ time ./fib 267914296 real 0m56.227s user 0m55.970s sys 0m0.080s
armの方がi386に比べて50倍遅い。言い方を変えると、計算能力はi386の約4%しか無いって 言う方が正しいかな。でも、コードの読み易さは?
0x0000860c <+0>: push {r11, lr} 0x00008610 <+4>: add r11, sp, #4 0x00008614 <+8>: sub sp, sp, #24 0x00008618 <+12>: str r0, [r11, #-24] => 0x0000861c <+16>: mov r3, #0 0x00008620 <+20>: str r3, [r11, #-8] 0x00008624 <+24>: ldr r3, [r11, #-24] 0x00008628 <+28>: cmp r3, #1 0x0000862c <+32>: bgt 0x863c <fib_88003+48> 0x00008630 <+36>: ldr r3, [r11, #-24] 0x00008634 <+40>: str r3, [r11, #-8] 0x00008638 <+44>: b 0x868c <fib_88003+128> 0x0000863c <+48>: nop ; (mov r0, r0) 0x00008640 <+52>: mov r3, #0 0x00008644 <+56>: str r3, [r11, #-12] 0x00008648 <+60>: ldr r3, [r11, #-24] 0x0000864c <+64>: sub r3, r3, #2 0x00008650 <+68>: mov r0, r3 0x00008654 <+72>: bl 0x860c <fib_88003> 0x00008658 <+76>: str r0, [r11, #-12] 0x0000865c <+80>: mov r3, #0 0x00008660 <+84>: str r3, [r11, #-16] 0x00008664 <+88>: ldr r3, [r11, #-24] 0x00008668 <+92>: sub r3, r3, #1 0x0000866c <+96>: mov r0, r3 0x00008670 <+100>: bl 0x860c <fib_88003> 0x00008674 <+104>: str r0, [r11, #-16] 0x00008678 <+108>: ldr r2, [r11, #-12] 0x0000867c <+112>: ldr r3, [r11, #-16] 0x00008680 <+116>: add r3, r2, r3 0x00008684 <+120>: str r3, [r11, #-8] 0x00008688 <+124>: nop ; (mov r0, r0) 0x0000868c <+128>: ldr r3, [r11, #-8] 0x00008690 <+132>: mov r0, r3 0x00008694 <+136>: sub sp, r11, #4 0x00008698 <+140>: pop {r11, lr} 0x0000869c <+144>: bx lr
これ、fib関数に突入した直後。armなやつは、オペランドの一番左側が デストネーションになってて、糞石とは逆なんだよな。
そうだ、比較の為に、mipsで動いている netbsdでも、fibしてみる。残念な事に、mipsなnetbsdなんていう特殊な環境でnimは作れないので、 母艦で作ったC語を持ってきて、コンパイルです。
mips$ ls fib.c nimbase.h system.c mips$ gcc -O3 *.c mips$ time ./a.out 267914296 270.78s real 270.08s user 0.08s system
0x00401a70 <+0>: lui gp,0x2 0x00401a74 <+4>: addiu gp,gp,6288 0x00401a78 <+8>: addu gp,gp,t9 0x00401a7c <+12>: addiu sp,sp,-48 0x00401a80 <+16>: sw ra,44(sp) 0x00401a84 <+20>: sw s8,40(sp) 0x00401a88 <+24>: move s8,sp 0x00401a8c <+28>: sw gp,16(sp) 0x00401a90 <+32>: sw a0,48(s8) => 0x00401a94 <+36>: sw zero,24(s8) 0x00401a98 <+40>: lw v0,48(s8) 0x00401a9c <+44>: nop 0x00401aa0 <+48>: slti v0,v0,2 0x00401aa4 <+52>: beqz v0,0x401ac0 <fib_88003+80> 0x00401aa8 <+56>: nop 0x00401aac <+60>: lw v0,48(s8) 0x00401ab0 <+64>: nop 0x00401ab4 <+68>: sw v0,24(s8) 0x00401ab8 <+72>: b 0x401b3c <fib_88003+204> 0x00401abc <+76>: nop 0x00401ac0 <+80>: nop 0x00401ac4 <+84>: sw zero,28(s8) 0x00401ac8 <+88>: lw v0,48(s8) 0x00401acc <+92>: nop 0x00401ad0 <+96>: addiu v0,v0,-2 0x00401ad4 <+100>: move a0,v0 0x00401ad8 <+104>: lw v0,-32696(gp) 0x00401adc <+108>: nop 0x00401ae0 <+112>: move t9,v0 0x00401ae4 <+116>: jalr t9 0x00401ae8 <+120>: nop 0x00401aec <+124>: lw gp,16(s8) 0x00401af0 <+128>: sw v0,28(s8) 0x00401af4 <+132>: sw zero,32(s8) 0x00401af8 <+136>: lw v0,48(s8) 0x00401afc <+140>: nop 0x00401b00 <+144>: addiu v0,v0,-1 0x00401b04 <+148>: move a0,v0 0x00401b08 <+152>: lw v0,-32696(gp) 0x00401b0c <+156>: nop 0x00401b10 <+160>: move t9,v0 0x00401b14 <+164>: jalr t9 0x00401b18 <+168>: nop 0x00401b1c <+172>: lw gp,16(s8) 0x00401b20 <+176>: sw v0,32(s8) 0x00401b24 <+180>: lw v1,28(s8) 0x00401b28 <+184>: lw v0,32(s8) 0x00401b2c <+188>: nop 0x00401b30 <+192>: addu v0,v1,v0 0x00401b34 <+196>: sw v0,24(s8) 0x00401b38 <+200>: nop 0x00401b3c <+204>: lw v0,24(s8) 0x00401b40 <+208>: move sp,s8 0x00401b44 <+212>: lw ra,44(sp) 0x00401b48 <+216>: lw s8,40(sp) 0x00401b4c <+220>: addiu sp,sp,48 0x00401b50 <+224>: jr ra 0x00401b54 <+228>: nop
arm資料編
これからarmするにつけ、資料を探してきた
玄箱PRO、Linux ZaurusでARMアセンブリプログラミング
ARM Instruction Set Architecture