4

通常のオペレーティング システムが起動する前に、小さな Linux ディストリビューションを起動したいとします。

  1. BIOS は MBR をロードし、MBR を実行します。
  2. MBR は、私の Linux パーティションであるアクティブなパーティションを見つけます。
  3. Linux が起動し、必要なことを実行します。
  4. Linux がシャットダウンし、再びリアル モードに切り替えます。
  5. 元のパーティションのブート セクタが読み込まれ、通常の OS が起動します。

私の知る限り、ステップ 4 は難しい作業です。Linux より前のすべてのデバイスの状態を復元します。INT13h は機能しますか? 割り込みベクタ テーブルを復元する必要がありますか? いくつか言及します。

これはおそらく既存のプロジェクトで行われましたか?

4

3 に答える 3

4

Linux は通常、これをサポートしていません。特に、BIOS および DOS プログラムが予期しない方法でハードウェアを再初期化するためです。ただし、特定のケースで、特に再起動の場合 (arch/x86/kernel/reboot.c の machine_real_restart を参照) にリアル モードに戻すためのインフラストラクチャがいくつかあり、kexec またはサスペンド用にハードウェアを再初期化するコードがあります。これらの組み合わせで何かできるのではないかと思いますが、結果が DOS や Windows が再起動時に期待するものと本当に一致するかどうかはわかりません。

はるかに簡単な計画は、 GRUBのように、特定の構成で一度起動するように設定できるチェーンローディング ブートローダーを使用することです。grub-set-default を呼び出してから再起動できます。GRUB が起動すると、制御が Windows に渡されます。その後、フォールバック OS を Linux パーティションに設定すると、次の起動時に制御が Linux に戻ります。

さらに別のオプションはCorebootを使用することかもしれませんが、これがWindowsを起動するための本番環境にまだ対応しているかどうかはわかりません。

于 2009-05-14T16:23:02.047 に答える
3

私はこれを試したことがないので、うまくいくかどうかはわかりませんが、ここに行きます:

bzImage形式のカーネルファイルのヘッダーには、プロテクトモードコードが開始する前に実行するリアルモードコードのアドレスを指定するオプションがあります。実際のカーネルはないが、BIOSのようにINT 0x13から0x7c00を使用してMBRをロードし、それにjmpするリアルモードコードを含む、最小限のbzImage準拠のファイルを作成できます。

kexecを使用して「-tbzImage-x86--real-mode」オプションを使用してbzImageをロードする場合、CR0のPEビットをリセットしてリアルモードにドロップし(上記のbdonlanのように)、 bzImageヘッダーオプション。

bzImageヘッダーオプションはrealmode_swtchと呼ばれ、/ usr / src / linux / Documentation / x86 / boot.txtに記載されています。ヘッダー形式のコードは、/ usr / src / linux / arch / x86 / boot/header.Sにあります。

于 2009-06-26T19:09:11.113 に答える
1

kexecを調べましたか?

于 2009-05-12T23:11:58.230 に答える