2011-12-24
MIPSのAndroid 4.0のemulatorをビルドしてみた
MIPSのAndroid 4.0のソースコードが公開されたので、emulatorをビルドして動かしてみました。
準備
http://developer.mips.com/android/getting-started-with-android/
に書いてありますが、すでにAndroid 4.0をビルドしたことがあれば飛ばしても大丈夫です。
ソースコードの取得
http://developer.mips.com/android/android-source-code/
$ mkdir android-mips $ cd android-mips/ $ repo init --repo-url=git://github.com/MIPS/repo.git --repo-branch=stable -u git://github.com/MIPS/manifests.git -b mips-ics-mr1 -m mips-ics-4.0.3_r1m2.xml $ time repo sync -j4
一時間くらいかかりました。
real 54m38.700s user 7m57.080s sys 1m34.040s
ビルドの環境設定
http://developer.mips.com/android/android-porting-guide/
を見ながら
$ cat env.sh export ANDROID_JAVA_HOME=/usr/lib/jvm/java-6-sun #kexport ANDROID_JAVA_HOME=/usr/lib/jvm/jdk1.6.0_25 export JAVA_HOME=$ANDROID_JAVA_HOME export PATH=$JAVA_HOME/bin:$PATH export TARGET_ARCH=mips export TARGET_PRODUCT=generic export TARGET_ARCH_VARIANT=mips32r2-fp source build/envsetup.sh setpaths settitle
ビルド
$ . env.sh $ time make -j8 2>&1 |tee make.log dalvik/vm/Android.mk:53: *** MIPS JIT is untested, please recompile with WITH_JIT=false. Stop.
おや? WITH_JIT=falseをつけろということなので
$ time make -j8 WITH_JIT=false 2>&1 |tee make.log
real 33m36.706s user 253m25.990s sys 13m7.410s
起動
環境設定してあるので簡単に起動できます。
$ emulator
これでもいいですが、以下のようにすると便利です。
$ emulator -shell -show-kernel
とにかくcpuinfoを見てみると
# cat /proc/cpuinfo system type : MIPS-Goldfish Hardware : goldfish Revison : 1 processor : 0 cpu model : MIPS 24Kc V0.0 FPU V0.0 BogoMIPS : 1042.02 wait instruction : yes microsecond timers : yes tlb_entries : 16 extra interrupt vector : yes hardware watchpoint : yes, count: 1, address/irw mask: [0x0ff8] ASEs implemented : shadow register sets : 1 core : 0 VCED exceptions : not available VCEI exceptions : not available #
確かにMIPSで動いています。
その他のログは以下にまとめました。
http://kobablog.wordpress.com/2011/05/26/boot-logs-of-various-android-devices/
Androidをビルドしているときのvmstat
Androidをビルドしているときのvmstatを見てみました。
$ make -j8
topで見ると、idleは0.2%ですからCPUはフル稼働状態です。
$ top top - 15:01:42 up 3 days, 21:16, 11 users, load average: 7.81, 5.58, 2.74 Tasks: 256 total, 8 running, 247 sleeping, 0 stopped, 1 zombie Cpu(s): 94.7%us, 5.1%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 24735252k total, 24051252k used, 684000k free, 910396k buffers Swap: 36104184k total, 164k used, 36104020k free, 19716008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 15127 koba 20 0 60764 53m 6156 R 47 0.2 0:01.42 cc1plus 15155 koba 20 0 65132 56m 4040 R 32 0.2 0:00.96 cc1plus 15180 koba 20 0 50680 43m 6056 R 25 0.2 0:00.76 cc1plus 15198 koba 20 0 44036 34m 3368 R 17 0.1 0:00.50 cc1plus 15208 koba 20 0 21872 14m 3312 R 6 0.1 0:00.17 cc1plus 15216 koba 20 0 20948 11m 2336 R 3 0.0 0:00.09 cc1plus 9812 koba 20 0 343m 334m 988 S 2 1.4 0:26.25 make 14514 koba 20 0 19356 1536 1064 R 0 0.0 0:00.04 top 15125 koba 20 0 2232 800 688 S 0 0.0 0:00.01 mips-linux-gnu- 15154 koba 20 0 2232 800 688 S 0 0.0 0:00.01 mips-linux-gnu- 15179 koba 20 0 2232 796 688 S 0 0.0 0:00.01 mips-linux-gnu- 15197 koba 20 0 2232 800 688 S 0 0.0 0:00.01 mips-linux-gnu- 15207 koba 20 0 2232 796 688 S 0 0.0 0:00.01 mips-linux-gnu- 15215 koba 20 0 2232 796 688 S 0 0.0 0:00.01 mips-linux-gnu- 15225 koba 20 0 2232 800 688 S 0 0.0 0:00.01 mips-linux-gnu- 1 root 20 0 23844 2000 1296 S 0 0.0 0:01.77 init 2 root 20 0 0 0 0 S 0 0.0 0:00.01 kthreadd 3 root RT 0 0 0 0 S 0 0.0 0:00.04 migration/0 4 root 20 0 0 0 0 S 0 0.0 0:01.24 ksoftirqd/0 5 root RT 0 0 0 0 S 0 0.0 0:00.00 watchdog/0 6 root RT 0 0 0 0 S 0 0.0 0:00.04 migration/1 7 root 20 0 0 0 0 S 0 0.0 0:00.68 ksoftirqd/1 8 root RT 0 0 0 0 S 0 0.0 0:00.00 watchdog/1 9 root RT 0 0 0 0 S 0 0.0 0:00.04 migration/2 10 root 20 0 0 0 0 S 0 0.0 0:00.72 ksoftirqd/2
この状態で5秒間隔でvmstat
$ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 9 0 164 471372 907440 19988556 0 0 3 16 3 15 1 0 99 0 8 0 164 415256 907504 19992704 0 0 0 34 931 2114 97 3 0 0 8 0 164 410576 907548 19996256 0 0 0 40 884 1952 98 2 0 0 8 0 164 477548 907592 19999340 0 0 1 3834 939 2125 96 4 0 0 8 0 164 341800 907728 20006160 0 0 17 34 990 2337 94 5 1 0 8 0 164 149500 907476 19915612 0 0 0 59 996 2563 93 6 1 0 8 0 164 209964 907516 19917688 0 0 0 2434 928 1990 96 3 0 0 8 0 164 452184 907560 19921892 0 0 0 37 911 2034 97 3 0 0 8 0 164 301884 907760 19931832 0 0 70 38 1015 2519 94 5 1 0 8 0 164 146520 908096 19814632 0 0 156 2224 980 2191 94 5 1 0 8 0 164 130120 908160 19674076 0 0 0 125 987 2303 94 4 2 0 8 0 164 166300 908204 19642196 0 0 0 43 935 2104 94 5 1 0 8 0 164 722584 908220 19590068 0 0 2 3089 924 2042 96 4 0 0 8 0 164 787076 908376 19589936 0 0 2 50 1136 3178 92 6 2 0 8 0 164 955912 908576 19595072 0 0 3 99 1221 3704 90 8 2 0 8 0 164 957420 908692 19605228 0 0 1 3505 1052 2554 93 6 1 0 8 0 164 893804 908816 19615480 0 0 1 48 1063 2673 92 7 1 0 8 0 164 756320 908876 19622952 0 0 0 57 932 2094 96 3 1 0 8 0 164 680928 908932 19631892 0 0 0 3993 882 1846 97 3 0 0 8 0 164 780432 909084 19637056 0 0 1 49 1153 3157 91 7 2 0 8 0 164 701572 909192 19643588 0 0 34 54 1083 2803 94 5 1 0 8 0 164 730336 909328 19650244 0 0 2 5230 1103 3050 85 6 8 1 ^C
注目すべきはcacheの大きさとbiの少なさです。こんなに激しくコンパイラを動かしているのにbi(ブロックデバイスのinput)がゼロのときがあります。
ディスクキャッシュが有効に働いているのですね。
このマシンはメモリを24GB搭載していますが、19GB以上がディスクキャッシュとして使用されているようです。
ディスクは普通のSATAのハードディクを使っていますが、ディスクの速度はボトルネックではないので、これをSSDに換えてもビルドの時間はほとんど変わらないでしょう。また、メモリの一部を使ってramdiskにするのも特に効果はないと思います。
git fetchしている時のvmstat
Androidのソースコードをrepo syncしている間、暇なのでvmstatで見てみました。
画面はこんな表示。
Receiving objects: 83% (19179/22951), 1.34 GiB | 3.11 MiB/s
この時に、5秒間隔でvmstatを見てみると
$ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 164 147432 3037248 18456456 0 0 3 13 3 15 1 0 99 0 0 0 164 133784 3037256 18470024 0 0 0 14493 1425 1187 1 0 98 0 1 0 164 131980 3033464 18476732 0 0 0 6 2494 2549 3 1 96 0 0 0 164 136756 3033348 18473156 0 0 0 2 2069 1999 2 1 97 0 0 0 164 126548 3033352 18483120 0 0 0 11798 1139 1100 1 1 98 0 1 0 164 129020 3033356 18481716 0 0 0 6 938 917 1 0 98 0 0 0 164 130828 3033360 18480840 0 0 0 2 996 981 1 0 99 0 1 0 164 126320 3033364 18485720 0 0 0 2 1090 1060 1 0 99 0 0 0 164 130204 3033356 18482972 0 0 0 2 1294 1117 2 1 98 0 0 0 164 128856 3033308 18484564 0 0 0 2 1522 1402 2 1 97 0 0 0 164 128188 3033308 18486396 0 0 1 14345 1728 1576 2 1 97 0 0 0 164 131608 3031924 18485044 0 0 0 6 1497 1407 1 1 98 0 0 0 164 125304 3031932 18491208 0 0 0 2 1212 1140 1 1 98 0 1 0 164 128248 3031936 18489536 0 0 0 7991 1206 1159 1 0 98 0 0 0 164 127892 3031936 18490784 0 0 0 7 1175 1162 1 0 99 0 0 0 164 125928 3031940 18492400 0 0 0 2 1079 1080 1 0 99 0 0 0 164 127632 3031940 18491408 0 0 0 3 1090 1081 1 0 99 0 0 0 164 130716 3028944 18492076 0 0 0 2 892 890 1 0 99 0 0 0 164 129272 3024488 18498204 0 0 0 2 816 801 1 0 99 0 0 0 164 130132 3018444 18503204 0 0 1 11198 821 786 1 0 99 0 0 0 164 128836 3013844 18509180 0 0 0 9 799 732 1 0 99 0 0 0 164 126888 3009244 18516172 0 0 0 2 906 807 1 0 99 0 0 0 164 128004 2997812 18527892 0 0 0 4 1373 1172 1 1 98 0 2 0 164 129796 2983220 18541672 0 0 0 2 1897 1808 2 1 97 0 0 0 164 139308 2963748 18552716 0 0 0 2 1719 1632 2 0 98 0 1 0 164 129724 2959224 18567140 0 0 0 15171 1539 1465 1 1 98 0 0 0 164 127868 2950344 18578608 0 0 0 9 1360 1338 0 0 99 0 0 0 164 125748 2945892 18584632 0 0 0 2 864 862 0 0 99 0 0 0 164 132608 2934880 18590036 0 0 0 10 853 772 1 0 99 0 0 0 164 129624 2928032 18600588 0 0 0 2 1236 1091 1 1 98 0 0 0 164 140760 2910112 18608480 0 0 0 2 1415 1371 2 1 98 0 0 0 164 127120 2910124 18622000 0 0 1 13694 1356 1306 0 0 99 0 0 0 164 127276 2899040 18634108 0 0 0 6 1428 1366 1 1 98 0 0 0 164 126904 2887636 18646344 0 0 0 2 1458 1330 2 1 98 0 0 0 164 132128 2871572 18657736 0 0 0 11 1497 1392 1 1 98 0 0 0 164 128364 2864984 18668860 0 0 0 2 1212 1173 1 0 99 0 0 0 164 134112 2853948 18674440 0 0 0 2 929 918 1 0 99 0 0 0 164 130292 2849404 18683032 0 0 0 14902 999 898 2 0 98 0 0 0 164 126992 2844860 18691280 0 0 0 6 1005 944 1 0 99 0 0 0 164 125360 2840344 18697464 0 0 0 2 833 827 1 0 99 0 0 0 164 127632 2835816 18700148 0 0 0 14 502 495 0 0 99 0 0 0 164 132848 2828984 18702336 0 0 0 5 461 452 1 0 99 0 0 0 164 128508 2828992 18706796 0 0 0 2 561 526 0 0 99 0 0 0 164 129012 2822088 18713436 0 0 0 2 913 861 1 0 99 0 0 0 164 129856 2815432 18719964 0 0 0 2 825 755 1 0 99 0 0 0 164 132416 2808524 18724208 0 0 0 2 738 734 1 0 99 0 0 0 164 128820 2808532 18727816 0 0 1 11070 497 493 0 0 99 0 ^C
CPUとしてはほとんどidle状態。時々bo(ブロックデバイスの書き込み)が大きな値がでます。git fetchがまとめてディスクに書き込んでいるのですね。
ちなみに
remote: Compressing objects: xx%
と出ているときには、サーバ側が仕事をしていて、こちら側は完全にidleでした。



