2015年1月9日金曜日

Getting ARM OABI environment after such a long time :-/

Background

Unfortunately, I need to use very very old ARM OABI Linux environment to salvage data from XFS used by broken NAS. XFS is designed to be compatible between platforms, but for some reasons, it was incompatible only with ARM OABI environment. As you may know, OABI used a curious middle endian and struct layout. It's a very old story around Linux kernel 2.6.1x, or so. But, it affects my HDL-GT1.0 actually. Linux box can not show any file entries even if the disk can be mounted, and xfs_repair has no power to solve the problem.
FYI, the first KURO BOX that was sold in Japan also used ARM OABI, but later versions used ARM EABI, AFAIK.

Basic Strategy

Install debian 4.0 (etch) onto QEMU. Etch was already out of maintenance, but this is the best choice since HDL-GT1.0 looks using the Linux that was based on it. Also there is enough information to install it onto QEMU, e.g. this site (*1). Debian 5.0 (lenny) provided two versions, OABI and EABI for ARM, but the next 6.0 (squeeze) had only EABI. Anyway these all were out of maintenance. There were no benefit to choose others.

How to Install

I used Ubuntu 14.04.1 with QEMU that is installed by "apt-get install qemu". Basically, I just followed the way described at (*1). But some tricks were needed since the information was already out of date, and meanwhile, etch was removed from the official place.

Boot files

Two mandatory files distributed at (*1) were also removed. I found them from web.archive.org. I can download them, but it seems that the server sometimes return 404 against them. Anyway, if you were lucky enough, you will be able to get them.
 Also, etch's initrd.gz was fetched from archive.debian.org/. The first initrd.img-2.6.18-6-versatile was used after installation, and the second initrd.gz was used on installation.

Use a manually chosen mirror site

Since etch was removed from the original place, I should specify an archive site manually. Mirror site name was archive.debian.org, and the path was default, /debian/. Here are some screen shots.
If you chosen one of default mirror sites, the installer will ask you to pick up a version of debian distributions from recent two or three choices that must use EABI.

Other Notices

In the page (*1),  that picture for the question "Continue without installing a kernel?" looks like the answer should be "<No>". But "<Yes>" is the right answer here.
Also, there is a critical issue to me. The provided kernel did not enable xfs support. So, even I install xfsprogs package and so on, xfs can not be mounted. According to the article, I can build kernel by myself. So, I'll try it next.
FYI, xfs_repair seems not working fine, but anyway it does not crash. Here, QEMU is launched with additional flags "-hdb HDL-GT-md13.img" here.
# apt-get install xfsdump  # it will install dependent xfs related packages including xfsprogs
# xfs_repair /dev/sdb  # it works somehow?

Kernel build

Let's build a kernel to support XFS. The system contains minimum set of packages. So, we need following packages to build the kernel at least. There are two choices, 2.6.18 and 2.6.24, but choose 2.6.18 that the original installation bases on.
# apt-get install make gcc linux-source-2.6.18 kernel-package build-essential libncurses5-dev initrd-tools
Then, prepare source files.
# cd /usr/src
# tar jxf linux-source-2.6.18.tar.bz2
# cd linux-source-2.6.18
Kernel 2.6.18 has a config template file for versatile. Here, we use it as a baseline, then enable XFS support in addition.
# make versatile_defconfig
# make menuconfig
In the menu, enable a following items. I'm not sure if this is the exactly necessary and sufficient condition. But at least, it is sufficient:)
  • Bus support ---> PCI support [built-in]
  • Device drivers ---> SCSI device support ---> SCSI device support [module]
  • Device drivers ---> SCSI device support ---> SCSI disk support [module]
  • Device drivers ---> SCSI device support ---> SCSI tape support [module]
  • Device drivers ---> SCSI device support ---> SCSI generic support [module]
  • Device drivers ---> SCSI device support ---> SCSI low-level drivers ---> SYM53C8XX Version 2 SCSI support [module]
  • File systems ---> Ext3 journalling file system support [module]
  • File systems ---> XFS filesystem support [module]
  • File systems ---> XFS Quota support [built-in]
  • File systems ---> XFS Security Level support [built-in]
  • File systems ---> XFS POSIX ACL support [built-in]
  • File systems ---> XFS Realtime subvolume support [built-in]
  • File systems ---> Filesystems in Userspace support [module]
  • File systems ---> Pseudo filesystems ---> Virtual memory file system support (former shm fs) [built-in]
  • File systems ---> Pseudo filesystems ---> Tmpfs POSIX Access Control Lists [built-in]
  • File systems ---> Pseudo filesystems ---> Userspace-driven configuration filesystem (EXPERIMENTAL) [module]
  • File systems ---> Native language support --> Japanese charsets (Shift-JIS, EUC-JP) [module]
  • File systems ---> Native language support ---> NLS UTF-8 [module]
