0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他

0から作るOS開発 オペレーティングシステムコンセプト

前回までの内容

これまでで、 ということがわかりました。それではカーネルを0から開発していきましょう!

前回はOSの歴史を見てきました。今回はこれから作っていくOSのコンセプトについてみていきましょう

オペレーティングシステムコンセプト

世の中には過去使われていたOS、現在までに作られているOS、設計中のOS、これから開発していくOSと

色々なOSが作られてきたり、作っていたり、これから作られています

これらのOSには”こんな機能があって、こんな動作して、こんな風に見せる”といったコンセプトがあります

過去の例からこれから作っていくOSについて考えていきましょう

現代の主なオペレーティングシステム

OSのタイプ

ハードウェアとソフトウェアのインターフェイスとして機能するOSですが、様々なタイプがあります

オペレーティングシステムのタイプとして下記タイプに分類することができます

カーネルのモデル

OSの一番中心部分の処理を司っているプログラムのことをカーネルと呼ばれています

OSのどこまでをカーネルとして作るのか?という問題に対して様々なモデルが考えられてきました

主なモデルとしては2種類あります

一口にモノリシック、マイクロと分類できないものや、モノリシックのなかでも、更に分類することができます

そのようなカーネルの主なサブモデルとして

カーネルの機能

カーネルの機能をどこまでカーネルに持たせるかによって、”カーネルの機能”は違ってきますが、

一般的に考えられるカーネルシステムとして処理しなければならない機能を挙げていきます

物理メモリ管理

カーネルの一番コアな部分がメモリ管理です。プログラムに空いているメモリを割り当てたり、解放したり

します。メモリ管理にはビットマップ、バディシステム、木構造、キュー、スタックを使用して

管理する色々なアルゴリズムがあります。

仮想メモリ管理

仮想メモリ機構として主に使用されているのがセグメンテーションとページングです

セグメンテーションはブートローダとカーネルローダで少し取り上げました。セグメンテーションはメモリを

セグメントの呼ばれる開始位置とそのサイズを自由に変更することができる方式です

一方で、ページングはメモリを固定長のページに分割してメモリを管理する方式です

プログラムでは固定長の管理方式のほうが簡素にできるので、現在のOSは主にページングを使用しています

このセグメントやページをプログラムに割り当てたり、解放したりするのがカーネルの機能となります

また、メモリが必要になったときにページが割り当てられるオンデマンドページングなどもカーネルの機能となります

ファイルシステム

ファイルシステムはディスクなどの記録デバイスのデータを読み書きできるように整頓するメカニズムです

ディスク上のデータをどうやって格納するのかを決めてからファイルシステムを決めます

例えば、HDDのデータを扱うときにはFAT12または16では扱えるデータのサイズが小さいため

FAT32を使います。また、ネットワーク上のディスクに格納されているデータを読み書きする場合は

NFSを使います。更に、ファイルシステムを統一的に扱うために仮想化したものをVFSと呼ばれます

VFSによりプログラムは何のファイルシステムかを気にせずにファイルにアクセスできるようにします

スケジューリング

プログラムにCPUを使用する時間をどれだけ割り当てるのかを決めることがスケジューリングで、

スケジューリングを行う処理のことをスケジューラといいます

スケジューラの中には優先度をプログラムに割付けて、優先度の高いプログラムを

優先的にCPUを使用する時間を割り当てるアルゴリズムがあります。プログラムの切り替えは

高頻度で起こるため、切り替えはなるべく速く行う必要があります

また、CPUを使用する時間を割り当てられないプログラムが無いようにしなければなりません

有名なアルゴリズムとしてラウンドロビンなどがあります

プロセス同期

カーネルは複数のプログラムの処理を同時に起こさせないようにするメカニズムを用意しておく必要があります

このような場面を想定して、シグナル、セマフォ、ミューテックス、スピンロック制御などがあります

プロセス間通信

とりわけマイクロカーネルでは、ユーザプログラムでカーネル機能を実現しているため、メッセージによる

通信が必須となります。通信にはプログラム同士が必ず同時に送信受信を保証する同期通信と、

必ずしも同時に送受信する必要がない非同期通信があります。それぞれメリットがあり、同期通信は

その時に確実に相手にメッセージを送信できますが、相手が受信できる状態になるまで待つ必要があります

一方非同期通信は相手が受信出来る状態を待たずに送信できますが、相手が受信したかどうかは

判断できません。多くのマイクロカーネルでは通信を抽象化したポートを使っています

UNIXのパイプライン処理もプロセス間通信の一つです

デバイスドライブ

ハードウェアが変わってもユーザプログラムを変えなくてもいいように、カーネルに

ハードウェア仮想層(HAL:Hardware Abstract Layer)を持っています

これによりプログラムはハードウェアの変更を意識する必要がなくなります

自分のカーネルのコンセプト

ざっとカーネルの主な機能が出てきましたが、カーネルの設計ではかなりUNIXの設計思想が入っています

このサイトで挙げている機能でデザインしてもいいと思いますし、自分で独自に考えた

コンセプトでデザイしていっても面白いと思います

趣味で作るOSでは特に何のコンセプトも持たずに自由にやってみるのもいいと思います。

次回はカーネルを0から作るための下準備をしていきたいと思います

inserted by FC2 system