web-dev-qa-db-ja.com

古いデスクトップコンピューターで小さなオペレーティングシステムを構築するにはどうすればよいですか?

オペレーティングシステムの作成は耐え難いほど複雑であることがわかっているので(特に自分で)、これは無駄になります。

  • 次のLinuxやWindowsをビルドする予定はありません。

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

アセンブリ[〜#〜] c [〜#〜]、および(一部)C++ですべてを自分で書きたいと思います。

これは将来のプロジェクトです。現時点では他のことで忙しくて、すぐに時間がないのですが、今すぐ質問することを考えていたので、これに対して多くの答えを得ることができました。この種のアプローチに役立つリソースを構築します(私が見た他のすべては、minixからのビルド、既存のブートローダーの使用、仮想ブートプログラムでのビルドなど)。

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

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

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

  • どのドライバーが必要ですか?また、それらのビルドへの参照を提案できますか?

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

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

  • 間違いなく私は混乱に陥りますか?

  • コマンドラインO/Sとグラフィカルなもののどちらにすることができますか?

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

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

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

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

これには他にも多くの部分がありますが、言及していない場合は、それらを追加してください。

回答ごとに1つの「トピック」を入力してください。たとえば、USBドライバー、そして場合によってはリソースのリスト、注意すべき事項などを入力してください。

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

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

110
Carson Myers

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

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

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

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

馬鹿げた表紙にもかかわらず、それは特に教科書にとって素晴らしい読み物です。 Tanenbaumは本当にこの分野の専門家であり、OSがフードの下でどのように機能するかについての彼の説明は明確で理解しやすいものです。この本は主に理論ですが、彼はより多くの実装について議論する本も持っていると思います。しかし、私はそれを読んだことがないので、コメントすることはできません。

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

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

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

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

ターゲットに選択するものには、すぐに利用できる十分にテストされたコンパイラーがあることを確認してください。 OSとコンパイラを同時に記述したいnotを行います。

49
Bob Somers

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

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

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

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

28
fnurglewitz

少なくとも最初は Bochs または他の仮想マシンで作業することをお勧めします。理由は、どこにでも持ち運べるからです。デバッグが簡単です(正確な状態を確認できます)ハードウェア)、およびデバッグの外部ヘルプが必要な場合、彼らはあなたとまったく同じ「ハードウェア」を使用できます。

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

15
hbar

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

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

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

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

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

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

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

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

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

14
Jim Dennis

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

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

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

12
Sam

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

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

特定のトピック。

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

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


どのドライバーが必要ですか?また、それらのビルドへの参照を提案できますか?

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


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

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

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


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

正しい。おそらく、最終的に仮想メモリシステムを整理する必要があります。


間違いなく私は混乱に陥りますか?

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


コマンドラインO/Sとグラフィカルなもののどちらにすることができますか?

悲しみとともに。 Windows 3.1およびLinux、特にXウィンドウを検索します。


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

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


最後のアドバイス:linux/x windowsを勉強してください。完全ではありませんが、oneアプローチの理解を提供します。組み込みシステムについても検討します。

10
Paul Nathan

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

8
csgordon

OS開発サイトへの良い参照がたくさんあるので、別のアプローチを説明します。

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

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

ARMまたはその他の32ビット「組み込み」チップをブートストラップします。安価な開発ボードが利用可能です。または、独自のはんだ付けができます!組み込みのイーサネットとusbがあります。健全で無愛想なアーキテクチャでの作業をもっと楽しくして、おそらく再利用可能なスキルが必要になるでしょう。

8
Marsh Ray

OS開発シリーズ @ BrokenThornは興味を引くかもしれません。

8
tomzx

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

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

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

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

8
ouiliame

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

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

私のアドバイスはこれです。あなたの期待を抑え、基本的な質問から始めましょう。

オペレーティングシステムとは?

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

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

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

これは、組み込みのARMプロセッサが64K程度のプロセッサなど)の「クリーン」アーキテクチャで行います。ARMの内部と外部を数日間学習した後、アセンブリでこれをコーディングできます。 。出来上がり!、あなたはあなた自身にオペレーティングシステムを手に入れました。

OSが行うはずのすべてを実行します。

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

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

または、ユーザーが1つのプログラムの実行を中断し、他のプログラムに切り替え、中断し、元に戻すこともできます。これは完全に手作業ですが、基本的なマルチタスクです。

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

あなたがあまりにもあなたの視力を設定しない場合、それは楽しいです!

6
Barry Brown

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

editMenuetOS はグラフィカルです。書かれているのもストレートasmですが、MikeOSよりも洗練されています

6
Alex

StackOverflowのリソースのリストを管理しています: オペレーティングシステム開発の開始方法 。冒険を始めたら新しいリソースを追加してください(これから始めます:))

5
Giovanni Galbo

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

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

4
Drew Hoskins

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

3
amaterasu

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

3
Norman Ramsey

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

私は間違いなく私を混乱させるでしょうか?

PCには不明瞭なものが非常にたくさんあることがわかります。x86命令セット自体は複雑であり、ハードウェアに直接アクセスする場合、画面に1文字を書く方法を理解するまでにかなり時間がかかることがあります。 。

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

3

this 「独自のおもちゃUNIXクローンOSをロールする」という名前のチュートリアルをお楽しみください。非常に洞察に富んでおり、あなたを助けてくれるはずです。

がんばろう。

3
blacky

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

2
Vijay Mathew

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

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

このウィキペディアの記事は、画面にテキストを書き込んだり、キーボードからキーを受け取ったりするためのBIOS割り込みを開始するためのものです。 https://en.wikipedia.org/wiki/BIOS_interrupt_call

C++の使用を計画している場合でも、ハードウェアの動作を理解することが重要であるため、アセンブリプログラミングを読むことを強くお勧めします。

1
Alpha_Pi