[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