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命令セット概要

ARM Instruction Set Architecture

Quick finder

ARM instruction evaluator

ARM Instruction Sets

ARM Assembly language Programming

iPhoneプログラミング資料