then save and exit the menuconfig. Let's build the kernel.
# make dep
# make modules && make zImage && make modules_install && make install
# mkinitrd -o /boot/initrd-2.6.18.img 2.6.18
Now dependent modules should be installed into the internal file system, and kernel and initrd images that can be specified on launching QEMU are created. The kernel image should be placed at arch/arm/boot/zImage, and initrd image is /boot/initrd-2.6.18.img as you specified at the last command. I copied them to the host machine via scp. After shutting down the emulated ARM system, launch the system again with these new images, as
# qemu-system-arm -M versatilepb -kernel zImage -initrd initrd-2.6.18.img -hda hda.img -hdb want-to-read-fs-in-xfs.img -append "root=/dev/sda1"
The resolution of the boot console is finer than the original, and linux logo is not used. But anyway, it boots. Once you login the system, it will support XFS correctly, and it is exactly the XFS that is not compatible with current XFS. In my case, I launched QEMU with "-hdb HDL-GT-md13.img", then it can mount the image correctly.
# mount /dev/sdb /mnt
# ls -l /mnt
drwxr-xr-x 6 root  root  88 May 16  2012 share
drwxr-xr-x 6 root  root  88 May 16  2012 spool
Yep!

Lennyは新しすぎた

Etchでkernelの設定を変えて色々試してる間にLennyのイメージを見つけたので試してみた。XFSがデフォルトでオンになってたので期待したんだけど、互換性問題が修正された後のバージョンのようだ=Etch/OABI XFSは読めなかった、という残念な日記。

https://web.archive.org/web/20130605075901/http://people.debian.org/~aurel32/qemu/arm/

web.archive.orgにLennyのARM OABIイメージが残ってた。README.txt通りに起動すればXFSが有効になったカーネルで起動できるので、-hdbでイメージを渡せば普通にマウント可能。ただ、xfs_repairとかインストールされてないので、ちょっと作業が必要。

ちなみに運が良ければ、
# mount /dev/sdb /mnt
# ls -l /mnt
でメタ情報含めて正しく見えれば勝利。駄目だったらツール使ってfile systemの修復。まずは、このままだとaptが使えないので、/etc/apt/sources.listを編集。
deb http://archive.debian.org/debian/ lenny main
を追加すればOK。
# apt-get update
# apt-get install xfsprogs
あとは程度次第だとは思うんだけど、
# xfs_repair /dev/sdb
これで駄目なら
# xfs_repair -L /dev/sdb
あたりをマウント解除した状態で実施。で、僕の場合は最初から最後まで治らず。例のページにあったように shareというディレクトリ名は出てくるけど、メタデータが壊れて見えてる状況。xfs_repairはエラーなしで綺麗に終わったんだけど。

HDL-GTはEtchらしいのでバージョン揃えて試す作業を継続してみる。こっちは配布されてたイメージでXFSがONになってないので、kernelとinitrd.imgを作り直して見てるんだけど、boot中にpanicが出て、少しずつ修正しながらもうちょいでinitが走り出しそうなとこまで来たとこ。QEMU内でのkernel buildに時間かかってTATが……。

追記:HDL-GTのkernelは2.6.12.6ベースで予想通りOABIを使用、XFSまわりのkernel configは以下の通り。
CONFIG_XFS_FS=y
CONFIG_XFS_RT=y
CONFIG_XFS_QUOTA=y
# CONFIG_XFS_SECURITY is not set
CONFIG_XFS_POSIX_ACL=y

2015年1月8日木曜日

12月の読書

12月は14冊。読み終わらなかったもの、全巻読み終えてないものとかあるけど、わりと面白い本が見つかった。ちなみに年間通算では141冊。

娯楽

Apple II本は参考になるかな、と思って読んでみたんだけど、思いの外面白かった。同僚がAppleの歴史の中で語られたりしていて、やっぱすげーなー、とか思った。
しかしWozはやっぱり凄いけど、バランス感覚はないんだろうなぁ。気持ちは凄くわかるんだけど。技術的な資料としても価値のある良い本でした。

続いて成毛さんの歌舞伎本。教養としての歌舞伎を丁寧に説明しているし、何よりも読んでいてワクワクしてくる。読み終わると同時に歌舞伎手帳とオペラグラス、そしてチケットを購入。年末に見てきましたけど面白かった。これは確かに趣味として良いかも。しかし客層に驚いた。もちろん年配の方がメインではあるんだけど、20代くらいの若者も沢山いた。クラシックコンサートなんかよりずっと活気ありますね。

教養

ファスト&スローは認知心理学の権威による著書。
人の判断にまつわる研究の成果を詳しく記した本。ファスト&スローと言われると脊髄反射と脳かと早とちりするけど、実際には脳を構成する2つの思考システムのこと。ファストは直感的な判断を司る自動運転プログラム群、システム1。スローはいわゆる人間的な知的決断を下すシステム2。それぞれのシステムの持つ長所と短所。問題の解決に関してそれぞれのシステムがどう関与するかが詳しく調べられている。
上巻で見られる大きな結論としては、人の脳は統計的に正しい判断を行う事が大変難しいシステムだ、という事。本質的には偏見を避けることはできず、余程の注意と教養を持ってしても是正は困難。
また、言ってみれば脳の脆弱性とも言える問題点が数多く紹介されているが、これらの弱点を突くことで印象操作や洗脳といった事がいともたやすく実践されうるし、実際マーケティングなどの分野では既に広く使われている。政治や宗教に転用されれば、戦争や虐殺にも繋がる。ある意味、核より恐ろしい研究かもしれない。
有名な平均回帰の話や、投資のプロの実力は猿以下という話も書かれていた。
しかし脳の仕組みというのは思っている以上に組織や計算機の構成法に似ている。それがこの世界の物理法則の上でやっていく最適な方法だからなのか、人の持つ先入観が計算機の設計や脳の理解に影響した結果なのかは興味深いところ。下巻は入手済みで1月に読む予定。

