[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: reboot without WinCE



 > こばやしです
 > 
 >  > >デバイス名:/dev/akmem (another kernel memory)
 > 
 >  >書き直してみますので、しばしお待ちを。
 > 
 > 随分と間を空けてしまいましたが、試作してみましたので、

おー。すばらしいっす。
最近ちょっと、「どうせ誰もなんにもやらないんだー」とか腐っていたので、
ちょっと(いや、かなり)感激。

 > reboot2 の使い方は <200104161154.UAA19493@cumin.kurims.kyoto-u.ac.jp> に
 > 書いたのと同じです。

前回のメール(akmem仕様の提案)を書いた時点では、unmount とか
そのへんのことを全然考慮に入れていませんでした。
いま 小林さんの akmem.tar.gz を眺めてみてあらためて考えたのですが、
MEMIOCTL_AKEXEC の機能は関数にして、hpcmips/hpcmips/machdep.c の
cpu_reboot あたりから呼び出せばバッチリなんではないでしょうか。
reboot2.c で ioctl(MEMIOCTL_AKEXEC) するかわりに exec("/sbin/reboot")
すれば良さそうです。

MEMIOCTL_AKEXEC のかわりに MEMIOCTL_AKCOMMIT というのをつけて、
これを呼ぶと akmem の内容が有効とマークされ、その後 reboot すると
新しいカーネルが起動される。

  fd = open("/dev/akmem");
  ioctl(fd, AKALLOC);
  write(fd, 新カーネル);
  ioctl(fd, AKCOMMIT);
  close(fd);
  exec("/sbin/reboot");

ってな順番なら良さそうに思えます。
(MEMIOCTL_AKCOMMIT せずに close した場合はメモリは解放される。)

その他に気になった点ですが、

  - reboot するアセンブラコードのアドレスが決めうちのようです。
    ここはぜひちゃんとアロケートしたページに置きたいところです。

  - pbsdboot からの移植が十分でないような気がします。
    現在実行しているカーネルよりも大きなカーネル、
    たとえばインストール用の RAM disk イメージいりカーネルなどを
    ロードするとおかしくなりませんか?

    例(すごく大雑把):
    今の kernel 0x80000000〜0x80100000 を実行中に、
    次の kernel 0x80000000〜0x80500000 を読み込む場合、
    uvm_pglistalloc() が返すページは 0x80100000〜0x80500000 の範囲内の 
    ページの可能性があります。この場合、正しく並べかえできません。

    pbsdboot ではこの問題を回避しています。あらかじめ新カーネルの
    アドレス範囲かわかっている場合は簡単に回避できます。
    (なので MEMIOCTL_AKALLOC で先に明示的に allocate するのです。
      pre-alloc せずに read/write にしたがって dynamic に alloc していく
      とかなり複雑になりそうなのでやめました。)

どちらもそれほど大きな問題ではないと思います。

あとは generic な MIPS に突っ込むためにきれいに書きなおして
port-mips@netbsd.org あたりに提案するということになるかと思いますが、
そのへんはどうしていきましょうか?
(amiga にあるんだから、mips にもつけよう、っていうかんじで話をもっていく
のかな...どのくらい抵抗があるかちょっと予想つきません...)

Takemura