オペレーティング システムはどのようにして「作られる」のでしょうか?

StackOverflow https://stackoverflow.com/questions/403754

質問

OSを作るのはこんな感じ 大規模 プロジェクト。誰でもどうやって始められるでしょうか?

たとえば、Ubuntu をドライブに挿入すると、コンピューターはどうやって 走る それ?(これが私が本当に知りたいことだと思います。)

あるいは、別の角度から見ると、ディスク上にありながら OS として「実行」できる最小バイト量はどれくらいでしょうか?

(曖昧だったらごめんなさい。ただ持っています 分からない この件については、あまり具体的には言えません。私はコンピューターがどのように機能するかについてかなりの量を知っているふりをしていますが、このテーマについてはまったくの無知です。)

役に立ちましたか?

解決

まあ、答えは書籍にあります: 最新のオペレーティングシステム-Andrew S. Tanenbaum は非常に良い人物です。下の表紙イラスト。

学習または単なる好奇心に適した、最もシンプルで完全なオペレーティングシステムカーネルは、 Minix
ここでは、ソースコード

最新のオペレーティングシステム
(source: cs.vu.nl

他のヒント

オペレーティングシステムは大きなトピックです。オペレーティングシステムがどのように設計され、それが良い本であるかを深く掘り下げたい場合、私がお勧めできる最高のことです:

オペレーティングシステムの概念

オペレーティングシステムの概念

本当に興味がある場合は、完全な内容を学ぶのに適した場所として、 Linux from Scratch を参照してください。オペレーティングシステムの詳細と、すべての要素がどのように組み合わされるか。それがあなたが探しているよりも多くの情報であるなら、オペレーティングシステムに関するこのウィキペディアの記事は良いかもしれません開始する場所。

PC は、起動命令を得るためにディスクの特定のセクターを調べる必要があることを知っています。これらの命令は、プロセッサに、特定のプロセッサ割り込みで特定のコードを呼び出すように指示します。たとえば、定期的なティックで、スケジューラ コードを呼び出します。デバイスから何かを取得するときは、デバイス ドライバー コードを呼び出します。

では、OS はシステムのすべてをどのようにセットアップするのでしょうか?まあ、ハードウェアにも API があります。これらはシステム プログラマを念頭に置いて書かれています。

私は多くのベアボーン OS を見てきましたが、これがまさに絶対的なコアです。それだけの機能を備えた組み込みの自社製 OS が数多くあります。

アプリケーションにオペレーティング システムにメモリを要求することを要求したり、特定のアクションに対して特別な権限を要求したり、プロセスやスレッド自体を要求したりするなどの追加機能は、ほとんどの PC アーキテクチャに実装されていますが、実際にはオプションです。

オペレーティングシステムは、単純に、ソフトウェアがハードウェアを管理できるようにするものです。明らかに、一部のOSは他のOSよりも洗練されています。

コンピュータは、そのコア部分で固定アドレスで実行を開始します。つまり、コンピュータが起動すると、プログラムカウンタを事前定義されたアドレスに設定し、マシンコードの実行を開始します。

ほとんどのコンピューターでは、この「ブートストラップ」プロセスは、既知の周辺機器(ディスクドライブなど)を直ちに初期化します。初期化されると、ブートストラッププロセスは事前定義されたシーケンスを使用してこれらの周辺機器を活用します。ディスクドライバーを再度使用すると、プロセスはハードドライブの最初のセクターからコードを読み取り、RAM内の既知のスペースに配置し、そのアドレスにジャンプします。

これらの事前定義されたシーケンス(CPUの起動、ディスクのロード)により、プログラマーはCPU起動の初期部分にコードを追加することができ、最終的には非常に洗練されたプログラムを起動できます。

現代の世界では、洗練された周辺機器、高度なCPUアーキテクチャ、広大で膨大なリソース(GBまたはRAM、ディスクのTB、非常に高速なCPU)により、オペレーティングシステムは開発者にとって非常に強力な抽象化(複数のプロセス、仮想メモリ、ロード可能なドライバーなど)。

ただし、リソースが限られているシンプルなシステムの場合、「OS」に多くの必要はありません。

簡単な例として、多くの小さなコントローラーコンピューターは非常に小さな「OS」を持ち、一部は単に「モニター」と見なされる場合があり、シリアルポート(または端末、またはLCD)表示)。確かに、これらの条件では大規模なOSに対する多くのニーズはありません。

