OS開発(真実)

Mary-Kate Olsen
リリース: 2024-09-19 18:17:11
オリジナル
312 人が閲覧しました

OS Development (The truth)

目次

  • はじめに
  • 1.ブートローダー: 物事を始める
  • 2.カーネルに入る: 魔法が起こる場所
  • 3.言語の選択
  • 4.安全性: 飛行機を墜落させないでください
  • 5.速度の最適化
  • 6. 基本ドライバーのセットアップ
    • 6.1 ビデオドライバー
    • 6.2 キーボードドライバー
    • 6.3 I/O ドライバー
  • 7.シェルの作成: ユーザー インターフェイス
  • 8.カスタム ファイルシステムの構築
  • 9.マウスドライバーの追加: クリックして移動
  • 10.シンプルな GUI の構築
  • 11.ウィンドウとイベントの処理
  • 12.メモ帳アプリの作成: クリックから入力まで
  • 13.最後の仕上げ: OS のように感じられるようにする

導入

オペレーティング システムをゼロから構築することは、開発者として最も挑戦的でやりがいのある経験の 1 つです。ほぼすべてのライブラリが存在する高レベルのアプリケーション開発とは異なり、OS 開発では、ハードウェアに直接触れ、メモリを手動で管理し、マシンの動作のあらゆる側面を制御するなど、金属に近いところで作業する必要があります。

私の経験から言えば、OS を構築するということは、アセンブリ言語に深く入り込み、ハードウェアと格闘し、クラッシュ、再起動 (特に再起動)、および長いデバッグ セッションに苦労することを意味します。ブートローダーのデバッグが難しいと思われる場合は、最新のツールを使わずにデバッグを試してみてください。 OS の開発により、数え切れないほど人生の選択に疑問を抱くようになります。

とはいえ、ブートローダーから、マウスを動かしたりテキスト エディタを開いて入力できる完全に機能するデスクトップ環境まで、すべてを分解してみましょう。


1. ブートローダー: 物事の始まり

ブートローダーとは何ですか?

ブートローダーは、OS 開発の最初のステップです。コンピューターの電源がオンになると、BIOS が引き継いでハードウェアをチェックし、ブートローダーをディスクからメモリにロードします。この小さなプログラムの仕事は、CPU を準備し、オペレーティング システムのカーネルをメモリにロードすることです。この段階ではハードウェアを直接扱うため、ブートローダーをアセンブリで記述する必要があります。

ブートローダーが開始されると、CPU は 16 ビット リアル モード になります。これは、1MB のメモリしかアドレス指定できないことを意味します。最初に行う必要があるのは、ディスクからカーネルをロードし、メモリに移動することです。その後、ブートローダーは CPU を 32 ビット保護モード に切り替えます。ここから楽しい作業が始まります。モードを切り替えるには、メモリセグメントを管理するためにグローバル記述子テーブル (GDT)を設定し、CPU の制御レジスタの保護有効化 (PE) ビットを有効にする必要があります。これを間違えると、システムがフリーズするか、ブート ループに陥ってしまい、私には認めたくないほど何度もこのようなことが起こりました。

リアルモードとプロテクトモード

リアル モードでは、すべてが非常に制限されています – 16 ビット レジスタ、1MB メモリ アクセス、メモリ保護なし。このため、保護モード に切り替えることが非常に重要です。プロテクト モードになると、CPU は 32 ビット レジスタ、より大きなメモリ アドレス指定、およびマルチタスクやページング (仮想メモリ) などの高度な機能にアクセスできるようになります。ブートローダーは、この移行をシームレスに実行することを目的としています。


2. カーネルに入る: 魔法が起こる場所

CPU が 保護モード に切り替わると、ブートローダーは制御を カーネル に渡します。カーネルはオペレーティング システムの中核であり、ハードウェア、メモリ、プロセス、システム リソースなどすべての管理を担当します。

カーネルが起動すると、いくつかの重要なシステムをセットアップする必要があります。

  1. ページング: これは、OS が各プロセスに独自の仮想メモリ空​​間を与えることを可能にするメモリ管理スキームです。これがなければ、すべてのプロセスが同じメモリを共有することになり、惨事の元となります。
  2. 割り込み処理: カーネルは割り込みを処理する必要があります。割り込みは、何かが直ちに対応する必要があることを示すハードウェア (キーボードやディスク ドライブなど) からの信号です。これを行うには、割り込み記述子テーブル (IDT) を定義する必要があります。これは、割り込みをカーネル内の特定のハンドラー関数にマップします。
  3. タスク スケジューリング: 複数のプロセスを実行する OS では、カーネルに CPU 時間を管理する方法が必要です。スケジューラは、どのプロセスがいつ CPU 時間を取得するかを決定し、システムの応答性と効率性を確保します。

カーネルの構築は長くて複雑な作業ですが、最もやりがいのある作業の 1 つでもあります。ここでは、オペレーティング システムの内部の仕組みを確認し、マシンの動作を細部まで制御できます。


