ビデオを見るコースは説明する李Zhijun教師の使用をサポートし、オペレーティングシステムを打ちます。
参考ブログ:
https://blog.csdn.net/tang_love_yuan/article/details/79127043
https://www.cnblogs.com/ybf-yyj/p/9038412.html
オペレーティングシステムの学習、残ることができないシステムのAPI呼び出しで、あなたは、より良く、より効率的なAPIコールにできることの限界やAPIの欠点を知っておく必要があり、それは、オペレーティングシステムの蓋を開くことが必要であり、オペレーティングシステムのAPIは、下の探検基本原理。
私たちの通電からコンピュータがコンピュータのさまざまなコンポーネントがアップし、それを実行しているか、電源キーを押してしまいます。私たちは今、あなたのコンピュータ、私たちのコンピュータの構造うち最初の数字を開始する前に、我々は探検、ノイマン型に従わなければなりません。
1.作品ノイマン型コンピュータ
- サイトを取って、1、2、行わ:CPUのコンピュータワークのコアコンポーネントは、内部電源からCPUの開始を繰り返し二つの動作で実行されます
- コンピュータプログラムで運用一連の命令に応じて異なるアクションを実行するコンピュータ。
- コンピュータプログラムは、プログラム、データおよび命令を無差別にメモリに格納されて、バイナリモードでメモリ内で実行されています。
2.コンピュータの起動プロセス
図1:システム電源から実行されるプログラム
- X86 PCの起動は、CPUがであるときは実モード、この時点でメモリが計算されます。セグメントのセグメント・ベース・アドレスは、<< 4 +オフセット
- よるCPUの最初の命令CS:IPは、時間CS = 0xFFFFで、IP = 0x0000に、取得します。これは、ハードウェア設定されています。
- したがって、命令アドレスは0xFFFF0始めて実行され、マザーボードのBIOS ROM(読み出し専用メモリ)でこのメモリアドレスマッピング。
- ROMはRAM、キーボード、モニターを検出するかどうか、ハードとソフトディスクが正しく動作します。そして、それはアドレス0割り込みベクタテーブルからBIOSのセットアップを開始します。
- プログラムの実行は、ROMを続行ブートデバイス0x07c00にメモリにディスク0トラック0のセクター、512バイトセクタを。0x07c00が先頭のアドレスにシステムモジュールのコピーに続く、歴史によって残さ質問である、予約済みのスペースが十分に、そうbootsect必要になります0x07c00システムのブートと設定されたコピーモジュールゴーを動作させる、この1。これは歴史的な負担とみなされています。
- セット= CS 0x07c00、IP = 0000。
- 最終的にはROMのプログラムの実行、行く0x07c00を実装の先頭に。
ブートデバイスがBIOSプログラムを介して設定することができ、情報は、内CMOS(チップ)に書き込まれます。CMOS(64B-128B)は、リアルタイムクロック、ハードウェア構成情報等に格納されています。(DELスタート、コンフィギュレーション・インタフェース設定を入力するためのスタートキーを押したままにすると、コンパクトディスクまたはUディスク、等を設定します)
図2:ディスク上のカーネルの配布
何かを何3.のbootsect.S
- 0x07c00は0x90000でコピーするために、512のバイトを始めます。(0x90000-0x90020)
- SPが提供されるスタックセットSS = 0x9000という、SP =は0xFF00は、カバーされ、オペレーティング・システム・コード以下のスタック領域を防ぐために十分な大きさです。
- コールBIOS OX13は2-5セクタが始まった0x90020でメモリにコピーされ、中断しました。エラーが発生した場合、それを繰り返し読まれます。
- ディスクパラメータを取得します:トラック数など
- 文字列情報を印刷:システムがロードされます
- システム部分(セクタ数百)を読み出し、0x10000番地にメモリに読み込まれます。(0x90000以下)で
- セットアップの一部であるコードの実行を開始したアドレス0x90020、実行時のアドレスに移動します。
4.セットアップ・モジュールは、何かをやっ
主な仕事は、オペレーティング・システムが起動する前に、セットアップ作業を完了することです。
- カーソルの読み取り位置情報は、最初の2バイト09000に配置されています。コードこの時間bootsectモジュールは一切使用していないので、それをカバーすることができます。
- 次の2バイトに、拡張メモリサイズを読み出します。
- パラメータ取得カード、ハードディスクのパラメータのように。
- 初めにシステムからモジュールの内容は、すなわち、0x10000番地0x00000でメモリ内の開始位置を移動させます。最初にBIOSの割り込みを入れているため負荷が0x00000に一度入って来ない理由は、0x00000です。不要になった割り込みBIOS今、それをカバーすることができます。
- これは始まりません、ベクタテーブル割り込みBIOSがカバーされた、バックはもはやBIOS割り込み必要
- 割り込みディスクリプタ・テーブルを設定すると、グローバルベクトルテーブルの一部を説明しています。
- CR0が最後のビットが1にセットされ、それが保護モードにリアルモードから言うことです。
- JMPI 0,8。CS = 8は、実際には、セグメントベースを取るためには0x0000で、この文にジャンプ0x00000が実行を開始する場所の住所、システムモジュールの、すなわち始まりです。
アドレス変換および保護モードを変更するためのプロセスを中断:
CS:IPは翻訳プロセスである:、対応テーブルエントリGDTからベースアドレスを取得するために、撮影したGDT CS(ここで、1)の前面12からオフセットIP、次いで完全なアドレスに組み合わせます。
int型のn:n個のIDTテーブルを示しています。割り込みハンドラテーブルIDTからエントリアドレスを取得します。
5.システム・ヘッド
システムhead.s最初の部分は、このコードは絶対アドレス0を開始する場所に実際にある、コードの一部です。コードのこのセクションは、保護モードで実行使用される使用as86の異なる前アセンブリ命令とAT&Tアセンブラ命令フォーマットです。コードのこの部分は、主に以下のいくつかのことを完了しています。
- 記述子256ドアディスクリプタ割り込み初期スタート。
- A20アドレスラインが開いているか確認してください。A20アドレスラインの説明
- システムは、データ・コプロセッサを含み、ビットレジスタCR0に対応する設定かどうかをテスト。
- 内容の初期化メモリのページテーブル、ページング管理のための準備作業。ある先頭の絶対物理アドレス0、上のページ・ディレクトリ・テーブルは、物理的なメモリ位置head.sプログラムは、プログラムが上書きされます。80286は、ページテーブルは、アドレス16メガバイトすることができるようにするので、16Mアドレッシング、24本のアドレスラインでした。メモリ・ページ・サイズは、ページテーブルエントリ、4バイトの数によってエントリ、16Kバイト(4)必要になり、ページテーブルがあることを4K、4Kである場合。ここだけのステージ1のテーブルを使用し、2ページテーブル、3つの以降の開発のページテーブルがありました。
- init / main.cの中に、システムの初期化プログラムモジュールへの最後のホップを続けます。
プログラム実行head.sの終了後、それは公式のコンテンツページの設定メモリのページテーブルを完了した、との記述子テーブルIDTとグローバル記述子テーブルのGTD割り込みカーネルの実際の使用を再設定します。また、フロッピーディスクドライブのバッファ1キロバイトを開きました。このとき、詳細画像メモリシステム・モジュールは、次のように
図3:画像メモリシステムの概略図
6.全体の実行ライン
全体として、6段、bootsetの最初の2つの段階に中間体3セットアップステージ、ヘッドモジュールシステムの最終段階に分けることができます。
図4:メモリの場合にはブート、カーネルと移動後の位置の全体のプロセスを開始します
7.参考
[1]「30日自作オペレーティングシステム、」秀美河合
趙jiongが[2]「完全に0.12カーネルに基づくLinuxカーネル解析」
[3]「オペレーティングシステムの原則、および達成するための実践」李Zhijunを