リアルモード プロテクトモード

お
お
え
す
作
成
の
手
引
(
い
ち
)
き
そ
ち
し
き
編
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コールがすべて使えなくなります。つまり
ドライバを書き始めることとなるわけです。