MIPS
日経コンピュータだったかで、最新CPU丸わかり(だったかな?)なんて記事が出てた。
パソコン用CPUは、インテルとAMDの2社しかない。最近猫も杓子も持っているスマホ用には ARM式のCPUしか無い。きっちり住み分けしてますなあ。パソコンはこれから衰退してく らしいけど、インテルさんとか大丈夫?(悪貨は早く撤退、、、以下自粛)
上でARM式って書いたのは、英国にあるARMの会社が、IP(設計図)をサードパーティに 売っているからだ。製造設備に巨額な資金が必要となる半導体産業の下流は、やらないよって 方針。これも生き方だなあ。頭と紙と鉛筆だけで商売出来るから。また、英国にはARMの 弟分の会社があって、ARMと合体する周辺回路のIPを売ってるみたい。
こうしてみると、米英戦争になりそうだな。PCの地盤が衰退して、スマホの地盤を米国陣営 が奪いに来たりして。
アプルなんかも、ARM社から設計図を買って、それに回路を追加してipadとかの石を作って るのね。で、いつも時代の先を読めないM$は、慌ててARM版のWindows8を出すみたい。 しかもハードも含めてね。やっぱり、アプルのまねして大きくなった会社だけあるなあ。
TV
以前、おいらの家のTVはLinuxで出来ているって書いた。そんで、シャープさんからソースを 落としてきて有ったんだけど、圧縮方法が7zとか言う、Windows寄りなのになってたんで、開くのを 躊躇してたんだ。やっと重い腰を上げて開いてみたよ。
ソースをつらつら見てもしょうがないので、Linuxのバージョンは幾つだ? 穴が有ったら 開けてみたいな。ってのと、石は何を使ってるってのを調べてみる事にする。こういうのを、俗に 暇人モードと言うらしい。
一回展開すると、sharp_diff.7z と、kernel/ が出てきた。kerlen/の中はまた7zと付属のドライバー らしいのが有ったよ。どこまで再帰してるか分からなかったので、シャープってのを展開したよ。 そしたら、diffファイルで再帰はSTOPしてくれた。
--- linux_base/.config 2009-01-20 12:11:19.000000000 +0900 +++ linux_sharp/.config 2010-08-20 16:55:37.000000000 +0900 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.18 -# Wed Aug 1 23:16:35 2007 +# Mon Feb 22 17:02:32 2010 # CONFIG_MIPS=y : +# CONFIG_TOSHIBA_TC90416REF is not set +CONFIG_TOSHIBA_TC90417REF=y # # CPU selection # -CONFIG_CPU_MIPS32_R1=y -# CONFIG_CPU_MIPS32_R2 is not set +# CONFIG_CPU_MIPS32_R1 is not set +CONFIG_CPU_MIPS32_R2=y :
カーネルバージョンは、2.6.18、石は、MIPS32のRev2ってのを使ってるのね。 TOSHIBA_TC90417 は、何かと思ったら、LCD TVを造るための必需品らしい。こういう石は自社で作るよりお隣さん から分けて貰った方が楽でいいし、コストも安く済むからねぇ。
MIPS32は、どうしてるんだろう? IP (設計図)を買って来て、自社で石を起しているのかしら? MIPSアーキテクチャ を見ると、組み込み用の石を販売してるメーカーも多そうだから、買ってきちゃった方が早いよね。
Spim or Mars
とまあ、身近にMIPSが有る事が分かった。糞石よりもずっと親近感が有るな。手元には、Rubyの会の 高橋会長ご推薦本 Cとアセンブラで学ぶ計算機プログラミングの基礎概念 が有ったりする。もう一度読み返して、手を動かしてみようかな。それには環境が要るな。
昔、 spimを入れてたはずなんだけど、パソコンを 入れ替えた時になくなっていたんで、もう一度入れなおした。いつの間にかqtspimなんてのが リリースされてたよ。このソフトのHelpは、なかなかよく書いてあるな。これだけでMIPSが どんなのかは分かるよ。
生憎、英語は苦手で上に上げた本が無いって人は、ちょっと硬めだけど、 マイクロプロセッサおよび演習 なんてのが好いと思うぞ。
spimをわざわざインストールするのはいやだって人は、 marsを試してみればよい。 ファイルがたった1個だけなんで、超楽だぞ。使い方は
C:\homes\WORK>java -jar Mars_4_1.jar
だけ。こちらもHelpが親切になってる。素直な石なんで、CPUの勉強にはうってつけ。 大学関係では、ひっぱりだこってのが肯けます。
QEMU de MIPS
spimやmarsもいいんだけど、やっぱりOSが動かないとつまんないぞ。(と、梯子を外すような事を 言ってみる)さてどうすべ? VMWAREにMIPS版は無いし、仮想箱はOSSだから有るかと思ったら、 やっぱりINTELに侵略されてるし。。。
半日考えて、QEMUなんてのが有ったなと思い出した。ぐぐってみたら、やっぱり奇特な人が おられましたよ。
QEMU de Linux MIPSして、TLBの ミスハンドラ見るんですって。参考にさせてもらいましょ。 まんま、やってみた。(使った土台は、Linux MIPSと相性が良さそうなArchLinux)
% git clone git://git.qemu.org/qemu.git qemu_git % cd qemu_git % ./configure --target-list=i386-softmmu,mipsel-softmmu,arm-softmmu (ターゲット名は ./default-configs/以下の .makファイル名.) % make 2>&1 |tee qemu_build.log % sudo paco -D make install
上記では、arm-softmmuも指定してるけど、アプル臭くなるんで今回は割愛したよ。でも エラッんだ。何でも、vncうんたらがリンクできねーってほざくんで、configureで無効にして プチ身軽にしたよ。
% cd gdb-7.2 % mkdir build_mips && cd build_mips % ../configure --target=mipsel-linux-elf \ --prefix=/home/syohei/local/mipsel_tools --disable-nls % make 2>&1 |tee build_mips.log % make install
gdbも同じ版のやつを入れた。なーんにも独自性は無し。続いて 試供品のLinuxである、mipsel版を取ってきて展開し、その 中へ入る。起動スクリプトが用意されてたよ。
[sakae@archbang mipsel-test]$ cat run-qemu #!/bin/sh # set -e # Set this if your qemu-system-mipsel isn't in the search path. #qemupath=/home/ths/qemu/qemu-work/mipsel-softmmu/ # Comment this out if you want to start debian-installer from the initrd # (it installs via net from debian mirrors). Make sure to use kernel and # initrd images which match the kernel ABI version you will install: # vmlinux-2.6.18-3-qemu means kernel version 2.6.18, module ABI revision 3. initarg="init=/bin/sh" # Another useful line for booting an installed image #initarg="root=/dev/hda1" # Maybe define an empty disk image to install Debian onto. The standard # install in LVM fails for very small disks, so use e.g. # "qemu-img create disk_hda 1G" to create the image. disk_hda="-hda disk_hda" time \ ${qemupath}/qemu-system-mipsel \ -kernel vmlinux-2.6.18-3-qemu \ -initrd initrd.gz \ -append "console=ttyS0 $initarg" \ -nographic \ -m 128 \ $disk_hda
ほー、何でも有りのデビアン様だと、MIPS版のQEMUが用意されてんかと感心しつつ、先輩に 習って、こんなのを
[sakae@archbang mipsel-test]$ cat launch #!/bin/sh qemu-system-mipsel -S -s -kernel vmlinux-2.6.18-3-qemu \ -initrd initrd.gz \ -append "root=/dev/ram console=ttyS0 init=/bin/sh" \ -nographic -M 'mips' \ -m 128
をrunさせると
[sakae@archbang mipsel-test]$ ./launch qemu: Warning, could not load MIPS bios 'mipsel_bios.bin'
何やら不穏なお告げが。。。で、神のお告げを聞いてみた。
dd if=/dev/zero of=/usr/local/share/qemu/mipsel_bios.bin bs=1024 count=128
128Kの白ROMと言うか裏ROMと言うかFake ROMを用意しろとな。白ROMをセットしてから、Linuxを 起動。やおら、別端末から
[sakae@archbang mipsel-test]$ mipsel-linux-elf-gdb vmlinux-2.6.18-3-qemu GNU gdb (GDB) 7.2 : Reading symbols from /home/sakae/mipsel-test/vmlinux-2.6.18-3-qemu...(no debugging symbols found)...done. (gdb) target remote :1234 Remote debugging using :1234 0x8028b000 in kernel_entry () (gdb) break *0x80000000 Breakpoint 1 at 0x80000000 (gdb) c Continuing. Breakpoint 1, 0x80000000 in ?? ()
動きだしましたねぇ。気分はリモート接続してのカーネルデバックですよ。
(gdb) x/10i $pc => 0x80000000: lui k1,0x802d 0x80000004: mfc0 k0,c0_badvaddr 0x80000008: lw k1,8216(k1) 0x8000000c: srl k0,k0,0x16 0x80000010: sll k0,k0,0x2 0x80000014: addu k1,k1,k0 0x80000018: mfc0 k0,c0_context 0x8000001c: lw k1,0(k1) 0x80000020: srl k0,k0,0x1 0x80000024: andi k0,k0,0xff8 (gdb) info reg zero at v0 v1 a0 a1 a2 a3 R0 00000000 10008400 00000001 802bef00 802bef00 0000000f c0000000 802c0000 t0 t1 t2 t3 t4 t5 t6 t7 R8 00000400 00006b98 00000000 00000001 8111c3a0 ffffffff 802af164 00000002 s0 s1 s2 s3 s4 s5 s6 s7 R16 802c0000 00000000 00000000 80230000 fffffffe 802b0000 802b0000 802b0000 t8 t9 k0 k1 gp sp s8 ra R24 00000010 8001d2b0 81139f48 81139f48 81138000 81139f38 81139f78 800fd394 sr lo hi bad cause pc 10008403 bbd3ab00 08b05ec8 c0000008 0000000c 80000000 fsr fir 00000000 00000000
対向するLinuxもちゃんと動いてますよ。
: NE*000 ethercard probe at 0x300: 52 54 00 12 34 56 eth0: NE2000 found at 0x300, using IRQ 9. Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx hdc: QEMU DVD-ROM, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 pktgen v2.67: Packet Generator for packet performance testing. TCP bic registered NET: Registered protocol family 1 NET: Registered protocol family 17 RAMDISK: Compressed image found at block 0 VFS: Mounted root (cramfs filesystem) readonly. Freeing unused kernel memory: 132k freed BusyBox v1.1.3 (Debian 1:1.1.3-3) Built-in shell (ash) Enter 'help' for a list of built-in commands. /bin/sh: can't access tty; job control turned off ~ # pwd / ~ # ls bin floppy lib proc tmp dev init mnt sbin usr etc initrd preseed.cfg sys var ~ #
デビアン様の組み込みシェルには、どんなコマンドが有るのかな、ちょっと気に なったぞ。
~ # help Built-in commands: ------------------- . : bg break cd chdir command continue echo eval exec exit export false fg getopts hash help jobs kill let local pwd read readonly return set shift times trap true type ulimit umask unset wait
で、Linux止めるにはどうすんの? 取り合えず貝殻の外へ出よう。Ctrl-Dしたよ。 そしたら、パニクッて止まった。そこですかさず、
Program received signal SIGINT, Interrupt. 0x800316a8 in panic () (gdb) x/10i $pc => 0x800316a8 <panic+356>: bnez v1,0x800316a8 <panic+356> 0x800316ac <panic+360>: addiu v1,v1,-1 0x800316b0 <panic+364>: addiu a0,s1,1 0x800316b4 <panic+368>: j 0x80031690 <panic+332> 0x800316b8 <panic+372>: addu s1,v0,a0 0x800316bc <panic+376>: j 0x8003166c <panic+296> 0x800316c0 <panic+380>: lui s3,0x802b 0x800316c4 <panic+384>: addiu v0,v0,4816 0x800316c8 <panic+388>: j 0x800315d4 <panic+144> 0x800316cc <panic+392>: sw v0,-5868(s2)
回れ回れ回れっぽいぞ。