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