SSブログ

PowerBook G4の故障とその原因その5 [PowerBook G4故障のこと]

1GBメモリモジュールのたった1ビットのエラーのために動かなくなっていたPowerBook G4 12"。メモリモジュールを買い替えればいいのだけど、僕はそんなお金持ちではないのでなるたけひっぱりたい。
買い替えは最後の手段だ。我々は忍者部隊だ!

前回

、デバイスファイルの/dev/memをmmap()で仮想メモリにマップできるか、と安直に考えたけど、だめだった。OSによってはできるみたい(Linuxはやらせてくれそう。玄箱がDebianなので試せるけど勇気が出ない。やっても解決にならないし)だけど、どのみち10.5 Leopardではデバイスファイル/dev/memそのものが無くなってしまっているので、所詮限界がある。ではどうするか。

Machカーネル

の仮想記憶を制御しているカーネルプロセスを調整する、というのもありそうなんだけど、難しい。パラメータをどうやって変更するのかさえよくわからない。まさかカーネルをコンパイルし直す、なんてことになったらお手上げだし。さすがにそこまで突っ込みたくない。カーネル様は包容力のある安定性で、拙いアプリケーションを観音菩薩のような慈悲深い温かい目で見守っていて頂きたいし(「くらっしゅしたのか、よい、気にするな。私がお前の仮想空間をなかったことにしてやろう。56億7千万年後に私がもう一度起動してやろう」とか)。

やっぱりmmap()?

ということで万策尽きたか、と思ったけど、最後の手段で、やっぱりmmap()に戻ることにした。mmap()システムコールは仮想空間を割り当てる。BSD系はmalloc()などの「メモリ割当て」はmmap()を使っているらしい。昔はmalloc()には内部でbrk()が使われてヒープから確保されていた(古代のHP-UXのmalloc()のmanページにはまさしくそう書いてあった)が、理由はよく理解できないけど最近はmmap()が使われるらしい。

mmap()による解決その2

では、mmap()をたくさん発行してそれに割り当てられた物理メモリ領域をいちいち検査してNGだったらそのページをロックしてスリープする、と言うプロセスを最初に立ち上げればいいのではないか、と考えた。

でも、

mmap()で確保した領域は物理的にどこに割り当てられてるのかはページテーブルエントリをたどらない限りわからない。ページテーブルはカーネル空間の奥深く内蔵されていて簡単には見せてもらえない。これはモダンOS(20年前からモダンなんだけど)なら当たり前。だからmmap()で確保しても物理メモリのどこなのかはわからない。

さらに、ページングにまつわる問題

しかも、ページングのメカニズムによって新しく要求した仮想メモリが新しい物理メモリにマップされるとは限らない。たとえば合計2GBを要求するアプリケーションに対して、はいわかりましたと素直に2GBを明け渡してしまったら、他のアプリケーションのページが全部追い出されてしまってページフォルトだらけで動かなくなってしまう。だからOSはたくさんのメモリを要求するアプリケーションに対して「はいはいわかりました」といってページテーブルのエントリは作るけど、実際の物理メモリは既に渡したやつから使い回すということを平気でやる。「バーのホステス方式(それぞれの客に「あなただけよ」)」と言っていいが、若い人にはわからんだろな。おじさんも行ったことはないので聞いて知ってるだけだけど。

もっと、L2キャッシュにまつわる問題

最近のCPUには内臓のキャッシュメモリがある。PowerBook G4 12"のCPUはL2キャッシュを512kBもオンチップに積んでいて、メモリに書いたつもりがキャッシュに蓄えられて、書いた内容を読み出したら、メモリからではなくキャッシュから読んでいた、ということが普通に起こる。当然そっちの方が効率が良く(バスシーケンスを始めるオーバーヘッドが無い)て早いのであたりまえ。でもこれでは物理メモリの問題を確認することはできない。キャッシュをディスエーブルする、あるいはフラッシュする(中身をカラにすること。実際には「使ってるよ」フラグビットをクリアするだけだけど)という命令はあるけどユーザプロセスからは発行できない、はず、だと思う(実は良く知らない)。PowerPC G4版のMac OS Xの場合、最大128ページもキャッシュに収まってしまうということになる。

ということで...

で、方針としては

  1. mmap()で仮想メモリを確保する
  2. そこにたとえば0を書き込む
  3. L2キャッシュがいっぱいになるまで繰り返す
  4. キャッシュから追い出されたと思われるメモリ領域をもう一度読み出して内容をチェックする
  5. 書いた内容と違うページがあったらそれをロックする
  6. これをなるべくページテーブルにたくさん空きがあるときにやる(具体的にはブートのなるべく早い段階で)
ということになるか。かなり行き当たりばったりで、問題の物理ページに行き着くかはOS様の御意思にすがるしかない。次回はこれを実際にコーディングして問題のPowerBook G4で実行してみることにする。

解決

に近づいているか、といえばむしろ貧乏性のせいで深みにはまっていると言った方が正しいような気がするが。これでだめなら諦めて1GB SO-DIMMを買おう。でもその値段でこっちのiMacに2GB買っておつりがくるんだよなあ。いっそのことMacBook Airに買い替えるか、って一桁違うわ。MacBook Airは特許の記載報償の平均40件分。出願まで漕ぎ着ければ平均20件分。がんばって書くか。特許ネタ探そ。なんか「お年玉2年分のメタタグ」みたい。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立06/10献立06/11 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。