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)

回れ回れ回れっぽいぞ。