[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: reboot without WinCE
こばやしです
>MEMIOCTL_AKEXEC のかわりに MEMIOCTL_AKCOMMIT というのをつけて、
>これを呼ぶと akmem の内容が有効とマークされ、その後 reboot すると
>新しいカーネルが起動される。
この方針に沿って書き直してみました。
http://www.kurims.kyoto-u.ac.jp/~kobayasi/akmem-20010619.tgz
に置いておきます。MEMIOCTL_AKEXEC のためのアセンブラのコードはどのみち
VR と TX で別になるでしょうから、vr_reboot() に入れることにしました。
>(MEMIOCTL_AKCOMMIT せずに close した場合はメモリは解放される。)
MEMIOCTL_AKCOMMIT した場合には次に open("/dev/akmem") したときに解放され
るようにしておきました。
また、exec する reboot に対して、普通に reboot するのか、それとも akmem
内のカーネルをロードするのかを伝える方法ですが、
# reboot -- <bootstr>
とすることによって、cpu_reboot に <bootstr> を渡すことができるようなので
これを使って、
execl("/sbin/reboot", "reboot", "--", "hotboot", (char*)0);
としています。(実際には渡す文字列は"hotboot"でなくても、何でもよい)
あと、wsksymdef.h, wskbd.c および hpckbdkeymap.h に対するパッチも入れて
ありますが、これは、Func(Ctrl+Alt)+Del で cpu_reboot をキックできるよう
にするためのものです。reboot2 に -l を付けて実行すると、MEMIOCTL_AKCOMMIT
まで実行して、reboot は exec せずに終了しますので、その後、必要なときに
Func(Ctrl+Alt)+Del を押してやれば、AKEXEC が実行されます。(もちろんその間、
メモリは消費されたままです)
DDB に落ちた場合も(落ち方にもよるとは思いますが)有効です。
ところで、curproc == NULL の状態で DDB に落ちた場合、reboot しようとすると
vfs_shutdown() の中で TLB miss を起こすようなのですが、そういうものなので
しょうか? 4回繰り返すと(諦めて?)reboot してくれるみたいですが。
これと同じ理由で上記の Func(Ctrl+Alt)+Del による reboot も curproc == NULL
の場合には 4回繰り返す必要があります。
さらに余談ですが、DDB に落ちたまま放っておくと、ものすごく熱くなるのですが、
これって正常? (sigmarion の場合キーボードから熱を感じるぐらい熱くなる)
> - reboot するアセンブラコードのアドレスが決めうちのようです。
> ここはぜひちゃんとアロケートしたページに置きたいところです。
確かにこれはあまりにもダサ過ぎますね。修正しました。ただし、まだ
> - pbsdboot からの移植が十分でないような気がします。
> 現在実行しているカーネルよりも大きなカーネル、
> たとえばインストール用の RAM disk イメージいりカーネルなどを
> ロードするとおかしくなりませんか?
の問題を直していないので、新しいカーネルをコピー中に自分自身を上書きして
しまう危険が残っています。
> pbsdboot ではこの問題を回避しています。あらかじめ新カーネルの
> アドレス範囲かわかっている場合は簡単に回避できます。
この辺の処理は、pbsdboot の場合 vmem_init()の中でやっているんですよね。
どうせ書き直すなら、マップの管理も hpcboot の方式に合わせて変更してしま
おうかな、という気もしているので、もう少し検討してみます。
# 私の場合、WinCE 抜きの reboot をしたい本来の動機は、NIC 2枚挿しした
# 16MB ほどの md root の ルータを手早く reboot したいというものだったの
# で、もろにこの問題に引っかかりそうですね。
# /sbin/init のかわりに reboot2 を実行するような、小さなカーネルを間に
# 挟むことになるでしょうから。
>(amiga にあるんだから、mips にもつけよう、っていうかんじで話をもっていく
>のかな...どのくらい抵抗があるかちょっと予想つきません...)
今のところ、akmem のコードは arch/mips/mips/mem.c の中に入っていますが、
arch/hpcmips/hpcmips/akmem.c を新たに作った上で、sys/conf.h を修正する
かわりに新たなメジャー番号を振って、arch/hpcmips/hpcmips/conf.c に追加
すれば、hpcmips の中だけで完結させれますけど、後ろ向きなやり方ですかね?
--
KOBAYASHI Yoshiaki