114

オペレーティングシステムの作成は(特に自分で)耐えられないほど複雑であることを私は知っているので、これは無駄かもしれません。

  • 次のLinuxやWindowsを構築するつもりはありません。

  • 私はそれが恐ろしくてバグがあり、うまくいかないことを知っていますが、それは問題ありません。

私はすべてを自分で、 AssemblyC、および(一部の)C++で記述したいと思います。

今は忙しくてすぐに時間がないので、これは将来のプロジェクトですが、今すぐ聞いてみようと思ったので、たくさんの答えが得られるかもしれません。構築し、この種のアプローチに役立つリソースになります(minixからの構築、既存のブートローダーの使用、仮想ブートプログラムでの構築など、これまでに見たすべてのこと)。

古いデスクトップの1つにモニター、キーボード、マウスをセットアップして、空のハードドライブで作業を開始したいと思います。

自分のブートローダー(これについてはたくさんのリソースを見つけましたが、完全を期すために、まだいくつかの良いものを追加してください)、自分のUSBドライバー(必要な場合)、CDドライバー(必要な場合)の書き方を学びたいです。 )など。すべて、ゼロから。

  • コードをコンピューターに配置するにはどうすればよいですか?フロッピーディスクでそれを行うのが最善ですか?ほとんどのコンピューターはUSBスティックからそれを行うことができますか?

  • どのドライバーが必要ですか。それらを構築するための参照を提案できますか?

  • 起動シーケンスの後-それでは何ですか?プロテクトモードなどに入るにはどうすればよいですか。

  • オペレーティングシステムを使用せずにメモリを管理するにはどうすればよいですか?好きなアドレスを使うだけですか?初期化は必要ありませんか?

  • 私は間違いなく私を混乱させるものに遭遇しますか?

  • コマンドラインO/SとグラフィカルなO/Sのどちらかにするにはどうすればよいですか?

  • グラフィカルなO/Sは何に基づいていますか?たとえば、コマンドライン、フォント、画像を上部に表示するにはどうすればよいでしょうか。

  • マルチタスク環境の設定についてどこで読むことができますか?(つまり、2つのグラフィカルなコマンドラインを並べて実行します)。

  • ある種のウィンドウシステムをどのように設定しますか?単純なマルチタスクを設定した後、画面にグラフィックを表示するにはどうすればよいですか?

私を信じてください、私はこれが非常に複雑なプロジェクトであることを理解しています、そして私はおそらくそれを完成させたり、どんな用途でもそれに何かを書いたりすることは決してないでしょう。

これには、私が言及していない他の多くの部分があります。何か考えられる場合は、それらも自由に追加してください。

回答ごとに1つの「トピック」を入力してください。たとえば、USBドライバーを入力してから、リソースのリスト、注意事項などを入力してください。

また、別のO/Sまたは既存のコードから構築することを提案しないでください。私は多くの既存のコード(Linuxカーネル、サンプルリソース、既存のドライバーなど)を読むことを知っていますが、最終的にはすべて自分で書きたいと思っています。私は何か他のものから構築する必要があることを知っています、そして私が気が変わってそのルートに行くならば私が読むことができることについてSOについて他の多くの質問があります。しかし、これはすべてゼロからすべてを行うことです。

グラフィカルにする方法について何か提案はありますか?さまざまなビデオモードとそれらの操作方法など?

4

20 に答える 20

52

まず最初に。読む、読む、読む、読む、読む。独自のOSを実装する前に、OSがどのように機能するかをしっかりと理解する必要があります。

AndrewTanenbaumのオペレーティングシステムに関する本の1つを入手してください。これは、大学のOSクラスで使用したものです。

最新のオペレーティングシステムPDF

アマゾンの最新のオペレーティングシステム

