へたってて休業。
調査の続き。zlib_fs_inflateInit2の中から順に辿っていったところ、
cramfsモジュール内のzlib初期化に辿りつきました。その中で、zlib
のwrokspaceポインタにvmalloc()を使用してメモリ割り当てを行って
いて、その割り当てられたメモリポインタがヘンテコな領域を指している
ため、結果、その領域へのストアがデータアクセス例外になっていると
いうことのようでした。
ものの本で調べてみたところ、vmalloc()はカーネル内での動的な
メモリ割り当てを行うメモリ割り当て関数であるところのkmalloc()の
拡張版で、確保するメモリサイズの制限などがkmalloc()に比べて
柔軟になっているという特徴があるようです。
それはさておき、メモリ確保を行うということはそれなりにページ
アドレス変換なんかも行われるハズなのですが、全SR(セグメントレジスタ)
の内容が全て0だったり、ページアドレス変換時に使用されるPTEの先頭を
示すSDR1の内容が0だったりと、どうも怪しげな状態になっていることが
引っかかりました。
そこで順に調査。まずはSRの内容をロードしている個所を調べた
所、mtsrin 命令を使用した痕跡がありました。通常はmtsrin命令
の手前で止めて見てみるところですが、いきなりmtsrin命令のppcsimソース
を眺めたところ、mfsrin命令と同じになっており、全く間違っている
事が発覚しました(^^;
続いてSDR1に値が入らない件について。SDR1へのロードは
arch/ppc/kernel/head.S:load_up_mmuで行われていますが、ここでは
_SDR1という変数領域から実際にレジスタへロードを行っているだけ
で、_SDR1領域への値の書き込みは別の場所で行われているようです。
そういえば、以前2.4.4のカーネルを動かしていたとき、でSDR1が何故か
0x40000000を指していてそのため、ppcsimのメモリをそれ専用に確保
する必要がありましたが、なんだかそれと同じ問題のような気がして
きました(^^;で、実際の_SDR1への値の書き込みは
arch/ppc/mm/ppc_mmu.c:MMU_init_hw で行われているようです。
そこでMMU_init_hwの入り口で止めてステップ実行で進めてみたのですが、
直ぐに関数を抜けてしまっているようです。問題の個所は
----arch/ppc/mm/ppc_mmu.c:MMU_init_hw---- if ((cur_cpu_spec[0]->cpu_features & CPU_FTR_HPTE_TABLE) == 0) return;
static inline void* ___va(unsigned long p) { unsigned long v; asm volatile ("1: addis %0, %1, %2;" ".section \".ptov_fixup\",\"aw\";" ".align 1;" ".long 1b;" ".previous;" : "=r" (v) : "b" (p), "K" (((PAGE_OFFSET) >> 16) & 0xffff)); return (void*) v; }
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
日付け越え前に帰着。
調査の続き。コケている命令のアドレスと命令とが一致しなくて変だなぁと
思っていたら、reconfig したカーネルを逆アセンブルし忘れてて、古い
命令列と突き合せてました(汗; で、
色々疑い所があったのですが結局どれも白。ずっこけているところは
fs/inflate_fs/inflate.c:zlib_fs_inflateInit2の中なので、ハードに
依存したアドレスをアクセスしている訳では無いハズなのですが......
うーむ。結局、ppcsimのアドレス変換部分のコードが少し整理された気分。
Netscapeの6をインストールしてみました。4.7xから結構ハデに変わっている
のですね(^^; IEのお気に入りをインポートできるようになっているのは
良いと思いましたが、他のはゴテゴテ付いてて便利なんだかどうだかよく判らない
感じ。
日付け越え前に帰着。
Netscapeの6を試しにダウンロード.........終りません(^^;
先日のドキュメントのトラブルシューティングを読んでいると
ファイルシステムのサポートとして、ext2ファイルシステムのサポートが
必要なことが書かれていました。romfsをルートファイルシステムにするの
で、ext2のサポートは不要だと思ってコンフィグレーションから外していた
のですが、入れてカーネルを再コンパイルしてみました。で、ppcsim上
で実行したところ、データアクセス例外でパニック(^^;
<6>Ramsize from residual data was 0 -- defaulting to 32M Linux version 2.4.17 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) #17 Tue Feb 26 02:08:00 2002 PReP architecture On node 0 totalpages: 8192 zone(0): 8192 pages. zone(1): 0 pages. zone(2): 0 pages. Kernel command line: console=ttyS0,9600 console=tty0 root=ramfs time_init: decrementer frequency = 496.000576 MHz Warning: real time clock seems stuck! Calibrating delay loop... 61.84 BogoMIPS Memory: 31056k available (604k kernel code, 468k data, 92k init, 0k highmem) Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes) Inode-cache hash table entries: 2048 (order: 2, 16384 bytes) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 8192 (order: 3, 32768 bytes) POSIX conformance testing by UNIFIX <6>PCI: Probing PCI hardware Setting PCI interrupts for a "Blackhawk (Powerstack)" <6>Linux NET4.0 for Linux 2.4 <6>Based upon Swansea University Computer Society NET3.039 Starting kswapd Oops: kernel access of bad area, sig: 11 NIP: C0062300 XER: 00000000 LR: C00623D4 SP: C01FBF70 REGS: c01fbec0 TRAP: 0300 Not tainted MSR: 00009032 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11 DAR: C3000070, DSISR: 90090014 TASK = c01fa000[1] 'swapper' Last syscall: 120 last math 00000000 last altivec 00000000 GPR00: 00000000 C01FBF70 C01FA000 C010C590 0000000F C00A7E28 00000030 00000000 GPR08: 000001DA C300005C FFFFFFFF 00000000 84000022 00000000 00000000 00000000 GPR16: 00000000 00000000 00000000 00000000 003FF000 00000000 00000000 00000000 GPR24: 00000000 001227D0 00000000 00000000 00000000 00002000 C00E0154 C010C590 Call backtrace: 001227D0 C00623D4 C006409C C00D8780 C00CA7AC C00CA7F4 C0003B4C C0006644 <0>Kernel panic: Attempted to kill init! <0>Rebooting in 180 seconds..
日付け越えちょっと前に帰着。
どうもromfsはダメっぽいので、ファイルシステムやブートファイルシステム
についての日本語訳ドキュメントを読んでみることにしました。量が多いので
斜め読みっぽくなってしまいましたが、HDDからブートする以外で、一般的な
方法はfdからブートしてramdiskにファイルシステムをコピーするという方法
のようです。initrdを使えばramdiskイメージを読み込んで終りって感じに
なるようですが、Cygwin上でramdiskイメージを生成できなさっぽいのでNG。
cramfsの方は圧縮romfsという事のようで、romfsと大差無い感じがしますが、
scripts/cramfs以下に入っているファイルシステムを生成するツールが
makeできずにNG。うーむ。
いいとも増刊号時間に起床。ビルゲイツが出てた。
調査の続き。fs/romfs/inode.cを眺めてみました。ファイルシステムドライバは
モジュールとして登録する形になっているようで、その中に
static DECLARE_FSTYPE_DEV(romfs_fs_type, "romfs", romfs_read_super);
昼過ぎ起床。休日出勤。
色々網をしかけてみるもよく判らず。という所で、重要な点に気づきました。
romfsからのbootを試みたと言ったものの、
Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/romfs
日付け越え。
先日の続き。まずはconfigでromfsをサポートするようにしたか
確認(^^;
CONFIG_ROMFS_FS=y
handle = devfs_find_handle (NULL, ROOT_DEVICE_NAME, MAJOR (ROOT_DEV), MINOR (ROOT_DEV), DEVFS_SPECIAL_BLK, 1);
MSR : 00009032 SDR1 : 00000000 IBAT0U: 00000000 IBAT1U: 00000000 IBAT2U: c00003fe IBAT3U: 00000000 IBAT0L: 00000000 IBAT1L: 00000000 IBAT2L: 00000002 IBAT3L: 00000000 DBAT0U: 80001ffe DBAT1U: f0000ffe DBAT2U: c00003fe DBAT3U: 00000000 DBAT0L: 8000002a DBAT1L: c000002a DBAT2L: 00000002 DBAT3L: 00000000 SR00 : 00000000 SR01 : 00000000 SR02 : 00000000 SR03 : 00000000 SR04 : 00000000 SR05 : 00000000 SR06 : 00000000 SR07 : 00000000 SR08 : 00000000 SR09 : 00000000 SR10 : 00000000 SR11 : 00000000 SR12 : 00000000 SR13 : 00000000 SR14 : 00000000 SR15 : 00000000 PC : c00bc304 MSR : 00009032 SPRG0: 003ff000 DEC : 00047d06 CR : 44000024 SRR0 : c007f760 SPRG1: 00000000 TBU : 00000000 XER : 00000000 SRR1 : 00009032 SPRG2: 00000000 TBL : 8418d580 LR : c00bc2c4 HID0 : 0000c000 SPRG3: 001b6270 CTR : 00000007 HID1 : 00000000 SDR1 : 00000000 GPR : 00-07: c00bc2c4 c01b7f10 c01b6000 00000000 c00d34e8 00000000 00000000 00000001 08-15: 00000001 c00d0000 c007f3f4 c00d0000 24000024 00000000 00000000 00000000 16-23: 00000000 00000000 00000000 00000000 003ff000 c008d80c c00b0000 c01ff000 24-31: 00000000 000fd2ac 00000000 c00d0000 00000000 c00d34e8 00000000 00000001 000d34e8 : 72 6F 6D 66 73 00 00 00 00 00 00 00 00 00 00 00 romfs...........
今日も日付越え前に帰着。
先日見つけた日本語訳ドキュメントを読んでみますに、genromfs
というromfsイメージを生成するプログラムを使用すれば、
良いみたいなので早速 genromfo-0.5.1をダウンロード&コンパイル。
で、コンパイルエラー(^^; major(),minor(),makedev()が見つから
ないということで、glibcのインクルードファイルのsys/sysmacros.h
から拾ってきて適当な場所に挿入。取りあえずOK。
続いてromfsをルートファイルシステムとする様にカーネル引き数を
指定しようとしたのですが、どうにも指定方法が判らず。以前は
コマンドライン文字列の入るメモリ領域を書きかえる事で行っていたの
ですが、それと思わしき領域を探してパッチを当ててみるも一向に
変化せず。仕方なくコマンドライン文字列を探してみたところ、
include/linux/autoconf.hでdefineされているCONFIG_CMDLINEを書き
かえればどうにかなりそうだったので書き換えてコンパイル。OK。
include/config/cmdline.h.orgにも同じ事が書いてありますが、
こちらは書き換えても反応せずの模様。
で、材料は揃ったような気がするのですが、肝心のromfsイメージの
配置場所が判らず。とりあえずromfsブートにして実行してみたのが
以下。
block: 64 slots per queue, batch=16 RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize <0>Kernel panic: I have no root and I want to scream <0>Rebooting in 180 seconds..
memal 0x0f100000 0xf #ROM area メモリが確保できませんでした(size=252706816)
日付越え前に帰着。ふぅ。
調査の続き。トレースダンプを眺めてみると、例外処理から戻ってきた所で
おかしくなっているのが判りました。最後に発生した例外はデクリメント
例外で、戻りアドレスは丁度r27の値を更新する命令列の後でした。先日の
レジスタダンプと命令列を付き合わせてみたところ、最後のr27の更新では
そのような値が入らない事が発覚。
c002d380: 7f 7f 4a 14 add r27,r31,r9
<6>Ramsize from residual data was 0 -- defaulting to 32M Linux version 2.4.17 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) #10 Thu Feb 21 00:07:37 2002 PReP architecture On node 0 totalpages: 8192 zone(0): 8192 pages. zone(1): 0 pages. zone(2): 0 pages. Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/sda2 time_init: decrementer frequency = 496.000576 MHz Warning: real time clock seems stuck! Calibrating delay loop... 61.84 BogoMIPS Memory: 31204k available (520k kernel code, 408k data, 88k init, 0k highmem) Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes) Inode-cache hash table entries: 2048 (order: 2, 16384 bytes) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 8192 (order: 3, 32768 bytes) POSIX conformance testing by UNIFIX <6>PCI: Probing PCI hardware Setting PCI interrupts for a "Blackhawk (Powerstack)" <6>Linux NET4.0 for Linux 2.4 <6>Based upon Swansea University Computer Society NET3.039 Starting kswapd devfs: v1.7 (20011216) Richard Gooch (rgooch@atnf.csiro.au) devfs: boot_options: 0x0 pty: 256 Unix98 ptys configured <6>Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled <6>ttyS00 at 0x03f8 (irq = 4) is a 16450 <6>ttyS01 at 0x02f8 (irq = 3) is a 16450 <6>ttyS02 at 0x03e8 (irq = 4) is a 16450 block: 64 slots per queue, batch=16 RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize <3>request_module[block-major-8]: Root fs not mounted VFS: Cannot open root device "sda2" or 08:02 Please append a correct "root=" boot option <0>Kernel panic: VFS: Unable to mount root fs on 08:02 <0>Rebooting in 180 seconds..
日付越え。
先日のlinuxカーネルバージョンはバグだと自分で言っているので、2.4.17を
ダウンロードしてビルドしてみました。いくつかはまりつつなんとかmake完了。
printk()に仕込みを入れようとkernel/printk.cを見てみるとそれまでのと全然
変わってますよ(^^; で、変更を加えて実行してみたところやっぱNG。
<6>Ramsize from residual data was 0 -- defaulting to 32M Linux version 2.4.17 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) #8 Wed Feb 20 01:55:10 2002 PReP architecture On node 0 totalpages: 8192 zone(0): 8192 pages. zone(1): 0 pages. zone(2): 0 pages. Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/sda2 time_init: decrementer frequency = 496.000576 MHz Warning: real time clock seems stuck! Calibrating delay loop... 61.84 BogoMIPS Oops: kernel access of bad area, sig: 11 NIP: C002D3D0 XER: 00000000 LR: C002D390 SP: C00A3320 REGS: c00a3270 TRAP: 0300 Not tainted MSR: 00001032 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11 DAR: 000014C3, DSISR: 811B0008 TASK = c00a1420[0] 'swapper' Last syscall: 0 last math 00000000 last altivec 00000000 GPR00: C00A416C C00A3320 C00A1420 00000001 00009032 00000001 00000030 C00D0000 GPR08: 00000000 00000018 C0106000 C00D0000 C00A614C 00000000 00000000 00000000 GPR16: 00000000 00000000 00000000 00000000 003FF000 C00D0000 C0090000 C0090000 GPR24: C01070C0 00000B21 00001642 000014BB FFFFFFFF 00000000 C0160140 C00A40DC Call backtrace: 00000000 C002DE38 C00BB5BC C00BB7DC C00B9470 C00AF71C 000036E4 <0>Kernel panic: Attempted to kill the idle task! <0>In idle task - not syncing <0>Rebooting in 180 seconds..
起きたら悪化していたので本日休業。大抵、休業したその日の昼には普通に
動き回れるまでに回復するのですが、今回は全く回復の兆しが見えず、
結局夕方まで寝てました(T_T)
起き出してごちゃごちゃと。
先日buildしたlinuxカーネルを何気にppcsimで動かしてみました。何も手を
入れずに動作させたのですが、取りあえず何かが動いている感じだったので、
printk()に文字列横取りコードを入れて再度実行してみると、なんとなく
動いている模様。ところがある点でいつまで待っても次に進む気配が見えない
ので調査。Cntl-Cで止めてtdコマンドでトレースを見てみたところ、
serial_consoleのポートwaitで無限に待っているようでした。
drivers/char/serial.c内serial_console_write()のインライン展開
されたwait_for_xmitr()で待っている様だったので、常に条件が満たされる
様にメモリパッチを当てて回避。結果、以下の所まで進んでNG。
Ramsize from residual data was 0 -- Probing for value Ramsize default to be 32M Total memory = 32MB; using 0kB for hash table (at 00000000) Linux version 2.4.9 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) PReP architecture On node 0 totalpages: 8192 zone(0): 8192 pages. zone(1): 0 pages. zone(2): 0 pages. Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/sda2 time_init: decrementer frequency = 464.000544 MHz Warning: real time clock seems stuck! Calibrating delay loop... 57.75 BogoMIPS Memory: 31128k available (544k kernel code, 432k data, 84k init, 0k highmem) Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes) Inode-cache hash table entries: 2048 (order: 2, 16384 bytes) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) kernel BUG at page_alloc.c:191!
風邪気味でへろへろ。寝てたけど腹が減って起きる(汗;
ppcsimいじり。チェック。機能追加。修正。あぁ、寒くてダメ。
食事を仕入れるついでにCD屋へ。TommyFebruaryのCD売り切れ。ごはっ!
なんで?!
ゲーセン。2斑鳩。いまいち。
出張中に読んだ本であるところの「CONTINUE Vol.3」。ゲーム批評っぽい
本なのですが、「超クソゲー」のライター陣が書いた記事で埋め尽くされ
ています。その為、けなしているっぽい誉め方(逆もしかり)の言いまわし
が絶妙で笑えます。ファミコンゲームの記事がメインでしたが、
91年以降のソフトで「烈火」(私は話でしか聞いたことがありません)を
選んでいる辺りが通好みという感じ(他に選択肢が無かったのかも知れません
が)。他、「高橋名人の冒険島IV」がファミコン最後のソフトというの
は初めて知りました。「歴史としてあまりにも完璧すぎだ!」というのに
思わず同感してしまいました。あと、トレジャーの社長インタビュー記事が
ありましたが、その中でPS2のSILPHEEDの制作をした事が書かれていました。
ってゆーか、CAPCOMが発売元でGAME ARTSが作っているのかと思っていたら、
もう一階層あったという所に驚き。でも、
以前気になったRAYCRISISとの
関連は無さげ。
XBOXのソフトのCM。なんか週を重ねる毎にタイトルが増えてきている気が
するのは気のせい?
何気にa2psをコンパイル。プリンタ無いので全然意味ありませんが(^^;
日本語文字はバケバケのため役立たず。
彩でセーブがうまくできない現象の再現テスト。最終的にセーブ失敗現象が
再現したものの足は掴めず。
因みに上のは勘が働いたので事前にスクリーンセーブしたものでした(^^;
行った操作は主にレイヤーの操作系。他、専用ドライバを使っていた
所、時々カーソルが思わぬ方向に動く現象が見られたため、途中で
Wacomドライバに切り替えたりしましたがこれはこれで問題っぽいですが、
セーブできない事には関係なさげ。文字落書きを入れる前にロード不可と
なってしまったので、今回はここで終了(^^;
その後、レイヤー追加&削除&レイヤー消去&レイヤーの移動に重点を
置いて操作したところ、再現したもよう。更にチューニングした結果、
出張。帰着。ふぅ。風邪気味。
ppcsimいじり。チェック。だんだん調子が悪くなってきて死亡。
出張。
出張。
出張。
出張。
実家で泊まって、まったり過ごしてそして帰着。
TommyFebruaryのCDを買いに行ったら売り切れの店ばかり。なんで?
(<売れてるからでしょ)
しかたないので、マウスの転がりが悪くなっているのを思い出したので、
今主流のイメージセンサマウスを買ってみました。つーか、ボールの奴で
ホイール付きってのが全然置いてなかったのですが(^^; で、ヒモが少し
短いという弱点はあるもののバッチリですよ。白い紙だろうがCDケースの
上だろうが反応します。でもドライバを組み込んだ後でWinを再起動かけ
たら、「パスが見つかりません」みたいなメッセージが出たのが
気になる。でも、これでスイッチがヘタるまで使い続けられそうな
予感。
暇つぶし用の本などを仕入れに本屋に寄ったところ、話題沸騰中......
というほどでもないかも知れない「キャストパズル」が置いてあった
ので一つ買ってみました。キャストパズルの単語自体はWebなどで
検索していただくとして(ぉい;、「リング」という奴を買ってみました。
箱に「はずせますか?元に戻せますか?」と書かれていて、裏に
元と外れた(というかバラけた)状態の写真が載っていたので、当然
外すのに苦労して元に戻すのに苦労するものかと思いきや、
バラけた状態には直ぐになった為「なんだこりゃ?」と思ったところ、
このリングという奴はバラすのは一瞬で、元に戻すのが大変な
パズルなのでした(^^; 元の状態を覚えないでバラしたので、
もう戻せやしない(藁 そんな感じで暇だけは潰せそうです。
ちょっこりppcsimいじり。ういー、やっと逆アセンブルダンプを仕込み
終えた気分。確認は来週か?
XBOXのCMが割と盛大に流れていますが、既に海外では発売されている
ものとは言え、最初からソフトが盛大にリリースできるってのは
凄いと思いました。
かなり早起き(^^;。
弟の結婚式に出るため帰省。なにせ久しぶりに帰る上、ほとんど実家と
連絡を取らない人(>私)ですから、経緯やらなんやら色々聞いて、相手
の家族と挨拶してって疲れましたよ。
少し早起き。
続き。
変わったところはgcc-2.95.2になった所、linuxヘッダを比較的新しい
2.4.9のものに交換(前のは2.4.4のものでしたでも、付録のバージョンは
2.4.13です(^^;)といった所。基本的には変わってないハズと思いながら
diffで asm-ppcを比較してみると死ぬほど変更が加わっていてビックリ。
で、コンパイルしてみると、何故か前回引っかかったシステムコール系
ライブラリのコンパイルは問題無く通りました。ログを取っていなかった
ので何故通ったか謎。でも、結局iconv_progのリンクに失敗。で、調べて
みる事にしました。
そこで一つ疑問が沸いてきました。今回のコンパイルはCygwin上での
完全クロスコンパイルなのですが、この辺のシステムコールの実体は誰が
持っているかというとカーネルのハズです。実際に以下の
ような実行でコケているのですが、
powerpc-linux-gcc -nostdlib -nostartfiles -o iconv_prog -Wl,-dynamic-linker=/usr/local/ppctools/powerpc-linux/lib/ld.so.1 ../csu/crt1.o ../csu/crti.o `powerpc-linux-gcc --print-file-name=crtbegin.o` iconv_prog.o iconv_charmap.o charmap.o charmap-dir.o linereader.o dummy-repertoire.o simple-hash.o xstrdup.o xmalloc.o -Wl,-rpath-link=..:../math:../elf:../dlfcn:../nss:../nis:../rt:../resolv:../crypt ../libc.so.6 ../libc_nonshared.a -lgcc `powerpc-linux-gcc --print-file-name=crtend.o` ../csu/crtn.o
出張。帰着。ふぅ。初めてTRICK2が放送されているところを観れました。
つっても、最後の数分だけなのですが(T_T)。
コンパイルの続き。gcc-2.95.2まで戻してみるのはどうか?とmakeして
みましたが、同じくinternal errorでNG。nsswitch.oのコンパイルだけ
手動でgcc-3.0.3のコンパイラを指定してしのぎました。
glibcでは .o/.os/.op という三種類のオブジェクトファイルをコンパイル
するのですが(それぞれ 通常/shared/profile付きって感じらしい)、
それ毎にエラーしますので、三度手動で実行する必要がありました。
そしてiconv/iconv_prog のコンパイルで大量の'__'始まりのシステム
コールが見つからないと怒られました。もしや一部のシステムコール系を
削りまくってコンパイルしたせいか?ということで、結局やり直して
みることに。がくぅ。
再コンパイル中にppcsimに少し手を入れることにしました。前の作りでは
とても無理だったdisassemble機能を付けてみることにしたのですが、
やはり量が多過ぎて死亡。
出張。
出張。
出張。
出張。
午前中に起床。今日も休み。雪にはなっていない模様。でも寒いです。
bootローダをダウンロードしてみた。
ppcboot-1.1.4と
redboot
をダウンロードしてみたのですが、redbootの方は依存関係が
イマイチよく判らず。ppcbootの方はconfigureとか無くてなんとなく
良いのですが、いまいちシリアルコンソールに対する制御をしている
部分が判らず。とりあえずコンパイルしてシミュに乗っければ
何か判るかもとコンパイルを試みたのですが、パス等の設定が
合わなさ過ぎて死亡。
なので、binutils,gcc,glibcをInterface誌の付録に従いmakeして
みることにしました。以下メモのようなもの。
binutils。これについては付録に書かれている通りで基本的に
OKな様ですが、cygdriveを使用するような指定がうまくいかない
ようです。
gcc。3.0.3をコンパイルしようとしたのですが、libgccの
コンパイル時にucontext.hを要求されてlibgccのコンパイルに失敗。
空ファイルを置いてその場を通過ましたが、unwind-dw2.cで何故か
エラー。エラー個所をコメントアウトして凌ぎましたが、最後は
リンクでcrti.oが見つからなくてつっかかりました。で、
gcc-2.95.3を使用してみたところ、同じやり方で問題なくmake
できました。
glibc。time/settimeofday.o のコンパイルに失敗。NULLが定義
されていないのがダメだそうで。しかたないので、
sysdeps/unix/sysv/settimeofday.c にNULLをdefineして凌ぎ
ました。他、posix下のfork等システムコール系関数のソースに
sysdeps/unix/*.Sが使用されるようなのですが、m68kだったり
ix86だったり全然関係無いアーキテクチャのソースを引っぱって
こられてヘコリ。ソースの中の本体コードを削って凌ぎました。
実際にはLinuxのasm/unistd.h内マクロで定義されているので、
コンパイルすること自体不要だと思われます。で、しばらく
した後、nsswitch.oのコンパイルで
powerpc-linux-gcc: Internal compiler error: program cc1 got fatal signal 11だそうな。がっくり。
珍しく少し早起き。色々準備。
速度アップに大して貢献していないさ加減をgprofを使ってプロファイリング。
プロファイルしてみて何気に気づいたのですが、命令毎に関数を用意している
ので、その関数の通った回数がそのままそのppcプログラムで使用している
命令のプロファイルになってたりして。で、プロファイルをしたけれど、
結局一番重いのはプロファイラで使用する関数であるところのmcountだったり
して(^^;。うーむ。少しムダを削ったりする程度で終了。
色々飾りを付けてみたり。一部の命令群が関数化されていないのを除いて、
関数毎のカウンタを付けて実行命令分布を調べられるようにしてみたり。
散髪に行ったり本屋に行ったり。「ラブひな(14)」など買ってみたり。
あまり好きでないと言いつつ一応全部読んでいたりする辺りがナニですが、
ハッピーエンディングでするっと終わるのはなんか好きかも。このマンガ
を知った頃、「センチメンタルグラフティ」というMMK(モテテモテテ
こまっちゃう)の代表のようなゲームがありました。「ラブひな」も一過性の
MMKブームに便乗したマンガなのかと思っていたのですが、主人公で
ある(と思う)ところの景太郎が、東大に合格して景太郎と成瀬川の立場が
逆になってきた辺りの展開から物語の筋が最終一話前のしのぶのセリフに
続いているように思いました。真意のほどは定かではありませんが。
他、コミッカーズとか。FFのゲーム画面グラフィックの遷移とか面白かった
かも。フィールドマップのグラフィックがIよりIIの方がショボかったり
するのは何故なのでしょう。そういや名前を忘れてしまいましたが、
この頃のスクウェアのプログラマに偉く腕の立つ外人プログラマが
いて、FFのIとか「とび出せ大作戦」とかハイウェイなんとかとかいう
ドライブゲームとか、全てそのプログラマが作ったというのを
聞いた事があるのを思い出しました。FF1のフィールドマップから
町のマップに入るときの画面が上下に割れる処理だとか高速スクロール、
あと、とび出せの擬似3Dの床や柱(縦に伸ばす処理がスムーズ)の
処理など、「お?」と思わせられるものがありました。
一部テーブルになっていない命令のテーブル化。今インプリメントしてある
命令は全て命令毎に1関数になりました。ふぅ。
で、本題。たまたま時期が
重なっていただけで本当に偶然なのですが、Interface誌に組み込みLinux
のコンパイル手順などについて書かれた別冊付録が付いていて、その中に
PPCをターゲットとしたGNUツールのビルド方法やLinuxカーネルのmake config
方法が書かれていました。その中で、ROM化したファイルシステムを
マウントしてブートするようなことが書かれており、こいつをppcsimで
エミュレーションしてやれば以前挫折したファイルシステムのマウントが
できるかも知れないという魂胆です。問題は、/tmpや/varなど動的に書き
換えられる必要のあるディレクトリをRAMディスクとして使用する為の技は
紹介されているのですが、肝心のROMにファイルシステムを入れる方法が
よく判らず、どうしたものやらという所。うーむ。
ブートローダーが色々紹介されていたので、その辺からファームがROMから
ブートする場合のコードを読み取れば良いのかしら?
所で、事前に記事が載る事を聞いていたのですが有末一寿さんてKOJIさんの
こと?少なくとも載ってるコードはKOJIさんのコーディングスタイルの
ようですが(笑。
ランク王国のCGキャラの声が以前の声に戻ってた。
出張。帰着。
何気にテーブル化の続き。一部を除いて完了。ふぅ。
取りあえずテストを行ってみましたが大して速度アップしていなさげ。へこり。
意外とswitch文でも速いんだとか思ったりして。
いくつかテストプログラムを実行したのですが、とりあえずレベルダウンはして
いなさげ。