[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