はじめに Edit

本ソフトウェアはKernelの切り替えを動的に行うプログラムです。

最近、2.6カーネルが動き出したり、SH-Linuxのホームページにおいて、
SH版 Fedora Core 2 互換パッケージ等が公開されてたりして、
SH-Linux周辺に新たな動きがあります。

それらを見て、私もカーネルを変更したくなりまして。。。
しかし、LANDISKの箱を開けたくなかったのと、システムを壊してしまうのが嫌だったので、
本プログラムの作成を思い立った次第です。

なお、本ソフトウェアは、mipsマシンに実装されているakmemや
2.6カーネルで実装されるといわれるkexec等の思想をそっくりそのまま頂きました。

ソフトウェアの構成と動作概略 Edit

  • 概略
    本ソフトウェアは次の2つのパーツから構成されています。
    kernelsw.pl ・・・ フロントエンドスクリプト
    kernelsw.o ・・・ デバイスドライバモジュール

    kernelsw.plは、kernelsw.oへ、Kernel起動パラメータとKernelイメージの転送を行うPerlスクリプトです。
    kernelsw.oは上記スクリプトから送られてくるパラメータとイメージをLinux起動時の初期領域へ転送し、
    再配置して、新Kernelの起動を行うプログラムです。

  • kerneksw.o(ver1.2)の状態遷移図


    kernelsw_state.png

使用方法 Edit

  • デバイスファイル/dev/kernelsw(c,52,0)の作成
    本デバイスドライバモジュールはキャラクタ型デバイスとして実装されており、
    /dev/kernelsw(c,52,0)を経由して情報のやりとりを行います。

    次のコマンドで/dev/kernelsw(c,52,0)の作成を行います。
    # mount -o rw,remount /       # RWでリマウント
    # mknod /dev/kernelsw c 52 0  # デバイスファイルの作成
    # chmod 600 /dev/kernelsw
    # mount -o ro,remount /       # Read-onlyに戻す
  • 起動するカーネルイメージなどの設定
    kernelsw.plはperlスクリプトです。
    スクリプトの9〜12行目に必要なパラメータをセットします。
    • $image: 圧縮されたカーネルイメージを指定します。
    • $root: rootファイルシステムを指定します。
    • $readonly: rootファイルシステムを書き込み不可でマウントする時は1を設定します。
    • $append: カーネルに渡すパラメータを指定します。
    • @stop_command: 新カーネルへスイッチする直前に実行させたいコマンド群を列挙します。(手抜き)
    以下はLANDISKのオリジナルカーネルの設定です。
    ########################################
    $image    ="/boot/zImage";
    $root     ="/dev/hda1";
    $readonly = 1;
    $append   ="mem=64M console=ttySC1,9600"; 
    以下は、deamon類を停止するコマンド群です。
    @stop_command=(
    '/mnt/hda3/debian_stop >& /dev/null',
    '/etc/rc.d/init.d/S99shutdown stop >& /dev/null',
    '/etc/rc.d/init.d/S99reset_daemon stop >& /dev/null',
    '/etc/rc.d/init.d/S98UPnPResponder stop >& /dev/null',
    '/etc/rc.d/init.d/S95httpd stop >& /dev/null',
    '/etc/rc.d/init.d/S92netatalk stop >& /dev/null',
    '/etc/rc.d/init.d/S91samba stop >& /dev/null',
    '/etc/rc.d/init.d/S60lpd stop >& /dev/null',
    '/etc/rc.d/init.d/S40cron stop >& /dev/null',
    '/bin/umount -r /dev/hda3 >& /dev/null',
    #'/etc/rc.d/init.d/S20network stop >& /dev/null',
    #'/etc/rc.d/init.d/S15inet stop >& /dev/null',
    );
    #########################################
  • 新カーネルの起動(ソフトウェアの実行)
    本プログラムを実行すると実行中の旧カーネルは破壊されます。
    その状態を例えると、プログラム実行中に、電源が突然落ちたに等しい状態になります。汗

    従って、プログラムを実行する前に、実行中のプロセスを可能な限り停止させてください。
    さらに、ファイルシステムを可能な限りアンマウント、もしくは、リードオンリーでリマウントしてください。
    (この辺も自動化したかったのですが、やり方がわからなかった。詳しい人、教えてください。)

    まず、本ソフトウェアを実行する前に、新カーネルとルートファイルシステムを準備します。
    次に、kernelsw.plへカーネルの指定や起動パラメータの設定を行います。
    最後に、kernelsw.oとkernelsw.plが置かれた場所で、以下のコマンドを実行すると、
    新カーネルへのスイッチ動作が開始されます。
    # ./kernelsw.pl
    =========================================
         SH-Linux Kernel Switcher V1.2
    -----------------------------------------
    image  = /boot/zImage (size:978185)
    root   = /dev/hda1 (read only)
    append = "mem=64M console=ttySC1,9600"
    =========================================
    Loading .... 

    5秒くらいたつとLANDISKのLEDが全て消えます。 これはカーネルの転送が終了したことを示しています。
    その後、赤いLEDが点灯します。この間、本プログラムは、カーネルの再配置を行っています。
    再配置が完了すると、赤と緑の両方のLEDが点灯して、新カーネルへ制御が移ります。

    ここからは、本プログラムの動作を離れ、カーネル自身のコードで動作します。
    カーネルは、通常圧縮された状態にあるので、自らその圧縮をとき、ブートシーケンスを開始します。
    カーネルは初期化後、ルートファイルシステムをマウントして、initプログラムを起動します。
    そして、そのinitから、芋ズル式に各プログラムが起動され、最終的にtelnet等からアクセスできるようになります。

  • 制限事項
    • カーネルサイズの上限は、2MB(2,097,152バイト)です。
    • SH4アーキテクチャのみ対応しています。(LANDISKアーキテクチャと言うべきかも)

参考文献 Edit

  • LinuxSH
    SH-IPL Sequence,LILO Sequence,LinuxSH Kernel Boot Sequence等、
    SH-Linuxの起動のシーケンスが非常に参考になりました。
  • SH Linux TIPS
    デバイスドライバの書き方を参考にさせて頂きました。
  • LANDISK - mizore Wiki
    唯一のデバッグ手段がLEDでしたので、その解析ネタが非常に参考になりました。
  • SH4のプログラミングマニュアル

人柱になっても良いという方へ Edit

非常に危険なプログラムですが、使ってみたいという方はどうぞ!
次の場所へソースを含め、一式置いておきます。
http://eggplant.ddo.jp/www/download/SH-Linux_Kernel_Switcher/

今後の方針 Edit

「プログラム実行中に、電源が突然落ちたに等しい状態になります。」
の問題を解決したいと考えています。

シャットダウンの最終フェーズでは、必ず/sbin/rebootか/sbin/haltが呼ばれるらしいので、
該コマンドが実行される時、メモリ上に新カーネルが格納されているならばkernelswを発動させ、
そうでないなら従来のコマンドを実行するような仕組みをrebootやhaltに実装したいと考えています。

問題は、メモリ内に確保してあるカーネルイメージが、デバイスをクローズすることで、
スワップアウトされる可能性があるため、一筋縄ではいきそうにない点です。

この辺のメカニズムについて、詳しい方がいらっしゃいましたら、助言していだだければ幸いです。

  • 追記:自己解決
    デバイスをcloseするとき自分でメモリを開放していました。汗
    Ver2.0で本問題を解決しました。

Counter: 822, today: 1, yesterday: 0

添付ファイル: filekernelsw_state.png 62件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-06-13 (火) 20:02:26 (6534d)