ばかげた表紙にもかかわらず、それは特に教科書にとって素晴らしい読み物です。タネンバウムは本当にこの分野の専門家であり、OSが内部でどのように機能するかについての彼の説明は明確で理解しやすいものです。この本は主に理論ですが、彼は実装の詳細について説明している本も持っていると思います。でも読んだことがないのでコメントできません。

これは、プロセス管理、メモリ管理、ファイルシステム、およびOSカーネルが起動可能な状態にするために必要なその他すべてのことを骨抜きにするのに役立ちます。その時点から、基本的には、サポートする必要のあるハードウェア用のデバイスドライバーを作成し、ファイルやデバイスのオープン、読み取りと書き込み、プロセス間でのメッセージの受け渡しなどのカーネル呼び出しを行うためのCライブラリ関数の実装を提供する必要があります。 。

x86アセンブリについて読んでください(これをx86マシン用に設計していると仮定します)。これで、プロセッサの動作モード間の移動に関する多くの質問に答えることができます。

電子機器の知識がある場合は、x86 PCよりも一般的に単純であるため、十分なドキュメントを備えた組み込みデバイス用のオペレーティングシステムの作成から始める方が簡単な場合があります。私はいつも自分のOSも書きたいと思っていました。そして、Digilentからこの開発ボード用のマイクロカーネル組み込みOSを書くことから始めています。ザイリンクスのソフトコアMicroBlazeプロセッサを実行できます。これには、非常に詳細なドキュメントがあります。また、RAM、フラッシュデータストレージ、LED、スイッチ、ボタン、VGA出力などもあります。簡単なドライバーを作成するためのさまざまな機能があります。

組み込みデバイスの利点の1つは、VGAドライバーを長時間作成することを回避できる可能性があることです。私の場合、Digilent開発ボードにはUARTが搭載されているため、シリアル出力をコンソールとして効果的に使用して、すべてを起動し、最小限の手間でコマンドラインから起動できます。

ターゲットにすることを選択したものが、すぐに利用可能で十分にテストされたコンパイラーを備えていることを確認してください。OSとコンパイラを同時に作成する必要はありません。

于 2009-08-03T22:11:50.437 に答える
29

http://www.osdev.org/ および http://www.osdever.net/

OS 開発の世界へようこそ。

SO の タグ wikiにある他の x86 ドキュメント リンクも参照してください: Intel および AMD のマニュアル、コンパイラ/アセンブラ ドキュメント、およびさまざまなガイド。

また、ブートローダーをシングルステップしてレジスタを調べることができるため、BOCHS またはその他の仮想環境をデバッグに使用することもお勧めします。

于 2009-08-03T21:04:59.433 に答える
15

少なくとも最初は、Bochsやその他の仮想マシンで作業することをお勧めします。その理由は、どこにでも持ち運ぶことができ、デバッグが容易になるからです (ハードウェアの正確な状態を確認できます)。あなたとまったく同じ「ハードウェア」を使用できるデバッグの外部の助けが必要です。

私が持っている最も有用なアドバイスは、できるだけ早く C コードを実行できる状態にすることです。つまり、起動して記述子テーブルをセットアップし、コンパイル済みの C を安全に実行できる状態にします。正気を保ち、作業を続けたい場合は、すべてのカーネルを C にする必要はありません。アセンブリは、場所によっては必要ですが、面倒で、デバッグが困難になる傾向があります。

于 2009-08-03T21:46:58.990 に答える
14

最低レベルでは、オペレーティング システムができる必要がある最低限のことは、何らかの方法でシステムのハードウェアを駆動し、何らかの方法で何らかの「ユーザー コード」を実行することです。PC から始める場合は、何らかのデバイスからロードできるコードを作成する必要があります。古い PC にはファームウェアに BIOS があり、ハードウェアが初期化 (少なくともビデオ、キーボード、および何らかの形式のストレージまたはブート ローダー) を実行する方法を決定します。(2017 年 10 月の更新: 新しい PC には EFI または UEFI ファームウェアが搭載されています。これは主にペダンティックな違いです。この議論では同じ目的を果たします)。