ギリシャ哲学の方は、哲学っていうより、ギリシア逸話集くらいの気持ちかな。結果として哲学者の話が多く出てくるってくらいで。しっかし、ソクラテスがこんなアホっぽい理由で処刑されてるとは知らなかった。巫女のお告げで一番頭の良い人間って言われて、それを信じなくて神への不遜を裁かれたのね。カッコよすぎ。あと、ドラクエIIIの巫女の元ネタってこういうとこにあったのね、とか。気軽に楽しめた一冊。

経済

資本論はGoogle Booksの安売りか何かで入手した電子書籍。マルクスの私生活の様子も含めて書かれてました。マルクスがこんなダメ人間だったとは思わなかった。働いたら負けだと思ってる、でもメイドさんは必須。そして奥さん大好きだけど、メイドさんも孕ませる。贅沢癖があって、でも同時に貧困に喘いで子供を栄養失調で亡くす。そして生涯に渡りエンゲルスにパラサイト。字が汚すぎて資本論2巻移行は本人の死後何年もかけて清書されて出版される、などなど。共産主義のイメージ変わるわー。

最後の本は半導体業界本。ところどころ筆者の私怨が見え隠れするのがマイナスポイント。素直といえば素直なんだけど。
イノベーションをただの技術革新だと勘違いしている日本の問題は同感。基本的には強い技術(シーズ)は強いマーケティングとセットにならないと機能しない。常にメリット・デメリットを併せ持つ新技術が、マーケティングの力を借りてキャズム越えを実現するのが破壊的イノベーション。
ピーターの法則については著者も独自に気づいたって点を強調してて、内容に関しては甘いな、という印象。いまや誰でも知ってることだし、その対策については色々と企業の中で実践されつつある。
成長率の話になると、少子化、高齢化問題は避けて通れない。高齢化問題に対して人道的な解を見つけるのは難しいな、とつくづく思う。特に社会の縮図として高齢化問題が濃縮された大手企業、今そこに若者が飛び込むのは自殺行為以外何者でもないな、と思わざるを得ない。大手は一度潰すのが正解なんだろうな。
あと、著者の経験談から、組織再編って局面では有能な経営者は本当に有能なんだな、と思った。けど、事業の未来を読む、という局面では、やはり誰がやってもサイコロなのかな、とも。それこそ猿より無能な一流トレーダーじゃないけど。

2015年1月6日火曜日

HDL GT(つかの間の)復旧

今後必要になる情報とも思えないけど、一応記録を。

我が家で使ってる安全なストレージは主に3種類あって

  • HDL-GT(250GBx4でRAID5):妻のデジタル原稿、家族の写真とか過去のライブ動画、あと大量の音源など。昔はこれがストレージのメインだったけど、数年前にRAID崩壊して業者に復旧してもらってからは新しいデータはほぼ置いていない。
  • サーバマシン(2TBx2でRAID1):キューブマシンにHDD詰め込みたくないしで復旧も楽なRAID1のミラー構成。サーバ上で動いてる複数のVMのイメージもこの上に置かれてる。HDL-GT復旧時のコピーもここにあるにはある。HDL-GT側をnfs serverとしてハックしてあって、autofs使ってrsyncできるようにしてあったんだけど、syncはマニュアルでごくたまに。今思えばautofsが悪さしてた可能性も。
  • Google Drive:最近は写真とか勝手にクラウドにいってくれるし、データとかもドライブにぽいぽい突っ込んでる。VMイメージ置くには辛いけど、それ以外の用途ではこいつが本命。
で、HDL-GTが再びRAID崩壊を(半年ほど前に)起こして、このまま引退してもらおうと思ったら年賀状のための住所録がそこに、という話。すみなせん、今年の年賀状は例年以上に遅かった。

崩壊としてはそれほど酷い状況じゃないはずで……というのも、HDL-GTをほとんど使ってないのと、そもそも一番上のスロット1の受け側が壊れかけててディスクに異常がなくても頻繁にRAID再構成が起きてたような状況でした。今回はOSハングから強制リブートした際に、スロット1が再構成中、さらにスロット3のタイムスタンプがズレていて同期できない、というもので、おそらく物理的には破損してないはず。この辺(検討の際に色々と参考にさせてもらったページ)にディスク構成について詳しい説明がありますが、システム周りのパーティションは4台全てでミラーした4重化RAID1で、4台中3台以上が一致してないとブートしてくれなくなっちゃうという。せっかく4重化してるなら多数決で良きに計らってくれれば嬉しかったんだけど……。OSハングは具体的にはtelnetするとloginプロンプトまではいくけど、ログイン時にToo many open filesが出てbashがあがらないという状況でした。