3. 言語の選択

OS を構築するときは、タスクごとに適切なプログラミング言語を選択する必要があります。 ブートローダーは、ハードウェアを直接制御する必要があるため、通常はアセンブリで記述されます。ただし、プロテクト モードになってカーネルで作業すると、ほとんどの開発者は C に切り替えます。これは、すべてをアセンブリで記述するという頭を悩ませることなく、低レベルの制御が可能になるためです。

開発者の中には、複雑なシステムの管理を容易にするオブジェクト指向機能を提供する C++ をカーネル開発に使用する人もいます。ただし、C++ には追加のオーバーヘッドが伴うため、OS 環境では C++ でのメモリ管理が難しくなる可能性があります。 C は、システム プログラミングに必要な強力さとシンプルさを提供します。


4. 安全性: 飛行機を墜落させないでください

OS 開発では、安全性が重要です。クラッシュが単にエラー メッセージやアプリのシャットダウンを意味する高レベル プログラミングとは異なり、OS 開発ではクラッシュは通常、システムの完全な再起動を意味します。メモリを直接操作しているため、メモリ管理を間違えると、システム データが破損したり、重要な構造が上書きされたり、カーネル パニックが発生したりする可能性があります。

カーネルは、あるプロセスが別のプロセスのメモリを上書きしないようにメモリ保護を実装する必要があります。これは、各プロセスを独自の仮想メモリ空​​間にマップするページングを使用して行われます。これを間違えると、システム全体が不安定になり、何日もメモリのバグを追い続けることになります。信じてください、私はそこに行ったことがあります。


5. 速度の最適化

速度は、OS の応答性を高める重要な要素です。カーネルが遅いということはシステムが遅いことを意味するため、パフォーマンスを最適化することが重要です。ここでは、速度が重要となるいくつかの重要な領域を示します:

  • 割り込み処理: 常に入力をポーリングする (CPU サイクルを無駄にする) のではなく、ハードウェア割り込みを設定する必要があります。このようにして、CPU は、キー押下やネットワーク パケットの到着など、実際の入力があった場合にのみ応答します。
  • タスク スケジューリング: 優れたスケジューラーは、プロセス間の CPU 時間のバランスを効率的に調整し、どのプロセスもすべての CPU 時間を占有し、他のプロセスが不足することを防ぎます。 ラウンドロビン優先順位ベース スケジューリングなど、さまざまなスケジューリング アルゴリズムから選択できます。
  • 遅延読み込み: すべてを一度にメモリにロードしないでください。 デマンド ページングを実装します。これにより、実際に使用されているプログラムの部分のみがメモリにロードされます。これにより、メモリが節約され、システムのパフォーマンスが向上します。

6. 基本ドライバーのセットアップ

カーネルを実行できたので、次はハードウェアと対話するためのドライバーを構築します。ドライバーは OS とハードウェア間の橋渡しとなり、OS がキーボード、ディスプレイ、ディスク ドライブなどと通信できるようにします。

6.1 ビデオドライバー

最初、OS はおそらく テキスト モード で起動し、文字をビデオ メモリ (通常はアドレス 0xB8000) に直接出力します。これはデバッグや基本的な出力には問題ありませんが、最終的にはグラフィカル ユーザー インターフェイス (GUI) に移行することになります。これには、ピクセルレベルの制御、画面解像度、色深度を管理できるビデオドライバーが必要です。

ビデオ ドライバーのセットアップは、グラフィカル OS を作成するための大きな一歩ですが、ディスプレイ ハードウェアがどのように動作するかを理解し、フレームごとに大量のデータを管理する必要があるため、より複雑なタスクの 1 つでもあります。

6.2 キーボードドライバー

キーボード ドライバーは、対話型 OS の最も重要な部分の 1 つです。キーを押すと、キーボードは スキャンコード を CPU に送信します。キーボード ドライバーの仕事は、そのスキャンコードを OS が理解できる文字またはアクションに変換することです。これには、キーボードが生成するハードウェア割り込みである IRQ1 の割り込みハンドラーのセットアップが含まれます。

キーボード ドライバーが動作するようになったら、より複雑なユーザー インターフェイスの構築を開始し、ユーザーからの入力を取得し、コマンドを処理できます。

6.3 I/Oドライバー

I/O ドライバー は、OS がディスクの読み書きを可能にするものです。これは、プログラムのロード、ファイルの保存、データの保存などを行う場合に重要です。最初はおそらく BIOS 割り込みを使用してディスクを操作することになるでしょうが、OS が成熟するにつれて、より多くの機能に移行したくなるでしょう

ディスク コントローラーとの直接通信など、BIOS に依存しない高度な I/O メソッド。


7. シェルの作成: ユーザー インターフェイス

基本的なドライバーが動作するようになったら、シェル、つまりユーザーが OS と対話できるようにするコマンドライン インターフェイス (CLI) を構築します。シェルは、ユーザーがコマンドを入力し、プログラムを実行し、ファイルシステムと対話できる場所です。

