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

Re: reboot without WinCE



竹村です。間が合いてしまってすみません。

 > argv[0] だけなら sysctl の CPU_BOOTED_KERNEL で参照できるみたいですが、他は
 > 良くわかりませんでした。

このへんはおいといて、

 >  >なんにせよ、とりあえず、プログラムをどこか皆から見えるところに置いて
 >  >みてくれませんか?
 > 
 > http://www.bb.wakwak.com/~gimy/reboot2.tar.gz
 > 
 > に置いておきました。作業しているうちに /dev/mem の ioctl でなくてもいいよう
 > な気がしてきたので、とりあえず、sysctl の拡張にしてみました。(NetBSD/mmeye
 > と同じ方針です。)

こばやしさんのプログラムを見て思ったのですが、map の内容を
user land に見せる必要はなくなっていますね。
逆に、map の内容を user land に見せないことによって、プラットフォーム
への依存性は低くなるので、なおさら MI な枠組を決めた上で、
MIPS なり hpcmips で実装したほうがよいような気がしてきます。

というわけで、こばやしさんのプログラムを参考にちょっと整理してみました。
こんなの↓はどうでしょうか?

-----
デバイス名:/dev/akmem (another kernel memory)

memio.h:
	struct mem_ak_alloc {
		int nsegments;
		struct akmem_segment {
			void *start, *end;
		} *segments;
	};
	#define MEMIOCTL_AKALLOC	_IO('W', struct mem_ak_alloc)
	struct mem_ak_exec {
		void *entry;
		int argc;
		char *argv[];
		void *env;
	};
	#define MEMIOCTL_AKEXEC		_IO('W', struct mem_ak_exec)

使い方:
	1. open("/dev/akmem", ...)
	   当然、root でなければエラーでオープンできない
	2. ioctl(MEMIOCTL_AKALLOC) で領域を確保する。
	   物理メモリを確保して、カーネル内部にマップ作成。
	   close すると確保された領域は解放される。
	   とりあえず実装では一続きの領域しか対応しない。
	   (nsegments!=1 はエラー)
	3. seek(), read(), write()
	   offset から map を参照して物理メモリを読み書き
	   2. で確保されていない領域へのアクセスはエラー
	4. ioctl(MEMIOCTL_AKEXEC)
	   カーネルを止め、map にしたがってメモリを再配置。
	   argc, argv, env をセットして、entry にジャンプ。
-----

 > 注意として、現状では reboot2 は signal の通知や umount 等は一切せずに、いき
 > なり新しい kernel に飛んでいるので、かなり危険です。md root や NFS root なら
 > 多少ましかも。この辺をきちんとするには、shutdown や reboot のやり方を真似す
 > ればいいのかな?

なるほど。全く考えていませんでした。
user land の方もそれなりにやることはありそうですね。

Takemura