で、目論見としてはmadamでスロット2〜4を強制的に同期させればブート可能かつデータのRAID5も再構成可能な状況になるよね、という期待。あとはバックアップしてから作業するか、適当にトライして失敗したらデータは諦めるか、なんだけど。ちょっと住所録失うのは怖かったのでバックアップする事に。3TBのディスクを1万ちょっとで購入して、作業後はサーバの定期的なバックアップに流用する事にしました(ミラーだけだと心もとないので)。

作業に使ったマシンはWindows 7と共にほぼ忘れ去られていたHP ProLiant ML115。こんなこともあろうかと、というやつですね。なぜかこういう事する人はみんな持ってる不思議なマシン。

まずはバックアップの手順。Windows 7からダウンロードしてきたUbuntu 14.04.1のイメージを焼いてパワーオフ。違いがあるかわからないけど、イメージはサーバ版を使いました。念のため。SATA1のディスクを新しい3TBのものに差し替えてDVD起動&インストール、パワーオフ。
続けて、SATA2/3にHDL-GTのスロット1/2を追加した状態でSATA1にインストールしたUbuntuから起動。
# dd if=/dev/sdb of=/opt/backup/HDL-GT-slot1-sdd ibs=512 obs=512 conv=noerror,sync 
# dd if=/dev/sdc of=/opt/backup/HDL-GT-slot2-sda ibs=512 obs=512 conv=noerror,sync
で、終わったらSATA2/3のディスクを抜いてをスロット3/4のディスクに差し替えて

# dd if=/dev/sdd of=/opt/backup/HDL-GT-slot3-sdb ibs=512 obs=512 conv=noerror,sync 
# dd if=/dev/sde of=/opt/backup/HDL-GT-slot4-sdc ibs=512 obs=512 conv=noerror,sync
これで、うっかりしてもやり直しはきく。ちなみに各コマンドは250GBのデータをコピーしてだいたい1時間ですね。コピー元はどちらもSATA2/3を使ってるんだけど、hotplugで差し替えたらきちんと別の名前が付いてくれました。SATA1(sda)は起動に使ってるシステムのディスク。なので1回目がsdb/sdcで2回目はsdd/sdeをifで指定。ofにはHDL-GT-に続けてスロット番号-本来のデバイス名sdd/sda/sdb/sdcを指定してます。なぜかスロット2/3/4/1の順に名前が付いてたみたい。さらに、前回の崩壊からの復旧時にスロット1/2は500GBのカートリッジになってた模倣。そう言えば、在庫なかったんで500GB使いました、とか言われた気がする。当時はラッキーとか思ってたけど、今回2時間余計に時間かかっただけでメリットは何もなかった(コピー後にサイズ見て思い出した)。

で、次はRAIDの救済。ちなみにHDL-GTで検索して「RAIDの復旧」として説明しているページがいくつかあるんですが、復旧と言ってもHDL-GTを初期状態に戻してまたRAIDサーバとして使えるようにする作業の説明であって、データのサルベージではなかったりするようなので要注意です。とりあえずはHDD全部外してUbuntuのDVDから起動してお試しモードでスタート。mdadmが入ってないので
# apt-get install mdadm
でインストール。今度はSATA1-4にスロット1-4を挿します。mdadm --examineでディスク名が一致するよう、2/3/4/1の順で挿します。で、念のためにmdstatを確認……して驚く。
$ cat /proc/mdstat
Personalities : [raid1]
md5 : inactive sdd5[1](S) sdc5[3](S) sdb5[2](S)
      1590144 blocks
md10 : inactive sdd6[4](S) sdc6[3](S) sdb6[2](S)
      725768256 blocks
md1 : inactive sdd1[1](S) sdc1[3](S) sdb1[2](S)
      626304 blocks
md2 : active sdd2[1] sdc2[3] sdb2[2]
      409536 blocks
おぉ、さっそく出来上がっちゃってる!追加する順番を気にしたかったので、一度全部解除。
# mdadm --misc --stop /dev/md1
# mdadm --misc --stop /dev/md2
# mdadm --misc --stop /dev/md5
# mdadm --misc --stop /dev/md10
で、ここから比較的安定してたはずの3本を使ってRAIDを構成。
# mdadm -A --run --force /dev/md1 /dev/sda1 /dev/sdb1 /dev/sdc1
$ cat /proc/mdstat
Personalities : [raid1]
md1 : active sda1[0] sdc1[3] sdb1[2]
      208768 blocks [6/3] [U_UU__]
unused devices:
うまくいってるようなので、残りの一本も追加。
# mdadm --add /dev/md1 /dev/sdd1
$ cat /proc/mdstat
Personalities : [raid1]
md1 : active sdd1[1] sda1[0] sdc1[3] sdb1[2]
      208768 blocks [6/4] [UUUU__]
unused devices:
他のデバイスも同様に復旧。
# mdadm -A --run --force /dev/md2 /dev/sda2 /dev/sdb2 /dev/sdc2
$ cat /proc/mdstat
Personalities : [raid1]
md2 : active sda2[0] sdc2[3] sdb2[2]
      409536 blocks [6/3] [U_UU__]