シェルの実装は、OS が実際にインタラクティブであると感じ始める最初の場所の 1 つであるため、エキサイティングなステップです。ユーザー入力 (キーボードから) を処理し、コマンドを処理し、プログラムを実行する必要があります。これは、プロセスを効率的にマルチタスク処理し、管理するカーネルの機能の重要性を認識し始める場所でもあります。


8. カスタム ファイルシステムの構築

ファイルシステムは、OS がディスク上でデータを保存および取得できるようにするものです。既存のファイルシステム (FAT や ext4 など) を使用することもできますが、独自のカスタム ファイルシステムを構築すると、より詳細な制御が可能になり、楽しい挑戦になる可能性があります。

基本的なファイルシステムは次のことを行う必要があります:

  • 新しいファイル用にディスク上のスペースを割り当てます
  • ファイル名、ファイル サイズ、メタデータを追跡します
  • ファイルの読み取りと書き込みを効率的に許可します

OS が成長するにつれて、次のようなより高度な機能も処理する必要があります。

  • ディレクトリ: ファイルを階層に編成します。
  • 権限: ファイルの読み取り、書き込み、または実行ができるユーザーを制御します。
  • 断片化: ディスクの複数の領域に分割されたファイルを処理します。

ファイルシステムの設計は、パフォーマンス、信頼性、使いやすさのバランスを考慮する必要があるため、難しいものです。ファイルシステムの設計が適切でないと、データの破損、パフォーマンスの低下、またはディスク上のスペースの無駄が発生する可能性があります。


9. マウスドライバーの追加: クリックして移動

OS に CLI があり、キーボード入力を処理できるようになったので、マウス サポートを追加します。マウス ドライバーは、マウスの動きを追跡し、それをカーソルの移動やボタンのクリックなどの画面上のアクションに変換する役割を果たします。

マウス ドライバーのビルドには、マウスによって生成されるハードウェア割り込みである IRQ12 の処理と、移動データの処理が含まれます。マウス ドライバーを配置したら、グラフィカル ユーザー インターフェイス (GUI) の構築を検討し始めることができます。


10. 簡単な GUI の構築

グラフィカル ユーザー インターフェイス (GUI) は、OS をコマンド ライン インターフェイスから最新のデスクトップ環境に近い外観と操作性を実現します。この段階では、ユーザーがマウスでクリックできるウィンドウ、ボタン、メニュー、その他のインタラクティブな要素を構築します。

GUI の作成には、グラフィック レンダリング (ウィンドウやアイコンの描画) の管理、入力イベント (クリック、キー押下など) の処理、および複数のウィンドウとキー押下を管理するシステムの実装が含まれます。アプリケーション。

最初は、GUI は非常に基本的なもの、つまりユーザーが操作できる 1 つのウィンドウだけかもしれません。ただし、OS が成熟するにつれて、ウィンドウのサイズ変更、ドラッグ アンド ドロップ機能、アニメーションなどのより高度な機能を追加したくなるでしょう。


11. ウィンドウとイベントの処理

GUI の基本を理解したら、次のステップはウィンドウとイベントを管理するシステムを構築することです。これには、複数のウィンドウを同時に処理し、それぞれが異なるアプリケーションを実行する可能性があり、各ウィンドウが正しい入力イベント (マウスのクリックやキーボードの押下など) を確実に受け取るようにすることが含まれます。

ウィンドウの Z オーダー (どのウィンドウが一番上になるか)、最小化/最大化、および ドラッグ も実装する必要があります。ここで、物事が従来のデスクトップ環境のように感じられ始めます。


12. メモ帳アプリの作成: クリックから入力まで

GUI をより機能的にするには、メモ帳 アプリなどの基本的なアプリケーションを構築するとよいでしょう。メモ帳アプリは、ユーザーがファイルを入力、編集、保存できるシンプルなテキスト エディターです。このようなアプリの構築には以下が含まれます:

  • キーボードからのテキスト入力の処理
  • テキストを画面にレンダリング中
  • 開く、保存、閉じるなどの基本的なファイル操作を許可します

これは、すべてをまとめるのに最適な演習です。ここでは、GUI、ファイルシステム、入力処理のすべてが機能します。メモ帳アプリを動作させると、完全に機能する OS の基本が得られます。


13. 最後の仕上げ: OS のように感じさせる

この時点で、OS は機能しますが、より洗練されたと感じるための小さな詳細が常にあります。次のようなもの:

  • ユーザー アカウントと権限: 複数のユーザーが独自の設定とファイルを持つことを許可します。
  • ネットワーク: TCP/IP のサポートを追加して、OS がインターネットに接続できるようにします。
  • システムコール: アプリケーションがカーネルと対話するために使用できるインターフェースを作成します。

細部を追加するたびに、OS が完全なシステムのように感じられるようになります。これは長くて困難なプロセスですが、最終的には、真にユニークなもの、つまりゼロから構築されたオペレーティング システムを作成することになります。

以上がOS開発(真実)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!