そのため、ターゲット システムで BIOS やその他のファームウェアを使用する方法の低レベルの詳細を学習することから始めます。つまり、BIOS がロードして実行できるプログラムを作成する方法を学びます。それは最終的にブートローダーに変わります。小さく始めましょう。「Hello, Linus」をファームウェア ブート プロセスから直接出力するプログラムを取得するだけです (フロッピーまたは USB サム ドライブが適切な出発点です... または必要に応じてハード ドライブに)。

そこから、非常に単純なシリアル ドライバーを作成することをお勧めします。ブート ローダーを更新してシリアル ポートを初期化し、そこからダウンロードを開始します。次に、取得したコードを実行できます。そこから、別のブロックのセットに書き込むことができるブートストラップを少し書きます (ファイル システムはまだ実装していません... パーティション テーブルの解析も行っていません。そのため、最初はディスク上のブロックの生の範囲を処理するだけです。 )。

その時点で、ブートローダーはシリアルラインを介して新しいコードをプルし、パーティションにダンプできるはずです(はい、何らかのパーティションテーブル処理を実装します...標準のPC規則に準拠するかどうかは、この時点であなた次第です)、それを実行します。

そこから、はるかに洗練された機能に取り組むことができるはずです。このベースから、新しい「カーネル」を作成してコンパイルできます... テストベッドを再起動し、新しいカーネルをデプロイします。

(ブートローダーは、ダウンロードをスキップして既存のイメージを起動するためのコマンドとして、シリアル ハンドシェーク ライン上で BREAK などの信号を受信する必要があります。また、この方法でタイムアウトを処理する必要があります)。

そこから、非常に単純なターミナル レイヤーとコマンド シェルを作成します。ファイルシステム?カーネル以外の新しい実行可能コンテンツ (ファイルまたは何らかのオブジェクト) をダウンロードするコマンドを実装します。等々。

当然、PC のキーボードとビデオ (私の記憶が正しければ、それぞれ BIOS INT 0x16h と INT 0x10H のもの) を使用するコンソール ドライバーから始めることもできます。ただし、シリアル ドライバーから始めることをお勧めします。これは、他の既存の (機能する) システムからビルド/展開/テスト サイクルを自動化できるためです。新しい OS はクロスコンパイルされたプロジェクトとして開始されるため、それを処理する合理化された方法が不可欠になります。

あなたが自分のプロジェクトをどこまで進めたいのかわかりません。かなり印象的な目標は、「自己ホスティング」を達成することです。新しい OS を使用して、新しい OS の動作バージョンを (再) ビルド、リンク、および起動できる単純なアセンブラー/コンパイラーを作成できれば、その目標を達成したことになります。(これは要件ではないことに注意してください。多くの組み込みシステムは決して自己ホスト型になることはなく、何も問題はありません)。

于 2009-08-03T22:47:08.353 に答える
12

ハードウェア仮想化の使用を気にしない場合は、「Nand から Tetris へ」というコース (本 + 講義 + ソフトウェア) があります。完全なコンピューター システムを (これらの目的のために原子的で与えられた) 電気的 NAND ゲートから、OS の構築、言語、そして最後に個人のマシンでの簡単なゲームのコーディングまで、完全に自分で作成します。

これは素晴らしいアイデアだと思いますし、すぐに夢中になるつもりです。この本は驚くほど安く、コースは MIT で教えられていると思います。自分でゼロから構築したシステム全体について完全な知識を持っていることほど、大きな感動はありません。

リンク: http://www1.idc.ac.il/tecs/

于 2009-08-03T22:39:32.143 に答える
10

私は小規模から始めて8086組み込み開発キットを購入し、その上でマルチタスクOSを開発しました。カーネルを入手し、ハードウェアレベルでの作業に慣れたら、さらに難しいことを行う準備が整います。