md1 : active sdd1[1] sda1[0] sdc1[3] sdb1[2]
      208768 blocks [6/4] [UUUU__]
unused devices:
# mdadm --add /dev/md2 /dev/sdd2
$ cat /proc/mdstat
Personalities : [raid1]
md2 : active sdd2[6] sda2[0] sdc2[3] sdb2[2]
      409536 blocks [6/3] [U_UU__]
      [========>............] recovery = 41.5% (169984/409536) finish=0.0min speed=84992K/sec
今度は最後の一本で同期が始まったけど、この程度なら一瞬で終了。md5、md10も同様にsda5,6/sdb5,6/sdc5,6から構成して別途sdd5,6を追加、しばらく同期待ちをする事で問題なくactiveになりました。で、次が緊張の一瞬。
# mdadm -A --run /dev/md13 /dev/md10
こいつもエラーなくあっさりactiveにできました。で、ここからが問題。参考にしたサイトではこいつをxfsでマウント
# mount -t xfs /dev/md13 /somewhere
してあげれば、少なくともshareが存在することがわかる、と。あるんですが、我が家の場合はマウントするも中身は空。XFSはジャーナリングがアーキテクチャ依存なので、xfs_repair使って云々、みたいなことがあちこちで書かれてるんですが、そもそもxfs_repairかけるとxfs_repairがcrash。なんか、他の人とは根本的に違うようです。

で、結論から言うと、この段階でHDL-GTにディスクを戻せば完璧に復活しました。なのでxfsが読めなかった件は忘れるつもりでいたのですが……ここで問題発生。住所録を読み出してバックアップのrsyncをかけたら……また死亡。今度は電源が飛んで本気の死亡状態のようです。風前の灯火だったのか。

という事で、どうやらxfs問題と向き合うしかないようです。で、以下は調査と推測の入り混じった結論になるのですが、
  • XFSは基本的にはプラットフォーム非依存なのだが、昔懐かしのARM OABIの環境において意図しない互換性の問題が存在していた。32-bitのmiddle endianだったり、structがpackされてたり、と癖のあるABIだったのが敗因か。
  • ARM OABIからEABIの移行でXFSが飛ぶ問題があちこちで報告されている。
  • HDL-GTを買ったのは2006年。まだOABIが主流だった時期。玄箱はOABI、玄箱ProはEABI。
  • 推測:微妙に読めたり、xfs_repairで復旧できてる人たちはEABIに移行後の後期のHDL-GTシリーズを使っていたのではないか。
  • 推測:OABI環境ならmountできるに違いない。
そんなわけで、玄箱に繋げて読もうとしたんですが、そもそもSATAポート空いてない&玄蔵使ってUSB経由で接続すると認識されない。間に入ってるSCSI仮想レイヤあたりで3TBがうまく扱えてないのか。という事で、次は何を試そうかな、というのが昨晩くらいの状況。運のいい人にとってはここまでの情報でも役に立つかもしれないので、ひとまずpublish。

2014年12月31日水曜日

齧って逃げた子、誰だ〜

だ〜れ〜だ〜。
最近あやち聴いてばっかり。

佐藤さんのFPGAのコミュニティーに顔を出しておきながら、めっきり論理設計してない私。論理設計屋さんからソフト屋さん転職して早4年。そろそろ何か書かないと勘を忘れそうなので、ちょっとリハビリしてみました。

まずは家のリポジトリ漁って、使いまわせそうなやつを集めてGitHubに共通モジュールとして突っ込んでみたのが一週間前。なんかもうISEインストールして、今更なSpartan 3 Starter Kit(しかも無印)で動作確認するだけでぐったりですよ。だって今時パラレルポートとかないですもん。しかもUSB変換器じゃ駄目っていうJTAGお馴染みの問題。さらにUbuntuが新しすぎてドライバがインストールできないとか、おーのー。ここに時間かけるくらいならZynq買ったほうが安上がりだった。玄人志向のPCIとか買ってる場合じゃない!

で、とりあえず最近おなじみ、かつお手軽そうな6502でも実装してみるか、と。とにかく昔のCPUなんで今時のCPUとは違う楽しみがあるかもな、とか思ったわけです。で、いきあたりばったりで一気に書き上げてみたんですが……そうとうなカオスコードになってしまったorz 今にも書き直したい気分だけど、面倒って気持ちの方が大きかった。

このくらいなら手書きでデコード論理組めるだろー、とか甘く見てたんだけど結構ぐちゃぐちゃ。これだったら素直にcase文でパラの線にバラして、論理圧縮は合成ツールに任せたほうがマシだった。
あとやっぱり面倒だったアドレッシングモード。本家のマニュアルにアドレスバスに出てくるパタンが説明されてるので、だいたい中でどう動かしてるのか想像つくんだけど。なんか計算途中のゴミアドレスをバスに流してて気持ち悪い。こんなんでメモリマップドI/Oとかホラー過ぎる。で、資料がある故に厳密に倣って作ってみたんだけど、いろいろとチグハグにならざるを得なかった。やっぱり当時は資源共有して最小限の論理数で作ることに命かけてるんで、そこはあえて同じこだわりで設計してみた。
モジュール間のインターフェースもエンコードするかバラして流すかってのは悩むんですけどね。FFに突っ込むにはエンコードしといた方が資源節約になるけど、CPUの場合せっかくデコードしたのになー、みたいな気持ちもあって。今回は中途半端にエンコードしたままにしたせいで、条件がいろいろ複雑になってしまった。
でもまぁ、マイクロコード以前のCISCがどんな感じで作られてるか体験する良い機会にはなった。

