2

それで、クリスマス用に新しいコンピューターを手に入れたのですが、それには Windows 8 がプリインストールされていました。Linux UbuntuとW8の両方を同じドライブで実行するのに十分な問題がありました。1 つのハード ドライブで 2 つのオペレーティング システムを使用するには、2 つの OS が互いに競合しないようにドライブをパーティション分割する必要があります。現在、 Windows 8 内で実行されるMini Partition Tool Wizardと呼ばれるプログラムがあります (また、gparted と呼ばれる Linux 用の同様のプログラムもあります)。このプログラムを使用すると、オペレーティング システムを上書きしない限り、ハードディスク パーティションの作成とサイズ変更を行うことができます。を現在使用しています。

簡単に言うと、ブート制御とハードディスク管理専用のミニ オペレーティング システムを書きたいと思っています。つまり、書き込み、デバッグ、実行可能コードへのコンパイルが完了したら、BIOS メニューで起動できる USB メモリ スティックに配置し、ハード ドライブ パーティションを直接セットアップし、必要に応じてハード ドライブをフォーマットします。 . BIOS に、自分でそれを行うというユーザー オプションがないことに、私は非常に驚いています。

私の質問は、C/C++ のツールのみを使用してこれを行うことはできますか? または、インライン アセンブリ コードが必要ですか? または、C++ プログラムで使用されるアセンブリ コード モジュールを作成することもできます。Mini Partition Tool Wizard がオープン ソースではないことを確認してください (Windows でもありません)。これまでに OS を書いたことがないので、私はこれには不慣れですが、時間をかけてそれがどのように行われるかを学ぶことができます。

4

1 に答える 1

1

C/C++ のツールのみを使用してこれを行うことはできますか? または、インライン アセンブリ コードが必要ですか?

インラインの種類ではなく、いくつかのアセンブリが必要になります。コンパイルされた C/C++ コードは、多くのものが既にセットアップおよび構成されていることを想定しています (CPU の 32 ビット保護モード、スタック、さまざまな CPU レジスタの値、デバイス ドライバー、割り込み、C/C++ メモリ マネージャーなど)。など)、一方、BIOS はディスクから 512 バイト長のセクターを 1 つロードし、CPU がまだ 16 ビット モードのままで、何も設定せずに制御をそこに移すだけです。

したがって、アセンブリ コードを次のように記述する必要があります。

  • ディスクからさらに多くのものをロードすると、すべてが 512 バイトに収まるとは思えませんよね?
  • CPU を 32 ビット保護モードに切り替える
  • 割り込みコントローラを再構成して、割り込みがプロテクト モードの例外と同じ割り込みベクトルにマップされないようにします (まあ、この小さな部分は C で実行できます)。
  • 例外ハンドラを書く
  • タイマーやキーボードなどの基本的な割り込みハンドラーを作成します (慎重に設計されている場合は、アセンブリでこれのごく一部を実行するだけでよく、残りは C で実行できます)。

そして、切り替え後は BIOS を使用できなくなるため、他のすべての 32 ビット I/O デバイス ドライバーを作成する必要があります。別の方法として、仮想 8086 マシンを (仮想 8086 モードを使用して) 実装して、この処理を BIOS に委任することもできますが、これも簡単なことではありません。これのほとんどは C で行うことができますが、アセンブリ コードの知識または使用が依然として必要です。

また、C (C++) の標準ライブラリの一部を再実装する必要があるため、malloc()/ newputch()getchar()、などはfopen()time()Windows や Linux の代わりに低レベル API を使用します。

知識も経験も何もない状態から、何かが機能するようになるまで、数年を費やす準備をしてください。

ええ、確かにosdev.orgで何かを学び始めることができます。comp.lang.asm.x86alt.os.development という便利なニュースグループもあります。

于 2013-02-25T19:56:19.430 に答える