VGAディスプレイのDOSクローンを作成することさえ、かなり難しいことです。詳細は膨大です。:-)

特定のトピック。

コードをコンピューターに配置するにはどうすればよいですか?フロッピーディスクでそれを行うのが最善ですか?ほとんどのコンピューターはUSBスティックからそれを行うことができますか?

BIOSは基本的なブートストラップを実行します。


どのドライバーが必要ですか。それらを構築するための参照を提案できますか?

直接のCPU/メモリ操作ではないもの。CPUリファレンスマニュアルに直接記載されていないもの。


起動シーケンスの後-それでは何ですか?プロテクトモードなどに入るにはどうすればよいですか。

保護モードは、ブートシーケンスの一部になります。

次に、マルチタスクを開始し、プロセスを開始する方法を理解します。


オペレーティングシステムを使用せずにメモリを管理するにはどうすればよいですか?好きなアドレスを使うだけですか?初期化は必要ありませんか?

正しい。最終的には仮想メモリシステムを整理したいと思うでしょう。


私は間違いなく私を混乱させるものに遭遇しますか?

デバッグツールがない、IOがない


コマンドラインO/SとグラフィカルなO/Sのどちらかにするにはどうすればよいですか?

悲しみを込めて。Windows 3.1とLinux、特にXウィンドウを検索します。


グラフィカルなO/Sは何に基づいていますか?たとえば、コマンドライン、フォント、画像を上部に表示するにはどうすればよいでしょうか。

Xウィンドウを検索します。


最後のアドバイス:linux/xウィンドウを調べてください。完璧ではありませんが、1つのアプローチを理解することができます。また、組み込みシステムを研究します。

于 2009-08-03T22:05:36.517 に答える
8

