[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