SSブログ

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

PC2700のSO-DIMM1GBメモリモジュールのたった2ビット(ひょっとしたらテストでエラーが伝播しただけで実は1ビットかも)が不良だったことがわかった。このビットを含む物理アドレスを使わなければよい。なんとかしようと悪戦苦闘した結果。

前回考えたように、ブートの始めの方で

  1. 物理メモリのデバイスファイル"/dev/mem"をオープンする
  2. mmap()で不良ビットを含むページを仮想アドレスにマップする
  3. そのページをmlock()でページアウトされないようにする
  4. シャットダウンまでおとなしくスリープする
とすれば、そのとき問題のページが使われていなければ、そのプロセスがシャットダウンまで問題ページを占有し続けて、他のプロセスは無事、ということになるはず。

ということでこんなのを書いた。

#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を買い替えろ、ということかなあ。う〜ん。


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

nice! 0

コメント 1

Cialis 5 mg

沒有醫生的處方
cialis tablets for sale http://kawanboni.com/ Cialis uk
by Cialis 5 mg (2018-04-14 04:39) 

コメントを書く

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

トラックバック 0

献立06/06自転車で七北田公園 ブログトップ

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