何よりも、これを実際のハードウェアで実行したい場合は、プロセッサのマニュアルのコピーが絶対に必要です。Intelのマニュアル(http://www.intel.com/products/processor/manuals/)は非常に貴重です。それらは、モードの切り替え(実/保護)から仮想メモリ管理(これまでに進むことを選択した場合)、システムコールの作成(ユーザーモードを実行する場合)まで、すべてを網羅しています。 最も重要なことは、TSSやセグメントレジスタなど、機能するために設定する必要のある多くのことを詳細に説明していることです。ほとんどのOSテキストでは、プロセッサよりも高レベルの概念に関心があるため、説明していません。具体的な詳細。

于 2009-08-17T04:25:01.200 に答える
8

MikeOS など、小さくて基本的なオープンソース OS のコードを読んでみてください。

または、次の手順をお勧めします (楽しいはずです!)。

  1. 仮想マシンを作成します。システムの内外を把握できるように、すべてのプロセッサ命令を定義します。キーボード、マウス、画面、オーディオ アクセス用の SDL とインターフェイスします。すべてを一度に頭に入れられるように、シンプルに保ちます。最先端の仮想マシンである必要はありません。「実際の」コンピュータの機能をエミュレートできるものであればよいのです。
  2. 仮想マシンのプロセッサ用のアセンブラを作成します。このアセンブラは、仮想マシンの言語で書かれたプログラムである必要はなく、アセンブリ言語をマシン コードに変換できるものである必要があることに注意してください。
  3. 実行形式を定義し、単純なリンカを記述します。
  4. これで、オペレーティング システムを作成するためのすべてのパーツが揃いました。アセンブリ言語で書いて、アセンブルして...など..複雑なブートローディングのプロセスは必要ありません。マシンに最初にOSを実行させるだけです。

上記の手順は、単純な OS を作成するのにはばかげているように思えるかもしれませんが、とても楽しいものです。

于 2011-08-20T09:07:22.747 に答える
8

OS 開発シリーズ@ BrokenThorn に興味があるかもしれません。

于 2009-08-19T17:08:00.057 に答える
8

OS 開発サイトへの優れた参考文献がたくさんあるので、別のアプローチについて説明します。

ベア メタルから OS を実装する経験が必要な場合は、古い PC よりもはるかに優れたハードウェアの選択肢があります。PC アーキテクチャでは、30 年の設計履歴の興味をそそらないアーティファクトをコーディングするのに、途方もない時間を費やすことになります。たとえば、プロジェクトのブートローダの部分だけで、おそらく多くの勇敢なプログラマーが燃え尽きてしまいました。

たとえば、カーネルをディスクやネットワークから読み取るには、1 セットのドライバーが必要です。次に、プロテクト モードに入るコードが必要になります。その時点で、別のドライバー セットが必要になります。チップを保護モードにするために行う作業は、その時点以降に転送できるものはほとんどありません。別の PC で +-4 年間実行したい場合は、さらに別のドライバー セットが必要になります。

ARM またはその他の 32 ビット「組み込み」チップのブートストラップを検討してください。安価な開発ボードが利用できます。または、独自のはんだ付けもできます。イーサネットと USB が組み込まれているものもあります。健全で無愛想なアーキテクチャでの作業がより楽しくなり、最終的には再利用可能なスキルが得られると思います。

于 2009-08-04T00:15:14.287 に答える
6

MikeOSをチェックしてください。書かれたそのかなり単純なOSは(コメントのように)読み取り可能なアセンブリです。かなりシンプルですが、GUIがあり、ネットワークとマルチメディアをサポートしています。

編集MenuetOSはグラフィカルです。また、まっすぐなasmと書かれていますが、MikeOSよりも洗練されています

于 2009-08-03T21:52:58.540 に答える
6

あなたには野心的な目標があります。しかし、実行が鍵となります。

構造化されたアプローチ(教科書または大学のクラス)のほとんどはプロセスを順を追って説明しますが、選択したプラットフォームの難解な詳細を詳しく説明し、全体像のアイデアに集中できるようにする、多くの本質的なコードを提供します。プロセススケジューリング、メモリ管理、デッドロック防止、I/Oなど。

私のアドバイスはこれです:あなたの期待を減らして、基本的な質問から始めてください。

オペレーティングシステムとは何ですか?

コンピューター科学者は、(願わくば)OSがグラフィカルユーザーインターフェイス、Webブラウザー、USBデバイスを接続する方法、またはユーザーが実際に見たり触れたりできるものであるとは決して言いません。代わりに、最も基本的なレベルのOSは、私が上で述べたものです。それらはすべて、リソース管理という1つの大きな傘下にあります。

オペレーティングシステムは、コンピュータのハードウェアリソース(メモリ、CPU、周辺機器)を管理するプログラムにすぎません。

簡単なオペレーティングシステムは次のとおりです。プログラムを使用すると、ユーザーはシリアル接続を使用してプログラムを(16進数または2進数で)入力できます。プログラムを入力すると、プログラムが実行されます。プログラムが終了すると、制御がユーザーに戻され、ユーザーはプログラムを再度実行するか、新しいプログラムを入力することができます。

これは、64K程度のメモリを搭載した組み込みARMプロセッサなどの「クリーンな」アーキテクチャで実行します。ARMの詳細を数日学習した後、これをアセンブリでコーディングできます。そして出来上がり!、あなたはあなた自身にオペレーティングシステムを持っています。

これは、OSが実行することになっているすべてのことを実行します。

  • ユーザーがOS自体を上書きしないようにすることでメモリを管理します。
  • 実行する単一のプロセスをスケジュールします。
  • シングルシリアルペリフェラルへのI/Oを処理します。

これにより、開始するためのビルディングブロックが得られます。あなたは今多くの選択肢があります。おそらく、そのうちの1つは、2つのプログラムをメモリにロードして、次に実行するプログラムをユーザーに決定させることです。

または、ユーザーに1つのプログラムの実行を一時停止させ、別のプログラムに切り替え、一時停止してから元に戻すことができます。これは完全に手動ですが、基本的なマルチタスクです。

あなたの選択は無制限ですが、それぞれがあなたが以前持っていたものからの赤ちゃんの一歩です。

視線を高くしすぎないのは楽しいです!

于 2009-08-22T23:59:03.723 に答える
4

多くの学校には、あなたが説明することの多くを行うOSクラスがあります。私の学校(CMU)はCでOSを教えており、カーネル、ファイルシステム、シェルを作成し、ブートローダーのコードを提供しました。

残念ながら、このコース(15-412)の決定的なリソースをウェブ上で見つけることができず、時間の経過とともに進化してきました。しかし、おそらく人々は、ウェブ上に優れたリソースを持っている学校の情報源や課題へのリンクを投稿することができます。

于 2009-08-03T21:49:43.197 に答える
3

Abraham Silberschatzによるオペレーティングシステムの概念を検討することを検討することをお勧めします-システムプログラミングの概念を理解することは基本的な要件です。OS、Linux*BSDおよびGNU/Linux、特に以前のバージョンのF/OSSカーネル内部を覗いてみてください。おそらくもう少し文書化されています。代替テキスト 代替テキスト

于 2009-08-19T17:01:14.220 に答える
3

低レベルのグラフィックス プログラミングについては、http ://www.osdever.net/FreeVGA/home.htm で多くの情報が得られます。(テキストモードでも非常に興味深いです。)

間違いなく私を混乱させるものに出くわすでしょうか?

PC では不明な点が非常に多いことに気付くでしょう。x86 命令セット自体は複雑であり、ハードウェアに直接アクセスすると、画面に 1 文字を書き込む方法を理解するまでにかなりの時間がかかる場合があります。 .

フロッピー ディスクなどについて心配する必要はありません。ほとんどの場合、Bochs や QEmu などのエミュレータを使用します。

于 2009-08-23T00:34:13.587 に答える
3

「独自のおもちゃの UNIX クローン OS をロールする」という名前のこのチュートリアルをお楽しみいただけると思います。これは非常に洞察に富んでおり、途中で役立つはずです。

幸運を。

于 2009-08-03T22:28:23.913 に答える
3

盗むことができるアイデアについては、 A2 システム(以前はOberon システムと呼ばれていました) を調べてください。確かに1人はNiklaus Wirthですが、これはわずか2人によって構築されたグラフィカルOSです。最初にリリースされたのは1990年頃で、スピードは驚くほど良いです。Gutknecht の本があります。

于 2009-08-04T04:38:28.823 に答える
2

Minixを見てください。「オペレーティングシステムの設計と実装」と一緒にソースコードを調べてください。プロジェクトへの貢献を検討してください。Minixは本当に優れた有望なOSだと思います。また、資金も十分にあるプロジェクトです。つまり、あなたはあなたの貢献に対して報酬を受け取るかもしれません!

于 2009-08-04T06:29:13.343 に答える
1

BIOS には、画面モードの変更、ピクセルの色の変更、画面へのテキストの書き込み、その他多くの機能が組み込まれているため、非常に簡単です。ただし、ファイル システムのサポートは含まれていません。これは、OS に組み込む必要がある数少ない機能の 1 つです。

BIOS はハード ドライブの最初のセクターをロードし、そこからコードの実行を開始するため、OS はハード ドライブの最初のセクターに最初の命令を配置する必要があります。

このウィキペディアの記事では、画面にテキストを書き込んだり、キーボードからキーを受け取ったり、その他のことを行うための BIOS 割り込みについて説明しています。 https://en.wikipedia.org/wiki/BIOS_interrupt_call

C++ を使用する予定がある場合でも、アセンブリ プログラミングについて読むことを強くお勧めします。アセンブリ プログラミングは、ハードウェアの仕組みを理解するために不可欠です。

于 2016-01-24T00:12:06.307 に答える