まぁ、来年はApple IIをグラフィック込みで動かすくらいはやるかもです。

あ、ちなみに合成するとXC3S200で論理21%、FF 3%くらいの使用率。もっとFF使っても良いですね。800ロジックセルだから、あてにならないゲート換算で1万ゲートくらい?綺麗に書き直せば500ロジックセルくらいまで減らせないかなぁ。

2014年12月13日土曜日

ARMの上で動くリンゴ印のOSで究極のLチカを楽しむ

ARMは仕事で初めてゲームを作ったコンシューマ機、ゲームボーイアドバンスのCPUという事で、とても思い入れのあるCPUです。ゆんゆんに「ちょっと手伝ってー」と言われて立ち寄ったのが今や泣く子も黙る神移植のM2さん。タイトルはデ・ジ・キャラット。楽曲は憧れの並木学さん。そしてサウンドプログラムを手がけていたのがX68k界でブイブイ言わせてた齊藤彰良さん。当時はお二方ともM2移籍前。僕もワクワクしながら仕事をしていました(最近は大きな仕事に慣れすぎてワクワク感が麻痺してしまってるかも……)。
そんな思い入れのあるARMですが、今やモバイルを中心とした組み込み世界の覇者。AndroidやiPhone向けの高性能プロセッサであると同時に、ホビー向けには個人でも100円程度で手に入るモデルが沢山あります。そこで、せっかくだから久々に何か遊べないかなー……という事で考えたのが……

120円ARMの上でリンゴ印のアイツを動かす!


そう、あれです、あれ。Apple II。
秋月で手に入るLPC1114の性能を見ていてピンと来ませんか?
  • ARM Cortex-M0
  • 50MHz(最大)
  • Flash: 32KB
  • RAM: 4KB
このギリギリ感!ちなみに以前からマイコンだけで古のマシンを再現する企画を続けており
  • CP/Mega88 ... CP/M Z-80 on ATMEGA88 (20MHz, Flash: 8KB, RAM: 1KB) + 外付けSRAM 64K
  • MegaZ-80K ... MZ-80K on ATMEGA644 (20MHz, Flash: 64KB, RAM: 4KB) + ATMEGA328 (20MHz, Flash: 32KB, RAM: 2KB) + TINY2313(20MHz, Flash: 2K, RAM: 128B)
に続く第三弾です。ソースはgithubに置いてありますが全てアセンブリで書かれています。毎回何かしら無駄な挑戦をしているわけですが、今回の見どころは
  1. I/O 4KB、ROM 12KB、RAM 48KBをFlash 32KB、RAM 4KBだけでごまかす
  2. ビデオ出力とキーボード入力をUARTのTX/RXに変換する
  3. 空いてるI/OにGPIOを割り当てて、Apple BASICからLチカ
の3点。

1は単純なローテクで実現。ROMはFlash側に埋め込み、VRAMについては一切記憶しない事でメモリ節約(次節でも説明)。ゼロページやスタック、Apple BASICが本気で使う空間にはRAMをまじめに割り当て、それ以外の領域に関しては全部同じ1-Byteを共有するようにしてあります。主記憶のないキャッシュみたいなもんで、書いて読んで比較……という単純なメモリチェックに対しては正しく動くけど、本当にワークとして触りだしたら動きません。まぁ、初期化コードを騙して、小さいプログラムを動かすには十分。

2は気合。UART入力をキーボードに変えるのは比較的簡単ですが、出力をUARTに変換するのはちょっと大変です。VRAMへの書き込みを見はりつつ、前に書いたアドレスからの差分でカーソル移動を行います。書き込み内容はTXに送るだけでVRAMの実体は実装しません。読まれたら固定値0xFFを返すだけ。スクロール時の画面書き換えは書き込みパタンから自動判別します。読んで1段上のラインに書き込んで……という処理を繰り返すのでアドレスパタンからも判別できるし、本来使われることのない"読み出し値0xFF由来の値"の書き込みを検知する事でも判断できます。スクロール処理中は再描画の書き込みを無視し、スクロール終了を検出したらしれっと改行を送って通常モードに戻ります。

3は特に難しいことはなく。拡張スロット用のI/O空間が開いているので、そこへのアクセスをGPIOにつなげてみました。Apple BASICからはPEEK/POKEで気軽に全メモリ空間へアクセスできるので、これだけでBASICからGPIO制御が可能になります。

という事で簡単なデモ。YouTubeの編集機能使って音とか説明つけてみた。携帯片手に左手でぽちぽち入力した映像なんですが、フラフラしてた画面も手ぶれ補正であっさり安定。