しかし、古典的なForthシステムのようなものも考えてください。ここでは、ディスクI / O、コンソールI / O、メモリ管理に加えて、実際のプログラミング言語とアセンブラを提供する「OS」を備えたシステムがあり、これは8K未満のメモリに収まります。 8ビットマシン。

またはそのBIOSとBDOSを使用したCP / Mの昔。

CP / Mは、単純なOSが抽象レイヤーとして機能し、ポータブルプログラムを膨大な数のハードウェアで実行できる良い例ですが、それでもシステムの起動と実行に必要なRAMは8K未満です。

最新のOSが使用するMBのメモリとはかけ離れています。しかし、公平を期すために、私たちはMBのメモリを持っています。そのため、私たちの生活は非常にシンプルで(ほとんど)より機能的です。

ハードウェアに「Hello World」と印刷させるのは興味深いので、OSの作成は楽しいです。あいまいなI / Oポートを一度に1バイトずつデータを表示するか、マジックメモリアドレスにデータを詰め込みます。

x86エミュレータを入手して、ブートセクタを取得して自分の名前を言います。それはとてつもなくおやつです。

基本的に...次の理由により、コンピュータはディスクを実行できます。

BIOS には、そのディスク デバイスがブート順序に含まれます。

起動時に、BIOS はフロッピー ドライブ、ハードドライブ、CD ROM などのすべての起動可能なデバイスを順番にスキャンします。各デバイスはメディアにアクセスし、メディアを識別するフィンガープリントのハードコーディングされた場所 (通常はディスクまたは CD デバイス上のセクター) をチェックし、命令が開始されるディスク (またはメディア) 上のジャンプ先の場所をリストします。BIOS はデバイスに、ヘッド (またはその他) をメディア上の指定された位置に移動させ、大量の命令を読み取るように指示します。BIOS はこれらの命令を CPU に渡します。

CPU はこれらの命令を実行します。あなたの場合、これらの手順により Ubuntu OS が起動します。停止する命令、または 10+20 を追加する命令などでもよいでしょう。

通常、OS は大量のメモリを取得して開始します (これも、「GlobalAlloc」などのライブラリ コマンドはまだ読み込まれていない OS によって提供されるため利用できないため、CPU から直接取得します)。 ) そして、OS 自体の構造の作成を開始します。

OS はアプリケーションに一連の「機能」を提供します。メモリ管理、ファイル システム、入出力、タスク スケジュール、ネットワーキング、グラフィック管理、プリンタへのアクセスなど。これは、「制御を取得する」前に行われていることです。すべてのサービスを作成/開始することで、後のアプリケーションがお互いのメモリを踏みつけずに一緒に実行できるようになり、OS が提供するサービスへの優れた API を使用できるようになります。

OSが提供するそれぞれの「機能」は大きなトピックです。OS がこれらすべてを提供するため、アプリケーションは適切な OS ライブラリを呼び出すことだけを考慮する必要があり、2 つのプログラムが同時に印刷しようとした場合などの状況は OS が管理します。

たとえば、OS がなければ、各アプリケーションは別のプログラムが印刷しようとしている状況に対処し、とにかく印刷するか、他のジョブをキャンセルするなどの「何かをする」必要があります。代わりに、OS だけがそれに対処する必要があり、アプリケーションは OS に「これを印刷して」と指示するだけで、OS は 1 つのアプリが印刷することを保証し、他のすべてのアプリは最初のアプリが終了するかユーザーがキャンセルするまで待つだけで済みます。

「OS」は多くの機能を意味する場合もあれば、非常に少ない機能を意味する場合もあるため、OS となる最小バイト量はあまり意味がありません。CD からプログラムを実行したいだけであれば、それは非常にわずかなバイトになります。ただし、それはOSではありません。OS の仕事は、他の多くのプログラムの実行を可能にするサービス (私はこれを機能と呼んでいます) を提供し、プログラムによるそれらのサービスへのアクセスを管理することです。それは難しく、追加する共有リソース (ネットワーク、Wi-Fi、CD バーナー、ジョイスティック、iSight ビデオ、デュアル モニターなど) が増えるほど、難しくなります。

深刻な裏付けがある最近見たオペレーティングシステムプロジェクトの1つは、特異性。これは完全にゼロからC#.NETで記述されています。

