おおえす作成の手引(いち) きそちしき編 Ver 1.1 Copyright © makihata
お詫び この資料は、あくまでOSをどのように作るかを示しているので、重要なところしかピックアップしていません。そのため、すべてを理解することはできないと思います。とりあえずどんなふうにOSを組んでいくのか、それを理解して、その後につなげていただけたら幸いです。
OSのはじまり その昔、高速に計算を行うコンピュータが登場したとき、そのいかめしい機械は、起動させれば、町の電燈が暗くなり、運転すれば冷房代をとんでもなく食った。このような時代、プログラマはコンピュータの前にはいなかった。プログラマは紙にプログラムを書き、それをコンピュータ室の作業員に手渡して、数日後にその結果を受け取る、そんなことがおこなわれていた。 もちろん、プログラムは絶え間なく申し込まれるわけではなく、一時間に一回ぐらいのペースで申し込まれただろう。では、その一時間の間、コンピュータは起動しておくべきだろうか?普通に考えれば、プログラムがたくさん集まってからコンピュータを起動し、連続で実行したはずである(起動するコストが高いから)。また、プログラムに優先度みたいなものがあるとすれば、作業員は、その優先度の高いプログラムを最初に機械に入れてくれるだろう。 これこそがOSの原点である。つまり、このコンピュータ室の作業員をプログラムとしてあらわしたものなのである。
OS作成の為の知識 OSの概念 まず、勉強しなければいけないのは、これです。参考書などでは余りにも抽象的なので、分かりにくいけど、少しはかじっておくことをお勧めします。 アセンブリ言語 アセンブリ言語は必須。特に、CPUのカーネルモード(OS用のCPUモード)、割り込みあたりでは必ずアセンブリに命を削らなければいけない。 周辺機器の 情報 ドライバなども自分で作る必要があるので、周辺機器に関する情報収集はかなり行うべき。他のOSのドライバ部分もかなり参考になるよ。 コンパイラ リンカ ローダー 私自身がまだ足を踏み入れてない場所。怖いよ~(w とりあえず、アセンブリは一通りできることとして、話を進めます。
とりあえず Boot sector MEM 起動 Data 【ブートプログラム】 OS(カーネル)が動作し始める前に、色々な準備を行うプログラム。 「OSを作っている」といえるまで、相当の時間がかかるでしょう。実際、今現在(2003.10)では、まだブートプログラムの状態です。 ではブートプログラムはどのような形で存在するのでしょうか?それはフロッピーの「ブートセクター」という領域(最初のセクタ)に生のプログラムを書き込むことにより「起動ディスク」を作成します。あとは、フロッピーに起動ディスクをいれて電源を入れればブートセクタに書き込まれたプログラムが実行される、というわけです。 Boot sector MEM Data 起動 生のプログラム PCが起動すると、自動で、あるメモリ領域に転送される。そして実行。 詳しい説明はこちらのサイトを参照してください。本気でバイブルだと思います! http://nobumasa-web.hp.infoseek.co.jp/
とりあえず2 先ほどの「生のプログラム」を「ブートプログラム」と言います。この部分は完全にアセンブリ言語で書くことになります。ブートプログラムとは、OSが起動する前の準備をするプログラムだといいましたが、別に文字を表示して、終了するだけでも、立派なブートプログラムなのですっ! ここは実際に作るのが一番の近道だと思いますので、作ってみたい人はこのサイトを参考に作ってみてください。 プログラマの隠れ里 http://www7.plala.or.jp/keny01/ アセンブリ言語の勉強にもなります。
BIOS OSがなければPrintf()やScanf()などの標準入出力が存在しません。しかし現代のPC(IBM互換機)にはBIOS(Basic Input/Output System)というものがあります。 これは、便利なサブルーチンがたくさん詰まったチップと考えてください。これは一部のOS本体でも利用される、縁の下の力もち的な存在です。たとえば、フロッピーの何セクターを読む、キーボードの入力をまつ、そのような基本的なことができます。 つまり、ブートプログラム中では、キーボードドライバや、フロッピードライバを自作する必要はない、ということなのです。 しかぁし! 後々、このBIOSを呼び出しできなくなります。そのときは、ドライバをガシガシ作りましょうっ☆ Kernel BootProgram BIOS
? 流れの図 BIOS Kernel Floppy Jump MEM 起動 MEM Kernel その後 BIOSコール BootProgram BIOSコール Floppy Kernel MEM BootProgram MEM BootProgram 起動 起動時に自動でメモリ領域に転送。 そして実行。 Jump Kernel BIOSの助けを借りてフロッピー内のカーネルをメモリ領域に転送、いろいろな準備の末、ジャンプ。 カーネルが動きはじめる *ブートプログラムとして読み出されるのは1セクタのみ、よってあとは自力でメモリに転送しなければならない
実は、CPUには二つのモードがあります。 リアルモード プロテクトモード
二つのモードの違い 命令が16BITである 保護機能がない 命令が32BITである その他OSに必要な機能がたくさん まず、普段私たちが触れているCPUはリアルモードの方です。リアルモードの特徴は 命令が16BITである これにより、CPUはアクセスできる物理メモリアドレスは1Mが最大となる。しかも、アクセスする際、連続したメモリ領域とすることができず、セグメントと呼ばれるブロックに区切ってアクセスする必要があり、その大きさは64Kまでに制限されている 保護機能がない UNIXなどのOSでは、多人数、もしくは多数のプログラムが混在するので、メモリ領域を各ユーザ、各プログラムで区切って、他人がその領域を勝手に書き変える、もしくは読むのを防ぐ必要がある。しかし、リアルモードは基本的に「人間が一人、プログラムも一つ(シングルユーザ、シングルタスク)」用に設計されているため、この保護機能がない。 プロテクトモードの特徴 命令が32BITである これにより、物理メモリを最大4Gまで扱うことができるようになる。もちろん、レジスタも拡張されているので、より大きな数値を扱うこともできる。 その他OSに必要な機能がたくさん 保護機能はもちろん、ほかにもOSに必要なさまざまなテクニックが、命令として存在する。これについては後述することにします。
モードの移行 リアルモード プロテクトモード 数命令で移行
Bitと開発環境 【CPUのBIT】 CPUが32BItということは、一つ一つのマシン語命令が32bitの数値やアドレスを扱えるということです。 16bitと32bitでは、プログラムもだいぶ変わってきます。16Bitなら16Bit用のコンパイラ(もしくはアセンブラ)で作成する必要があります。 モード Bit プログラム 開発環境 リアルモード 16 ブートプログラム アセンブラ プロテクトモード 32 カーネル Cコンパイラ ちなみに! プロテクトモードに突入するとBIOSコールがすべて使えなくなります。つまりドライバを書き始めることとなるわけです。