という事で、次はこのプロジェクトを始めた真の目的、佐藤一憲さんにもらったWIZnetを繋げて遊ぶ、というステップに進もうかと。宿題間に合いそうで良かった、良かった。

2014年12月5日金曜日

11月の読書

前回の読書から別のテーマでブログ書いてなかった……良くないですね。それはともかくとして、11月の読書は15冊。今月は読みたいと思った内容の本にうまく巡り会えてないんだけど、タイトルと内容が一致してなくて、予想とは違う観点で面白かった本もチラホラ。

エンターテイメント

「夢をかなえるゾウ」は確かホリエモンが「こんな本が書けちゃう水野さんが憎い」みたいに言ってたので図書館キューに入れた本。半年くらい待ってようやく順番が来た人気の本。いわゆる7つの習慣に集約されるような堅苦しい成長の秘訣を、ゆるーいガネーシャさんを通してじわじわっと脳に染み込ませてくれる。こんな本が書けるんだな、って驚いた。真面目ぶった頭の悪いビジネス書とは正反対のおふざけ優良図書。内容的にはガネーシャさんも言ってる通り、どこでも言われてる話です。

「アンドロイドは〜」の方はタイトルは有名だけど、ブレードランナーの原作だったり、Android Nexusシリーズの元ネタだったりするのは最近知った。そしてブレードランナーって事はスナッチャーだったりサイレントメビウスだったりが持つ世界観、憧れの退廃的近未来都市です。チューリングテストに合格するアンドロイドがボチボチ登場するようになった時代の、アンドロイドとそれを狩る賞金稼ぎの話。前半の世界観の説明は退屈だけど、最初のNexus 6との対峙あたりから止まらなくなってくる。自分がアンドロイドだと知らないアンドロイドとか、ぐっと来る。



視野を広げる

「歴史をつかむ技本」は今月読んだタイトルと内容がずれてる本の1つ。大人向け教科書の流れに乗ろうとして編集が煽ったと想像してるんだけど、ちょっと残念。実際の内容は歴史研究を仕事としている人たちは、どうやって歴史を紐解いているのか。教科書に淡々と書かれた史実は、何を起源にどうやって事実と認められてきたのか、という歴史研究の裏舞台に関する本。その題材として、魏志倭人伝を拠り所にした古代、正史を持つ平安時代、私的な記録も多い戦国時代などを扱っている感じ。一応、歴史の流れというか、普遍的な何かを知りたい、という想定読者の問には答えようとはしているんだけど、オマケっぽさはある。歴史研究について知るにはとても良い本だと思いました。年寄り向けじゃななくて、未来の学者に向けた本として、魅力的なタイトルで売りだして欲しい。

「フラクラル幾何学」はマンデルブロ自らが書いた本が出ているって事で、ちょろっと流し読み。難しいし。物体と観察者の距離によって実効的な次元が違ってくるでしょ?って説明は直感的だった。はじめからコンピュータ使ってCGやシミュレーションと絡めて研究が進んで来たってのも新鮮に思えた。学問って太古の昔からあって、創始者に対するリアルなイメージを持ちにくいんだけど、ここ数十年で誕生した分野の話を聞くとやっぱり不思議な気持ちになる。

「社会契約論」は先月の漫画で読破シリーズの補完としてピックアップ。なのだ調で書かれているけど、女性らしい靭やかでユーモアのある文体になっていて、硬い内容もわりと読みやすく感じる。ルソーが知りたくて読んでみたけど、ルソーの部分は少ないし難しかった。漠然と論説を追うことはできても意図まではなかなか。けど、有名な割には他の思想家に比べて無鉄砲で粗野な印象。一方でホッブズの物体論はちょっと面白い。自然科学の論法をいち早く政治の世界に持ち込んだってことらしいけど。個人を捉える際、精神は物体と同じように個別の反作用の積み重ねによるもので、個々の反応は恐怖などの根源的な感情に基づく反射と、経験・記憶との比較による判断とに分けられる、という解釈。言葉は少し違っても最新の認知心理学の理解するところと一致する。ちょっと哲学に興味が出てきた。

ってところで続けて読んでみたのが「あなたを変える七日間の哲学教室」。タイトルを間違ってしまったもう一冊の本。邦題が中途半端な自己啓発書みたいに変更されちゃってるせいで、正しい読者にリーチできていない印象。原題は「哲学者のように考える - 7日間のガイド」。第一級の現役哲学者による著書。読者と哲学者の対話の形で、哲学が対象とする問題をわかりやすく議論。〇〇学がどうのとか、誰それの考えといった事を体系的に説明する事はなく、哲学全体を説明する上で必要ならば軽く触れる程度。哲学の概念を知る上での取っ掛かりとなる本で、途中で理解につまずく事もないように書かれている。色々な分野で見かける囚人のジレンマ、哲学の視点で見ると、社会契約の話に繋がるってのは読んでいて「おぉ、そうか」と。他の章では神経科学、言語学などとの繋がりも見えてきて学問は色々なところで繋がっているんだな、感心しました。アリストテレス「厳密性を求めるなら、そのことがらにふさわしい程度の厳密性を求めるのがよい。教養のある人は、どのことがらにどの程度の厳密性を求めていいかを知っている」という言葉はこの本の中で気に入った言葉の1つ。普段、計算機を相手にしていると、つい全てが完全でなければいけないという勘違いをしがちなので。自分への戒めとして。さらには過度な品質管理をお家芸として衰退した日本の製造業に対する戒めとして。イヌイットの自立できなくなった両親を流氷と共に流す慣習の話は、本編とは直接関係ないけど、今の少子高齢化社会で行き詰まった日本に生きる者としては刺さる内容。あとがきの自殺についての話もそうだけど、日本はもう少し西洋哲学的な考え方を積極的に取り入れた方が良いのかもしれない。儒教的な道徳観、教育制度との対比として。もともと純粋に哲学的な話に興味があって読み始めたんだけど、最近受けてるグローバル・コミュニケーションの研修での問題と重ねて考える事が多かった。