どれだけの作業が必要かを知るために、2人のコア開発者がいますが、インターンは常に最大12人で、OSを取得するまでに2年かかりました起動してBMPイメージを表示します(プレゼンテーションの実行方法です)。コマンドラインがある場所(4年程度)に到達するまでに、さらに多くの作業が必要でした。

基本的に、OSが実際に であるということについて多くの議論があります。 OSが具体的に何であるか(カーネルだけか、カーネルモードで実行されるすべてのものか、OSのシェル部分か、OSのX部分か、WebブラウザーはOSの一部か)について全員が同意した場合、質問答えられます!それ以外の場合、質問に対する具体的な回答はありません。

非常に詳細な回答については、本 FreeBSDオペレーティングシステムの設計と実装を入手してください。 Amazonから入手するか、FreeBSD.orgのサイトへのこのリンクは、覚えている本のように見えます:リンクテキスト

これが言及されていないことは信じられません...しかし、オペレーティングシステムの設計の概要に関する古典的な本はオペレーティングシステム-設計と実装は、MINIXの作成者であるAndrew S Tanenbaumによって作成されました。本の例の多くは、MINIXにも直接向けられています。

もう少し詳しく知りたい場合は、 OS Dev を開始するのに最適な場所です。特にwiki。このサイトには、小さなプロジェクト/趣味のために個人的なオペレーティングシステムを作成する開発者だけでなく、情報がたくさんあります。 OSDevであなたと同じ船に乗って、OSに何が入るかを学びたい人がたくさんいるので、これも素晴らしい学習リソースです。最終的には自分で試してみるかもしれません!

オペレーティングシステム(OS)は、ハードウェアを制御するソフトウェアの層です。ハードウェアが単純であるほど、OSは単純であり、その逆も同様です;-)

初期のマイクロコンピューターの場合、OSを16K ROMに収め、マザーボードを配線して、ROMアドレス空間の先頭でマシンコード命令の実行を開始できます。この「ブートストラップ」プロセスは、キーボード、モニター、フロッピードライブなどの他のデバイスのドライバーのコードをロードし、数秒以内にマシンが起動して使用できるようになります。

今日は...同じ原則ですが、ますます複雑なハードウェア;-)

ああ、これは楽しいものです。ある時点ですべてを完了し、進化の大部分でそこにいた。

一般に、小規模から始めて新しいOSの作成を開始します。最も単純なものはブートストラップローダーです。これは、コードのチャンクを引き込んで実行するコードの小さなチャンクです。昔々、NovaまたはPDPコンピューターでは、ブートストラップローダーをフロントパネルから入力できました。指示の16進数を16進数で入力しました。ブートローダーはメディアをメモリに読み込み、プログラムカウンターをそのコードの開始アドレスに設定します。

通常、このコードチャンクは何か他のものをロードしますが、そうする必要はありません。ベアメタルで実行するためのプログラムを作成できます。この種のプログラムは、それ自体で有用な何かをします。

実際のオペレーティングシステムはより大きく、より多くのピースを持っています。プログラムをロードし、メモリに入れて実行する必要があります。 IOデバイスを実行するコードを提供する必要があります。大きくなると、メモリを管理する必要があります。

その仕組みを本当に知りたい場合は、 Doug ComerのXinuの本を見つけてください。 、およびAndy Tannenbaum の最新のオペレーティングシステムブック Minix

チップの起動を「bios」に、次にOSにリンクするものがあります。これは通常、多くのコードサービスによって行われる非常に複雑なタスクです。

あなたが本当にこれについてもっと知りたいなら、本を読むことをお勧めします...特にマイクロコントローラー、cで小さなOSを8051などのために作成するもの、またはx86アセンブリを学び、作成するもの非常に小さな"ブートローダーOS"。

この質問をご覧ください。

OSは、他のアプリケーションと同様にプログラムです。このプログラムの主な目的は、他のプログラムを実行できるようにすることです。最新のOSは最新のハードウェアを利用して、プログラムが互いに衝突しないようにします。

独自のOSの作成に興味がある場合は、こちらの質問をご覧ください:

オペレーティングシステム開発の開始方法

