13

低レベルのものを少しいじるために、小さなカーネルを書いています。現在、Virtual Box で起動し、画面にテキストを表示したり、メモリを割り当てたり、その他の非常に基本的なことを行うことができます。C++ と少しの asm で書かれています。

私が探求したかったことの 1 つは、マルチタスクの背後にあるメカニズムでした。私が理解しているように、それは次のようになります。

  1. カーネルは、割り込み記述子テーブルを初期化して、割り込みが定期的に (ミリ秒単位など) 発行されるようにし、カーネルで定義されたルーチンを呼び出します。
  2. ルーチンが呼び出されると、コード/データ セグメントとスタック ポインタを別のプログラムのコンテキスト (「コンテキスト スイッチ」) のセグメントに設定することができます。

ですから、コンセプトは単純に見えましたが、詳細はもっと複雑になることはわかっていました. オンラインでいくつかのものを見つけましたが、用語は大きく異なり、例は私が持っていないコンテキスト (Linux カーネル内など) からのもののようです。

ただし、記述子テーブルを設定する方法は次のようです。

  1. いくつかのデータを PIC (およびその他) に送信outbして初期化します。
  2. 必要なルーチンへの関数ポインターを使用して、メモリ内に割り込みテーブルを準備します。関数がシグナル ハンドラーになることができるように注意してください。
  3. でテーブルをロードしますlidt

ただし、これらのことを具体的に行うこと、またはこれが正しいかどうかについては、あまりわかりません。当惑したカーネルライターのためのリソースを持っている人はいますか?

4

1 に答える 1

6

PC が起動すると、IRQ0 ~ IRQ15 が int 8 ~ int 0Fh および int 70h ~ int 77h にバインドされるように、BIOS が PIC をプログラムします。これは、BIOS が動作し、MSDOS が動作する実アドレス モードでは問題ありません。

ただし、いくつかの重要な例外が int 8 から int 0Fh (特に #GP、#SS、#PF) にあるため、保護モードに切り替えるときにこのマッピングを変更する必要があります。これらの例外と、タイマーとリアルタイム クロック、キーボードとマウス、ディスクと I/O ポート (シリアルとパラレル) から発生するハードウェア割り込みを簡単に区別できるようにする必要があるためです。

これはおそらく、あなたが概説した最初のステップです。したがって、オンラインで「PIC割り込みリマッピング」などを調べてください。また、8259 チップ (PIC) の仕様をダウンロードして、何をしているのか、実際にどのように動作するのかを理解してください。「HelpPC」は、さまざまな PC ハードウェアに関する情報の一部を含む古き良きリファレンスです。

「PCGPE」(PC ゲーム プログラミング エンサイクロペディア) と「RBIL」(ラルフ ブラウンの割り込みリスト) も非常に役立つ可能性があります。

IVT/IDT のセットアップについては、Intel および AMD CPU のドキュメントで説明されています。それはすべてそこにあります。最も楽しい読み物ではありませんが、最も詳細で権威のあるものです。

自作 OS 愛好家などの Web サイトが多数あり、詳細やコードのスニペットを見つけることができます。

于 2012-04-29T05:00:34.957 に答える