OSの作成は大規模プロジェクトのようです。誰もがどのように始めますか?
たとえば、Ubuntuをドライブにポップすると、コンピュータはどうすればrunit?(これ、私は推測します、私が本当に知りたいのはそれです。)
または、別の角度から見ると、ディスク上にあり、OSとして「実行」できる最小バイト数はどれくらいですか?
(あいまいな場合は申し訳ありません。この件についてはわからないので、具体的には言えません。知っているふりをします。コンピュータがどのように機能するかについてはかなりの量ですが、私はこの主題についてまったく無知です。)
まあ、答えは本にあります:現代のオペレーティングシステム -アンドリューS.タネンバウムはとても良いものです。下の表紙イラスト。
学習や好奇心に適した、最も単純でありながら完全なオペレーティングシステムカーネルは、Minixです。
ここソースコード を閲覧できます。
(出典: cs.vu.nl )
オペレーティングシステムは大きなトピックです。オペレーティングシステムの設計と構築の方法について詳しく知りたい場合は、この本をお勧めします。
本当に興味があれば、オペレーティングシステムの完全な詳細とすべての要素がどのように組み合わされているかを学ぶのに適した場所として Linux from Scratch を紹介します。それがあなたが探しているよりも多くの情報であるなら このウィキペディアの記事 オペレーティングシステムについては始めるのに良い場所かもしれません。
PCは、起動手順についてディスクの特定のセクターを調べることを知っています。これらの命令は、特定のプロセッサ割り込み時に特定のコードが呼び出されることをプロセッサに通知します。たとえば、定期的なティックで、スケジューラコードを呼び出します。デバイスから何かを取得したら、デバイスドライバーコードを呼び出します。
では、OSはどのようにシステムですべてをセットアップするのでしょうか?ハードウェアにもAPIがあります。それらはシステムプログラマーを念頭に置いて書かれています。
私は多くの必要最低限のOSを見てきましたが、これは本当に絶対的なコアです。多くの組み込み自家製OSがあり、それがすべてであり、他には何もありません。
アプリケーションにメモリを要求する、特定のアクションに特別な特権を要求する、プロセスやスレッド自体を要求するなどの追加機能は、ほとんどのPCアーキテクチャに実装されていますが、実際にはオプションです。
オペレーティングシステムは、単純に、ソフトウェアがハードウェアを管理できるようにするものです。明らかに、一部のOSは他のOSよりも洗練されています。
本質的に、コンピューターは固定アドレスで実行を開始します。つまり、コンピューターが起動すると、プログラムカウンターが事前定義されたアドレスに設定され、マシンコードの実行が開始されます。
ほとんどのコンピューターでは、この「ブートストラップ」プロセスにより、既知の周辺機器(ディスクドライブなど)がすぐに初期化されます。初期化されると、bootstrapプロセスは、事前定義されたシーケンスを使用して、これらの周辺機器を活用します。ディスクドライバーを再度使用すると、プロセスはハードドライブの最初のセクターからコードを読み取り、既知の場所に配置します。 RAM内のスペースを確保してから、そのアドレスにジャンプします。
これらの事前定義されたシーケンス(CPUの起動、ディスクのロード)により、プログラマーはCPU起動の初期段階でコードの追加を開始でき、最終的には非常に高度なプログラムを起動できます。
高度な周辺機器、高度なCPUアーキテクチャ、および膨大なリソース(GBまたはRAM、ディスクのTB、および非常に高速なCPU))を備えた現代の世界では、オペレーティングシステムは非常に強力な抽象化をサポートできます。開発者向け(複数のプロセス、仮想メモリ、ロード可能なドライバなど)。
しかし、リソースが制限されている単純なシステムの場合、「OS」にそれほど多くのものは必要ありません。
簡単な例として、多くの小さなコントローラーコンピューターには非常に小さな「OS」があり、一部は単に「モニター」と見なされ、シリアルポート(または端末、またはLCD display)確かに、これらの条件では大規模なOSの必要性はそれほど多くありません。
しかし、古典的なForthシステムのようなものも検討してください。ここには、ディスクI/O、コンソールI/O、メモリ管理に加えて、実際のプログラミング言語とアセンブラを提供する「OS」を備えたシステムがあります。これは、8K未満のメモリに収まります。 8ビットマシン。
または、BIOSとBDOSを備えたCP/Mの昔。
CP/Mは、単純なOSが抽象化レイヤーとしてうまく機能し、ポータブルプログラムを膨大な数のハードウェアで実行できるようにする良い例ですが、それでもシステムは8K未満のRAM =起動して実行します。
最新のOSで使用されているメモリのMBとはかけ離れています。しかし、公平を期すために、私たちはMBのメモリを持っており、そのため、私たちの生活ははるかに単純で(ほとんど)、はるかに機能的です。
OSの作成は楽しいです。なぜなら、ハードウェアに「Hello World」を出力させて、データを一度に1バイトずつ、あいまいなI/Oポートから出力したり、魔法のメモリアドレスに詰め込んだりするのが面白いからです。
X86エミュレーターを入手して、ブートセクターに名前を言ってもらいましょう。それはぎこちない御馳走です。
基本的に...コンピュータは次の理由でディスクを実行できます。
BIOSには、そのディスクデバイスが起動順序に含まれています。
起動時に、BIOSはフロッピードライブ、ハードドライブ、CDROMなどのすべての起動可能なデバイスを順番にスキャンします。各デバイスはメディアにアクセスし、ハードコードされた場所(通常はディスクまたはCDデバイス上のセクター)でメディアを識別するフィンガープリントを確認し、命令が開始されるディスク(またはメディア)上のジャンプ先の場所を一覧表示します。 BIOSは、デバイスにヘッド(またはその他)をメディア上の指定された場所に移動し、大量の命令を読み取るように指示します。 BIOSはそれらの命令をCPUに渡します。
CPUはこれらの命令を実行します。あなたの場合、これらの手順はUbuntuOSを起動します。それらは、停止したり、10 +20を追加したりするための指示でもあります。
通常、OSは、メモリの大きなチャンクを取得することから開始します(これも、CPUから直接取得します。これは、「GlobalAlloc」などのライブラリコマンドは、まだロードされていないOSによって提供されるため利用できないためです。 )そしてOS自体の構造の作成を開始します。
OSは、メモリ管理、ファイルシステム、入出力、タスクスケジューリング、ネットワーキング、グラフィックス管理、プリンタへのアクセスなど、アプリケーションに一連の「機能」を提供します。これは、「制御を取得する」前に実行していることです。すべてのサービスを作成/開始して、後でアプリケーションを一緒に実行し、互いのメモリを踏みつけずに、OSが提供するサービスへのNiceAPIを使用できるようにします。
OSが提供する各「機能」は大きなトピックです。 OSはそれらすべてを提供するため、アプリケーションは適切なOSライブラリを呼び出すことを心配するだけで済み、OSは2つのプログラムが同時に印刷しようとする場合などの状況を管理します。
たとえば、OSがないと、各アプリケーションは別のプログラムが印刷しようとしている状況に対処し、とにかく印刷などの「何かをする」か、他のジョブをキャンセルする必要があります。代わりに、OSだけが対処する必要があります。つまり、アプリケーションはOSに「これを印刷する」と言うだけで、OSは1つのアプリが印刷されるようにし、他のすべてのアプリは最初のアプリが終了するか、ユーザーがキャンセルするまで待つ必要があります。
「OS」は多くの、または非常に少ない機能を意味する可能性があるため、OSになる最小バイト数は実際には意味がありません。 CDからプログラムを実行するだけの場合、それは非常に数バイトになります。ただし、それはOSではありません。 OSの仕事は、他の多くのプログラムを実行できるようにするサービス(私はそれらを機能と呼んでいます)を提供し、プログラムのそれらのサービスへのアクセスを管理することです。それは難しいことであり、追加する共有リソース(ネットワーク、wifi、CDバーナー、ジョイスティック、iSightビデオ、デュアルモニターなど)が増えるほど、難しくなります。
私が見た中で深刻な支援を受けている最新のオペレーティングシステムプロジェクトの1つは、 Singularity と呼ばれるMS Researchプロジェクトであり、これは完全にC#.NETで最初から作成されています。
どれだけの作業が必要かを知るために、2つのコア開発者がいますが、いつでも最大12人のインターンがいて、OSが起動して起動するまでに2年かかりました。 display BMP画像(プレゼンテーションを行うために使用する方法です)。コマンドラインが存在するポイント(約4年など)に到達するまでには、さらに多くの作業が必要でした。
これが言及されていないことは信じられません...しかし、オペレーティングシステムの設計の概要に関する古典的な本は オペレーティングシステム-設計と実装 MINIXの作成者であるAndrewSTanenbaumによって書かれました。この本の多くの例は、MINIXにも直接向けられています。
もう少し学びたい場合は、 OS Dev から始めるのが最適です。特にウィキ。このサイトは、小さなプロジェクト/趣味のために個人的なオペレーティングシステムを書く開発者だけでなく、情報でいっぱいです。 OSDevのあなたと同じボートに、OSに何が入るのかを学びたいと思っている人がたくさんいるので、これも素晴らしい学習リソースです。最終的には自分で試してみるかもしれません!
基本的に、OSが実際に何であるかについては多くの議論があります です。 OSが具体的に何であるか(カーネルだけですか?カーネルモードで実行されるすべてのものですか?OSのシェル部分ですか?OSのX部分ですか?WebブラウザはOSの一部ですか?)について全員が同意した場合、あなたの質問は答えられます!そうでなければ、あなたの質問に対する具体的な答えはありません。
非常に詳細な答えについては、本FreeBSDオペレーティングシステムの設計と実装を入手することをお勧めします。アマゾンから入手するか、FreeBSD.orgのサイトへのこのリンクは私が覚えているように本のように見えます: リンクテキスト
オペレーティングシステム(OS)は、ハードウェアを制御するソフトウェアの層です。ハードウェアが単純であるほど、OSも単純であり、その逆も同様です;-)
マイクロコンピューターの初期の場合、OSを16K ROMに適合させ、マザーボードを配線して、ROMアドレス空間の先頭からマシンコード命令の実行を開始することができます。この「ブートストラップ」プロセスは、キーボード、モニター、フロッピードライブなどの他のデバイスのドライバーのコードをロードし、数秒以内にマシンが起動して使用できるようになります。
今日...同じ原理ですが、ますます複雑なハードウェア;-)
ああ、これは楽しいものです。私はある時点ですべてを行い、進化の大部分を通してそこにいました。
一般に、小さなものから始めて新しいOSを書き始めます。最も単純なのはbootstrapローダーです。これはコードのチャンクを取り込んで実行する小さなコードのチャンクです。昔々、NovaまたはPDPコンピューターで次のように入力できました。 bootstrapローダー(フロントパネルから):命令の16進数を16進数で入力しました。ブートローダーは、メディアをメモリに読み込み、プログラムカウンターをそのコードの開始アドレスに設定します。
そのコードのチャンクは通常何か他のものをロードしますが、そうする必要はありません。ベアメタル上で実行することを目的としたプログラムを書くことができます。この種のプログラムは、それ自体で何か便利なことをします。
実際のオペレーティングシステムはより大きく、より多くの部分があります。プログラムをロードし、メモリに入れて実行する必要があります。 IOデバイスを実行するためのコードを提供する必要があります。デバイスが大きくなるにつれて、メモリを管理する必要があります。
それがどのように機能するかを本当に知りたい場合は、 Doug ComerのXinu本 、およびAndy Tannenbaum の最新のオペレーティングシステム本 Minix を見つけてください。
コンピュータの起動方法 、 カーネル起動プロセス およびその他の関連記事 同じブログからコンピュータの起動時の動作の概要。
起動時にコンピュータが行うことは、 CPU設計 およびその他の「低レベルのもの」に大きく依存しています(おそらく明らかですか?)。したがって、yourコンピュータが起動時に何をするかを予測するのは難しいです。
1つのディスクに収まるもう1つの非常に小さなオペレーティングシステムはQNXです(ずっと前に最後に見たとき、GUIインターフェイス、Webブラウザー、ディスクアクセス、および組み込みのWebサーバーを備えたOS全体が1つのフロッピードライブに収まります) 。
それ以来あまり聞いていませんが、リアルタイムOSなので非常に高速に設計されています。
OSは、他のアプリケーションと同じようにプログラムです。このプログラムの主な目的は、他のプログラムを実行できるようにすることです。最新のOSは、最新のハードウェアを利用して、プログラムが互いに衝突しないようにします。
独自のOSの作成に興味がある場合は、ここで私自身の質問を確認してください。
私の考えでは、それはあなた自身の人生のようなものです。 AT最初に、あなたはほとんど知りません-うまくやっていくのに十分です。これはBIOSが提供するものに似ています-ディスクドライブを探してそこから情報を読み取るのに十分知っています。それからあなたは小学校に行くともう少し学びます。これは、ブートセクタがメモリに読み込まれ、制御されるようなものです。次に、OSカーネルのロードのような高校に行きます。次に、大学に行きます(ドライバと他のアプリケーション。) もちろん、これはあなたがクラッシュしがちなポイントです。 HEHE。
要するに、ますます多くの機能のレイヤーがゆっくりとロードされるということです。 OSには魔法はありません。
ここを読むと、Linuxの作成に何が必要かがわかります https://netfiles.uiuc.edu/rhasan/linux/
チップの起動を「BIOS」にリンクし、次にOSにリンクするものがあります。これは通常、多くのコードサービスによって実行される非常に複雑なタスクです。
あなたが本当にこれについてもっと知りたいのなら、私は本を読むことをお勧めします...マイクロコントローラーについて、特に8051などのためにcで小さなOSを作成するもの..またはいくつかのx86アセンブリを学び、非常に小さな "を作成するブートローダーOS」。
実際、これについて大まかな考えを得るために4年制大学を訪れる人もいます。
あなたはチェックアウトしたいかもしれません この質問 。
基本的に、OSは非常にシンプルです。成功したOSの機能に関する初心者向けガイドは次のとおりです。1。スケジュールするプロセス(プログラムの実行中のインスタンス)を決定するスケジューラーを使用してCPUを管理します。 2.メモリを管理して、命令(コード)とデータ(変数)の格納に使用するすべてのプロセスを決定します。 3.ディスクドライブ、アラーム、キーボード、マウスなどのI/Oインターフェイスを管理します。現在、上記の3つの要件により、プロセスが通信し(戦うのではなく)、外の世界と対話し、アプリケーションがやりたいことを実行できるようにする必要が生じます。それがどのように行われるかを深く掘り下げるには、恐竜の本を読んでください:)
したがって、すべてのハードウェアリソースを処理できる限り、OSを必要なだけ小さくすることができます。起動すると、BIOSはCPUにブートローダー(メモリ内の固定アドレスにあるOSの最初の関数をロードします-小さなCプログラムのmain()のようなもの)の読み取りを開始するように指示します。次に、これにより関数、プロセス、スレッドが作成され、ビッグバンが始まります。
まず、OSとは何ですか。次に、さまざまなOSの用途/タイプ/性質/目的/ニーズ/は何ですか。リンクの一部は次のとおりです。初心者はこれらのリンクをお楽しみいただけます:
最新のOS -これは一般的なOSについてのアイデアを与えます。
OSの起動 -これは、MAKE OSに実際に必要なこと、それを作成する方法、およびOSの現在のオープンソースコードを自分で変更する方法の基本を示しています。
Wiki OS -さまざまな分野で使用されているさまざまなOとその使用法(OSのオブジェクト/機能)についてのアイデアを提供します。
OSに含まれるものを一般的に見てみましょう(洗練されたLinuxやWindowsではありません)
OSにはCPUが必要であり、その中にコードをダンプするにはbootloader
が必要です。 OSにはフルフィルする目的が必要であり、それらの目的はKernel
と呼ばれるラッパーで定義する必要があります。内部にはscheduling time
とISR's
(作成する必要のある目的とOSによって異なります)
OSの開発は複雑です。 osdevやlowlevel.eu(ドイツ語)のようなトピック専用のWebサイトがいくつかあります。他の人がすでに言及している本もいくつかあります。
私はそれを作ったので、私は助けることはできませんが、youtubeで「あなた自身のオペレーティングシステムを書く」ビデオシリーズも参照します:-)
https://www.youtube.com/playlist?list=PLHh55M_Kq4OApWScZyPl5HhgsTJS9MZ6M を参照してください
あなたはディスクに何バイト入れてもOSとして実行できるか?答えはOSに何を期待するかによって異なりますが、私が知っている最小の便利なOSは1.7メガバイトに収まります。それは Tom's Root Boot ディスクであり、1つのフロッピーディスクに収まる「レスキュー」アプリケーションを備えた小さなOSであれば非常に便利です。 )。すべてのマシンにフロッピードライブがあり、すべてのマシンにCD-ROMドライブがあるわけではなかった頃、私はそれを頻繁に使用していました。