ディスクに何バイトを入れてOSとして実行できるかを尋ねますか?答えはOSに期待するものによって異なりますが、私が知っている最小の有用な OSは1.7メガバイトに収まります。 Tomのルートブートディスクであり、「レスキュー」機能を備えた小さなOSであれば非常に便利です。 1枚のフロッピーディスクに収まるアプリケーション。すべてのマシンにフロッピードライブがあり、すべてのマシンにCD-ROMドライブがあったわけではなかった頃、私は頻繁に使用していました。

それに対する私の考えは、それはあなた自身の人生のようなものだということです。最初に、あなたはほとんど知らない-仲良くするのに十分です。これはBIOSが提供するものに似ています-ディスクドライブを探して情報を読み取るのに十分なことを知っています。それから、小学校に行くともう少し学びます。これは、ブートセクタがメモリに読み込まれ、制御が与えられるようなものです。次に、高校に行きます。これは、OSカーネルの読み込みのようなものです。その後、大学(ドライバーや他のアプリケーション)に進みます。もちろん、これはあなたがクラッシュする可能性のあるポイントです。 HE HE。

一番下の行は、ますます多くの機能のレイヤーがゆっくりとロードされることです。 OSに魔法はありません。

ここを一読することで、Linuxを作成するのに何が必要なのかを知ることができます。 https://netfiles.uiuc.edu/rhasan/linux/

1つのディスクに収まる別の非常に小さなオペレーティングシステムはQNXです(ずっと前に最後に見ていたとき、GUIインターフェース、Webブラウザー、ディスクアクセス、組み込みWebサーバーを備えたOS全体が1つに収まります)フロッピードライブ)。

それ以降、あまり聞いたことはありませんが、リアルタイムOSなので非常に高速に設計されています。

実際には、これについて大まかなアイデアを得るために4年制大学を訪れる人もいます。

基本的に、OSは非常にシンプルです。 OSを成功させるための初心者向けガイドを次に示します。 1.スケジューリングするプロセス(プログラムの実行中のインスタンス)を決定するスケジューラを使用してCPUを管理します。 2.メモリを管理して、命令(コード)とデータ(変数)の保存にどのプロセスがどのメモリを使用するかを決定します。 3.ディスクドライブ、アラーム、キーボード、マウスなどのI / Oインターフェイスを管理します。 現在、上記の3つの要件により、プロセスが通信(および戦闘ではありません!)し、外の世界とやり取りし、アプリケーションがやりたいことを実行できるようにする必要が生じています。 それをどのように深く掘り下げるかについては、恐竜の本を読んでください:)

したがって、すべてのハードウェアリソースを処理できる限り、OSを必要なだけ小さくすることができます。 起動すると、BIOSはCPUにブートローダー(メモリの固定アドレスにあるOSの最初の機能をロードします-小さなCプログラムのmain()のようなもの)の読み取りを開始するようにCPUに指示します。次に、関数とプロセス、スレッドを作成し、ビッグバンを開始します!

まず、OSを読んで読んで読んでください。次に、さまざまなOSの用途/種類/性質/目的/ニーズ/ リンクの一部は次のとおりです。初心者は次のリンクをお楽しみください:

最新のOS -これにより、一般的なOSに関するアイデア。

OSの開始-これにより、OSを実際に作成するための基本、作成方法、および現在のOSのオープンソースコードを自分で変更する方法の基本がわかります。

Wiki OS -さまざまなフィールドで使用されるさまざまなOsとその使用法についてのアイデアを提供します(オブジェクト/ OSの機能。)

OSに含まれているものを一般的に見てみましょう(洗練されたLinuxやWindowsではありません)

OSにはCPUが必要で、その中にコードをダンプするにはブートローダーが必要です。 OSにはフルフィルメントの目的が必要であり、これらの目的は Kernel と呼ばれるラッパーで定義する必要があります 内部では、スケジュール時間 ISRのもの (作成する必要のある目的とOSによって異なります)

OS開発は複雑です。 osdevやlowlevel.eu(ドイツ語)などのトピック専用のWebサイトがいくつかあります。他にもすでに言及している本もあります。

私は仕方がありませんが、「独自のオペレーティングシステムを作成する」を参照することもできます。私が作ったので、YouTubeのビデオシリーズ:-)

https://www.youtube.com/playlist?list=PLHh55M_Kq4OApWScZYPl5HhGTM9M6T6Mg6MhZMgTM5HgTM9Mh6Th9Mh6Th9MhZM1M5HgTM5MhT5M6Mh5Ts >

scroll top