PowerBook G4の故障とその原因その4 [PowerBook G4故障のこと]
PC2700のSO-DIMM1GBメモリモジュールのたった2ビット(ひょっとしたらテストでエラーが伝播しただけで実は1ビットかも)が不良だったことがわかった。このビットを含む物理アドレスを使わなければよい。なんとかしようと悪戦苦闘した結果。
前回考えたように、ブートの始めの方で
- 物理メモリのデバイスファイル"/dev/mem"をオープンする
- mmap()で不良ビットを含むページを仮想アドレスにマップする
- そのページをmlock()でページアウトされないようにする
- シャットダウンまでおとなしくスリープする
ということでこんなのを書いた。
#include <stdio.h> #include <sys/mman.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <signal.h> static off_t start = 0x05cb3090; //failure bit address static int fd; static void *addr; static int pagesize; static void sighandle(int sig); int main (int argc, const char * argv[]) { pagesize = getpagesize(); // (1) fprintf(stderr, "pagesize = %d\n", pagesize); fd = open("/dev/mem", O_RDONLY); // (2) if (fd < 0) { fprintf(stderr, "error in open : %s\n", strerror(errno)); return -1; } fprintf(stderr, "fd for /dev/mem = %d\n", fd); addr = mmap(0, pagesize, PROT_READ, MAP_PRIVATE | MAP_FILE, fd, (start / pagesize) * pagesize); // (3) if (addr == MAP_FAILED) { fprintf(stderr, "error in mmap : %s\n", strerror(errno)); return -1; } if (mlock(addr, pagesize) == -1) { // (4) fprintf(stderr, "error in mlock : %s\n", strerror(errno)); return -1; } signal(SIGTERM, sighandle); // (5) sleep(31536000); // (6) return 0; }(1)でページサイズをもらってる。この場合互換性なんか必要ないし4Kとわかってるので決めうちすればいいんだけど、まあ、いちおう。(2)でメモリのデバイスファイルをオープンする。(3)のmmap()コールでデバイスファイルの、不良ビットを含むオフセットを与えて仮想アドレスにマップする。(4)でページを固定して、(5)でシャットダウンのときのシグナルを受け取る(ハンドラのsighandle()は書いたけど載せてない)ようにして、(6)で1年間スリープする。
これを、問題の1GBモジュールを積んだPowerBook G4にコピーして、シングルユーザモードで立ち上げた。
localhost:/ root# whoami root localhost:/ root# cc main.c localhost:/ root# ls .DS_Store a.out main.c localhost:/ root# ./a.out pagesize = 4096 fd for /dev/mem = 3 error in mmap : Operation not supported by device localhost:/ root#localhost:/ root#というのはシェルのプロンプト。コンパイルして動かすと、だめでした。デバイスファイルはオープンできてるけど、mmap()がだめ。このあといろいろmmap()に渡すパラメータを変えてみたけど、関係ない。MAP_ANON(無名マッピング、単にメモリ領域を確保する。Mac OS XではなぜかMAP_ANONYMOUS定数が定義されていない)にするとパラメータがおかしい、と言ってくるのでファイルディスクリプタに-1を渡すと動いた。でもそれってとうぜんどこのページなのかわからん。動いて当たり前で全然意味ない。やっぱり物理メモリのデバイスファイルはこのやりかたではさわれないみたい。がっくり。
まあ、こんな簡単な方法でできるとまずいわなあ。なんかほかにやりかたあるかなあ。思い浮かばん。MACHカーネルが仮想記憶の制御をしているらしいので、関係するパラメータがカーネルにあるかも。しかしそんなとこ情報も少ないし、コードを読みなさい、とかいうのかもしれん。御大テバニアンのコードを拝見するのは恐れ多いなあ。
こまったなあ。「不良ビットを含むページを利用不可能にする」というようなOSの機能があってもいいと思うのに。
どうしようかなあ。やっぱりPC2700のSO-DIMMを買い替えろ、ということかなあ。う〜ん。
2008-06-07 02:11
nice!(0)
コメント(1)
トラックバック(0)
沒有醫生的處方
cialis tablets for sale http://kawanboni.com/ Cialis uk
by Cialis 5 mg (2018-04-14 04:39)