|
0から作るOS開発 オペレーティングシステムコンセプト
|
前回までの内容
これまでで、
ということがわかりました。それではカーネルを0から開発していきましょう!
前回はOSの歴史を見てきました。今回はこれから作っていくOSのコンセプトについてみていきましょう
オペレーティングシステムコンセプト
世の中には過去使われていたOS、現在までに作られているOS、設計中のOS、これから開発していくOSと
色々なOSが作られてきたり、作っていたり、これから作られています
これらのOSには”こんな機能があって、こんな動作して、こんな風に見せる”といったコンセプトがあります
過去の例からこれから作っていくOSについて考えていきましょう
現代の主なオペレーティングシステム
- UNIXとUNIXライク
ベル研究所のケン・トンプソンがB言語(後にC言語)で開発してオペレーティングシステムです
当初フリーでソースコードが公開されて普及し、オープンソースの源流となっています
この当時のOS設計思想、手法が現在の様々なOSに影響を残しています
しかし、後にAT&
Tがライセンスを厳しくしたため、商用化され、一時期クローズドなOSとなっていました
現在では商標権を持つ標準化団体のThe Open Groupが
発行する
Single UNIX Specification
の仕様を
満たしているものがUNIXといえます
この仕様を満たしていないものをUNIXライクと呼ばれているようです
UNIXとして有名なものは
AIX
、
HP-UX
、
Solaris
、
Max OS X
があります
UNIXライクとして有名のものは
Linux
、
FreeBSD
があります
- Linux
LinuxはUNIXライクオペレーティングシステムの1つです。FreeBSDと違いUNIXの
ソースコードは使われずリーナス・トーバルズによって作られた、オープンソースです
Linuxはパソコン以外にスーパーコンピュータから携帯電話など様々なコンピュータの
OSとして使われています。Linuxカーネルに様々なアプリケーションをくっつけて
1つのパッケージにしたものをディストリビューションといいます
ディストリビューションの主なものに
RedHat
、
Debian
、
Ubuntu
、
Android
などがあります
Linuxは
GNUプロジェクト
のコンパイラGCCを使って作られています
このサイトでもGCCを使います
Linux
Android
- BSD
BSDはUNIXを元に
カルフォニア大学バークレー校
で作られたバークレー板UNIXです
このBSD UNIXでTCP/IPが標準採用されインターネットが広がっていきました
Apple
の故スティーブ・ジョブズが起業したNeXT社が開発したOS
NeXTSTEP
もBSDの派生OSです
BSDを元にオープンソースにしたものとして
FreeBSD
、
NetBSD
、
OpenBSD
があります
- Mac OS X
Apple
が、NeXTSTEPで培った技術でBSDをベースに開発したUNIXライクオペレーティングシステムです
カーネルにはオープンソース
Darwin
OSのMachが使われています。 UNIXベースですので
他のUNIX系OSで開発されたソフトウェアを比較的簡単に移植できます
ユーザインターフェースが美しく、Aquaとと呼ばれる独自インターフェイスを持っています
- Windows
Microsoft
が開発した、最も普及しているOSの1つです。パソコンのOSとしてだけではなく
サーバ、スマートフォンでも使用されています。WindowsにもUNIXの設計思想が
取り込まれ、UNIXの影響力をうかがい知ることができます
- その他
教育用のOSとしての
MINIX、
Hewlett-Packard
が開発した
OpenVMS
、
日本の組み込み用OSとしての
ITRON
など様々なOSがあります
MINIX
OSのタイプ
ハードウェアとソフトウェアのインターフェイスとして機能するOSですが、様々なタイプがあります
オペレーティングシステムのタイプとして下記タイプに分類することができます
- シングルタスク方式
1度に1つのスレッドが動作することができる方式です。シングルタスク方式でも、完全に1つのプログラムしか
動作できない方式がある一方で、複数のプログラムを起動し、ユーザが選択的に動作するプログラムを
決める方式があります。現在ではシングルタスク方式のOSは希少です
- マルチタスク方式
複数のプログラムにCPUを時間的に分散して割り当てることで、同時にプログラムが動いているように
みせかける方式です。現在の主なOSはこの方式です
- リアルタイム方式
システムの処理・応答時間が予め決まっている方式です。リアルタイムと銘打たれていますが、
実際にはシステムが”リアルタイム”である必要はなく、実行時間が”予測(計算)”できることが
リアルタイム方式の重要な要件です。この方式は主に組み込み向けのOSで採用されています
日本ではITRON、アメリカでは
VxWorks
などがあります
カーネルのモデル
OSの一番中心部分の処理を司っているプログラムのことをカーネルと呼ばれています
OSのどこまでをカーネルとして作るのか?という問題に対して様々なモデルが考えられてきました
主なモデルとしては2種類あります
- モノリシックカーネル
デバイスドライバを含めた、カーネルのすべての機能をリング0の1つのアドレス空間で
実行するモデルです。効率性を重視するOSのカーネルがこのモデルを採用しています
デバイスドライバがカーネルのアドレス空間に組み込まれるため、ドライバのバグが
システムダウンにつながってしまう恐れがあります
代表的なカーネルとしてLinuxがあります
- マイクロカーネル
カーネルには必要最低限の機能を持たせるだけで、その他のカーネルとしての機能は
リング3のユーザ空間で実行するモデルです。カーネルの機能がユーザ空間にあるため
メモリ保護の観点からモノリシックカーネルよりもセキュアで、安定性もあります
代表的なカーネルとしてMax OS Xのカーネルがあります
一口にモノリシック、マイクロと分類できないものや、モノリシックのなかでも、更に分類することができます
そのようなカーネルの主なサブモデルとして
- ハイブリッドカーネル
モノリシックカーネルとマイクロカーネルをハイブリッドにしたモデルで、
どちらかというとマイクロカーネルとして分類されます
マイクロカーネルのようにメッセージでユーザ空間のカーネル機能と通信を行うことはせずに、
実行時にカーネルの機能をカーネル空間に置いて実行します
- モジュラカーネル
ハイブリッドカーネルから更にモジュール化を推し進めたカーネルです
ハイブリッドカーネルとの違いは、将来的に開発された未知のカーネル機能もロードすることが
できる思想にあります
- ナノカーネル
マイクロカーネルからカーネルの機能を更に絞りこんだカーネルです
ナノカーネルはカーネル自身にはデバイスドライバなどのシステムに依存した部分を極力置かず、
(タイマ、RTC、PIC、DMAドライバなどもカーネルに置かない)
カーネルの処理は専らメッセージを受信したユーザー空間にあるカーネル機能で行います。また、送受信する部分をカーネル空間に置きます
- エクソカーネル(ExoKernel)
エクソカーネルも小さなカーネルとして設計され、ナノカーネルとはちょうど対照的なカーネルです
ナノカーネルは極力ドライバなどのシステム依存部分をメッセージで抽象化しますが、
エクソカーネルは極力抽象化せずに、アプリケーションにドライバなどのシステム依存部分を任せます
このため、エクソカーネル上で動くアプリケーションは自前でドライバを作る必要がありますが、
カーネルとしての機能は極少なくなるため、システムとしての効率は上がります
カーネルの機能
カーネルの機能をどこまでカーネルに持たせるかによって、”カーネルの機能”は違ってきますが、
一般的に考えられるカーネルシステムとして処理しなければならない機能を挙げていきます
物理メモリ管理
カーネルの一番コアな部分がメモリ管理です。プログラムに空いているメモリを割り当てたり、解放したり
します。メモリ管理にはビットマップ、バディシステム、木構造、キュー、スタックを使用して
管理する色々なアルゴリズムがあります。
仮想メモリ管理
仮想メモリ機構として主に使用されているのがセグメンテーションとページングです
セグメンテーションはブートローダとカーネルローダで少し取り上げました。セグメンテーションはメモリを
セグメントの呼ばれる開始位置とそのサイズを自由に変更することができる方式です
一方で、ページングはメモリを固定長のページに分割してメモリを管理する方式です
プログラムでは固定長の管理方式のほうが簡素にできるので、現在のOSは主にページングを使用しています
このセグメントやページをプログラムに割り当てたり、解放したりするのがカーネルの機能となります
また、メモリが必要になったときにページが割り当てられるオンデマンドページングなどもカーネルの機能となります
ファイルシステム
ファイルシステムはディスクなどの記録デバイスのデータを読み書きできるように整頓するメカニズムです
ディスク上のデータをどうやって格納するのかを決めてからファイルシステムを決めます
例えば、HDDのデータを扱うときにはFAT12または16では扱えるデータのサイズが小さいため
FAT32を使います。また、ネットワーク上のディスクに格納されているデータを読み書きする場合は
NFSを使います。更に、ファイルシステムを統一的に扱うために仮想化したものをVFSと呼ばれます
VFSによりプログラムは何のファイルシステムかを気にせずにファイルにアクセスできるようにします
スケジューリング
プログラムにCPUを使用する時間をどれだけ割り当てるのかを決めることがスケジューリングで、
スケジューリングを行う処理のことをスケジューラといいます
スケジューラの中には優先度をプログラムに割付けて、優先度の高いプログラムを
優先的にCPUを使用する時間を割り当てるアルゴリズムがあります。プログラムの切り替えは
高頻度で起こるため、切り替えはなるべく速く行う必要があります
また、CPUを使用する時間を割り当てられないプログラムが無いようにしなければなりません
有名なアルゴリズムとしてラウンドロビンなどがあります
プロセス同期
カーネルは複数のプログラムの処理を同時に起こさせないようにするメカニズムを用意しておく必要があります
- リソースの排他制御
1つのリソースに複数のプログラムがアクセスするような状況がある場合、1つのプログラムがそのリソースに
アクセスしている間はその他のプログラムがアクセスできないように制御する必要があります
例えば、1つのプログラムがHDDにデータを書き込んでいる最中に、他のプログラムが同時にHDDの
別の場所をリードしようとしたときは、同時にHDDのデータは読み書きできないので、1つのプログラムだけ
HDDにアクセスできるように制御する必要があります
- プログラムの排他制御
2つのプログラムがあるコードを同時に実行しないように制御する必要がある場合があります
例えば、1つのプログラムが割り込み禁止している最中に、他のプログラムが割り込みを解除する
場合にはどちらかのプログラムが相手の処理が終わるのを待つ必要がでてきます
- プログラムシーケンス制御
あるプログラムの処理結果を受けてから別のプログラムがその結果を利用して処理をする
場合には、あるプログラムの処理が完了するまで待つ必要があります
このような場面を想定して、シグナル、セマフォ、ミューテックス、スピンロック制御などがあります
プロセス間通信
とりわけマイクロカーネルでは、ユーザプログラムでカーネル機能を実現しているため、メッセージによる
通信が必須となります。通信にはプログラム同士が必ず同時に送信受信を保証する同期通信と、
必ずしも同時に送受信する必要がない非同期通信があります。それぞれメリットがあり、同期通信は
その時に確実に相手にメッセージを送信できますが、相手が受信できる状態になるまで待つ必要があります
一方非同期通信は相手が受信出来る状態を待たずに送信できますが、相手が受信したかどうかは
判断できません。多くのマイクロカーネルでは通信を抽象化したポートを使っています
UNIXのパイプライン処理もプロセス間通信の一つです
デバイスドライブ
ハードウェアが変わってもユーザプログラムを変えなくてもいいように、カーネルに
ハードウェア仮想層(HAL:Hardware Abstract Layer)を持っています
これによりプログラムはハードウェアの変更を意識する必要がなくなります
自分のカーネルのコンセプト
ざっとカーネルの主な機能が出てきましたが、カーネルの設計ではかなりUNIXの設計思想が入っています
このサイトで挙げている機能でデザインしてもいいと思いますし、自分で独自に考えた
コンセプトでデザイしていっても面白いと思います
趣味で作るOSでは特に何のコンセプトも持たずに自由にやってみるのもいいと思います。
次回はカーネルを0から作るための下準備をしていきたいと思います