どうする日本系

危機感持ちつつも自分は安全な場所に逃げこんじゃってて卑怯なんですが。自分なりの考えは持ちたいな、とは思っているのです。ってことで、どんな事を考えてる人がいるのかな、この10年日本は何を失敗したんだろうってテーマで選んでます。この手の本は図書館キューが長いので、思い出した頃になってポツポツと手元に届きます。後者について言えば、自分が「これはもう駄目だ、どうにもならない」って見限って来た物が、世間ではどう判断されてるか。それを確認したいというのも正直なところあります。

で、まずは「日本の論点」から覚えているテーマについて徒然に。
最初の論点はバブル後の日本経済について。ケインズのマクロ経済が一切通用しないグローバル資本主義について軽く触れている。じゃぁ、いったい何が起きてるの?って点については、藤沢数希の「日本人がグローバル資本主義を生き抜くための経済学入門」が詳しかったな、と今になって思えました。同著者の他書は今のところ微妙なんですが、この本だけは良い気がしています。
地方分権問題については橋下は俺が育てた、的な話なんですが。大阪都構想みたいなのは背景を全然知らなかったので中立的に読みました。結局はゼネコン絡みなのかもしれませんが。
憲法については知識の修正が必要になりました。「占領軍が間に合わせで作った英文を無理やり翻訳したから、文章がめちゃくちゃ」みたいな批判をしてるので、あれ?と。たぶん池上さんの本で読んだ気がするんだけど、実は日本国憲法って民間の憲法研究会が提出した案を元にしてるんだよ、って話があって。そっちに理解が振れてたので。調べてみると「参考にした可能性もある」くらいの論調が安全みたいですね。ただ、それは別としても、実質憲法改正が不可能になってる現状は深刻だな、と思いました。
震災を起点とした原発問題。1,000年に一度の大震災を想定してインフラ整備とか馬鹿げている、というのは全くその通りだと思う。公共事業で道路の補強やっても投資になってないし、下手したら投機ですらない。稀な有事にはある程度の被害を受け入れる覚悟が必要かな、と思う。僕ら人類、期待値を計算したら飛行機事故で死ぬ確率よりも巨大隕石落下で人類滅亡に巻き込まれる可能性の方がずっと高いという話もある。わかりやすい災害にコスト割き過ぎなんですね。ただ一方で、そういう事実はあるにしても原発にはまだまだ対費用効果の高い安全対策がたくさんあるはずで。そういう事を考えて実行できれば良いのですが。世間の風当たりは良くないですね。大衆は理屈ではなく感情で動くので。まだまだ人類は野蛮です。
新しいお家芸については、みんなわかっちゃいるけどノーアイデア。バイオ、ナノテク、ロボットみたいなシンギュラリティに繋がるような研究は戦略的に研究してきたはずなんだけど。蓋をあければSTAP細胞事件だったり、外資系企業に買収されたり。宇宙開発とかもっと盛り上がらないかなぁ。

「半導体衰退〜」は元半導体エンジニア、現在コンサルというバックグラウンドを持つ著者による執筆で、技術的にもかなり細かい事が書いてあった。基本的な論調は「日本は垂直統合が強みになったアナログ時代のノウハウは蓄積していたが、主戦場がデジタルに切り替わりその恩恵として分業が可能となって以降、開発体制の切り替えが遅れて競争についていけなくなった」というもの。垂直統合=アナログ、分業=デジタルって切り口は自分にはなかったですね。デジタルでも垂直統合できればそっちのほうが有利だとは思うんですが。そのためには半導体プロセスでも世界一を競えてないと駄目。土台が転んだから上に乗ってる全てがぽしゃったわけで、どちらかと言えば不採算部門をサクッと切れない日本の雇用体制の問題だと思うのです。社内政治的にもそれこそ増税したら解散必至な内閣と一緒で、刺される前に実行、運良く実行できてもいずれ消される、みたいな。
あと現場の雰囲気で言ったら、末端の現場が力を持ちすぎていた事が、寿命を縮めたかな。研究より開発、開発より品証。過去の成功体験に強く縛られた近視眼的な経営判断を続けた結果、技術への正しい投資ができなくなってしまった。現在抱え込んだ技術者を大切にするあまりに、時代の変化に合わせて体制を変えることに二の足を踏んでしまった事が大きい。いずれにしても雇用制度に本質的な問題がありますね。