山内の授業のページ/資料編/システムソフトウェア?

ハードとソフトの境界 〜 CPU

CPUの命令実行

最近のCPUはいろいろな機能が追加されているが、CPUの動作原理(原理的な機能)は昔から、変わっていない。それは

まず命令自身をよく見てみよう。
命令自体はかなり簡単なことしかしないものである。イメージとしては四則演算、メモリとレジスタ(計算途中結果を置いておくための仮のおき場所、普通は数個〜数十個)の間の転送、条件分岐、ジャンプなどが基本命令になる。
コンピュータアーキテクチャ(=ハードウェアの構造とCPUの機能の概論)とコンパイラ(ユーザの書いたプログラムを命令の列に変換するソフト)の授業の中で、命令がどう考えられていたかを思い出して欲しい。

(注)命令は、CPUハードウェアごとに決まる。つまり、そのCPUハードウェアを設計・製作すれば、それが解釈・実行できる命令が決まる。単独の命令(加算命令とか)では意味が無いので、1つ(1種類)のCPUが定義するすべての命令(これを「命令セット」という)がどうであるか、という議論をする。
たとえば、IntelのPentiumやそれに類するCPU(Intelのx86系と呼ばれる一連のCPUや、AMD社などの作る「IntelコンパチブルなCPU」(Athronなど)は、いわゆる「x86系」の命令セットを持っている。この命令セットは歴史的な背景があり、8086(1970年代か?)で定義された命令セットに端を発し、それに新しい命令を追加する形で発展してきたものである。
まったく別の命令セットとして、たとえばPower Macに用いられたPowerPCの命令セットや、その前に用いられていたMotorolaの68000系の命令セット、ARMプロセッサの命令セットなど、その他たくさん存在する。
プログラム(たとえばJavaとかC言語で書かれたプログラム)を機械命令の列に返還するのは、コンパイラである。つまり、コンパイラは命令セットごとに別々に作らなければならない。これは大変なので、最近のコンパイラは8割がたの処理を命令セットに依らない処理にし、最後に命令列を吐き出す時にCPU種類に応じた命令を吐き出すように作られている。

命令実行は1列(スレッドが1つ)

次に、命令実行の仕組をよく考えて見て欲しい。

プログラムの起動

プログラムをハードウェア上で起動することを考えてみよう。
一旦プログラムが走り始めた後は、上で議論したとおり、プログラムの中で指示された≪ジャンプや条件分岐しない時にはアドレス上の次の命令≫や≪条件分岐で指定された飛び先の命令≫を次々と実行してゆく。では起動する前は、何をしなければならないか?

プログラムはメモリ上に置く。メモリ上に置いてなければCPUは実行(=命令フェッチ・解釈・実行)できない。
他方、プログラムは≪実行ファイル≫(Windowsでは .exeファイルなど。正式名称は「実行可能形式ファイル」)として置かれている。ファイル形式の細かいことは後で議論するとして、大事なことはファイルとして(おそらくはハードディスク上に)置かれているこということである。メモリ上には置かれていない。だから、(ハードディスクなどに置かれた)ファイルから、メモリの上へ持ってこなければならない。このもって来る操作のことを「プログラムのローディング」と呼ぶ。

たとえば、ワープロ(マイクロソフトのMS Word)を使いたい(=実行したい)と思う。Wordはプログラム(=CPUから見れば命令の列)である。Wordプログラムは(ディスク上の)ファイルとして保存・配布されている。自分のPCでWINWORD.EXEなるファイルを探してみるとよかろう。Wordを実行するためには、このファイルを、メモリ上にローディング(=要するにコピー)し、実行できるようにしなければならない。

ローディングは、実は単にコピーするだけではない。「メモリ管理」の項目で「再配置」問題を議論するが、その問題がローディングの時点で発生する。詳しくは別途学ぶが、一言で言うと、もし2つ以上のプログラムをメモリ上に置きたいとしたとき、メモリ上のおき場所(開始番地)をどうするか、開始番地が実行時に決まるためにプログラム内に書かれたアドレス(被演算数の置いてある番地やジャンプ先の番地)をその分だけずらさなければならないよ、という問題である。

さて、うまくローディングが出来れば、あとはCPUがそのプログラム(たとえばWord)の先頭番地(実行開始番地〜〜実は必ずしも先頭に限るわけではない)にジャンプすれば、実行開始できる(はずである)。

IPL(初期プログラムローディング)と「ブートストラップ」

上では、≪プログラムのローディング≫は、要するにWINWORD.EXEなるファイルにしまってあるプログラム(実行可能形式のファイル)をメモリ上に≪コピーする≫ことだと言った。さてこのコピーの操作は≪誰が≫やるのだろうか?

コンピュータ上では、何か仕事をするのは必ずプログラム(命令の列)である。その仕事をする命令列が無ければ、その仕事はなされない。つまり、プログラムのローディングの仕事は、ローディングをするプログラム「プログラムのローダ」を実行して、初めてローディングの仕事(指定されたファイルからメモリへコピーする仕事)がなされる。つまり、Wordのプログラムをメモリ上にロードするには、ローダプログラムを実行しなければならない。

さて、このローダなるプログラムは、プログラムである。つまりメモリ上に置いていなければ実行できない。では、≪誰がローダをメモリに置くのか。≫ ローダ自身か?でも、ローダ自身がメモリ上に無い状態では実行できないのだから、ローダ自身が(自分自身を)メモリに置く事はできない。

ローダは、実はOS(オペレーティングシステム、たとえばWindowsとかLinuxとか)の一部で、そのOSが動いている限りメモリ上に常に居つづける(常駐する)プログラムになっている。だから、Windowsを起動した後それが動いている限り、たとえばWordのアイコンをダブルクリックすると、ローダが動いて、WINWORD.EXEファイルの中身をメモリ上にコピーして実行できるようにする。

今、OS(たとえばWindows)が動いている限り、と言った。では、動いていない時はどうなるか? 電源を入れた直後は、OSは動いていない。この時はどうするのか?

その前にメモリについて説明しよう。コンピュータの中で「メモリ」として使われるメモリハードウェア(メモリデバイス)には、いろいろな種類がある。

       内容が書き換えられる電源を消しても内容が消えない
DRAM    書換え可       消えてしまう      
フラッシュメモリ 書換え可       消えない       
ROM     書換え不可      消えない        

ここで、略語を整理すると、

ここでは半導体のメモリについて見ているが、ハードディスクやCD, DVDも一種のメモリと見ることができ、ハードディスクは書換え可能で電源を消しても内容保持、CDやDVDはいわゆるROMと呼ばれるタイプ(CD-ROM、DVD-ROM、普通使っているもの)は書換え不可(ROM=Read Only Memory)で電源を切っても内容は保持される。ハードディスクは書換え可能だが、読書きの速度は(半導体のメモリ、たとえばDRAMやSRAM)に比べると非常に(100万倍ぐらい)遅い。

話を戻そう。コンピュータのメモリ(メインメモリ=主記憶)は基本的にDRAMで出来ている。これは高速でかつ小さい体積の中で容量がたくさん欲しいからである(今のところ)。その代わり、電源を切るとメモリの内容は消えてしまう。つまり、電源を入れた直後は、プログラムは一切メモリ(メインメモリ)上には載っていない。その状況で、どうやって最初のプログラム(普通は他のプログラムをロードするためのローダ)をメモリ上に載せるのか? このまっさらなメモリ上にプログラムを載せる手続き・プロセスをIPL(=Initial Program Loading)と呼んでいる。

IPLは、通常はごく小さなローダ(「初期ローダ」Initial Loaderと呼ぼう)を載せたROMを(メインメモリの一部として)用意し、そこに書かれた(電源を消しても消えない)初期ローダのプログラムから走り始めるように仕組んでおく。実はこの初期ローダだけでなく、ローダに必要なハードディスク読出しやCD-ROM読出し(CD-ROMから起動したい場合がある)、PCのチェックやディスクの設定変更などの保守用のプログラムなども一緒に、ROMに入れてあるのが普通である。これらのプログラムのことをBIOS(Basic Input/Output System)と呼び、BIOSの入ったROMをBIOS-ROMと呼ぶ。

BIOS-ROMは、ハードウェアの一部としてマザーボード(PCの回路基板)の上に装着されている。PCは電源を入れると、まずBIOSの中の≪ごく簡単な≫ローダが実行されて、それがハードディスク上に置いてあるOSのプログラム(命令の列)をメモリ上にコピーする。PCの電源を入れると、ハードディスクのランプが点滅しカチャカチャとハードディスクをアクセスする音が聞こえるだろう。これがIPLによってOSがハードディスクからメモリにコピーされている音である。

IPLのプロセスは、正確には1段階ですべてを読み出すようになっていないのが普通である。なぜなら、BIOSはハードウェア(マザーボード)の一部として作られ、すべてのOSに共通だし、ローダプログラムも簡単(ステップ数が少ない)ので複雑なことは出来ない。具体的には、BIOSローダはハードディスクの特定の1ブロックを読み出すだけに留め、その読み出したブロック内に書かれたプログラム(次のレベルのローダ)がOSのコア部分をディスク上のファイルからメモリにコピーし、更にそのコア部分がOSの残りの部分をディスクからメモリへ読み出す、といった過程を経る。このように、最初はごく小さなローダ、次にそのごく小さなローダを使ってもう少し大きいプログラム部分、次にそのプログラム部分を使って更に大きなプログラム部分、というように、段々にくみ上げてゆく方法のことを、「ブートストラップ」(Boot Strapping、長靴の紐)と呼ぶ。編み上げ靴の紐を下から順に結んでゆくことからイメージされた言葉である。

OSのハードディスク上のイメージとOSのインストール

OSは、そのOSが実行している間メモリに常駐するコア部分と、必要なたびにハードディスクからメモリへ読出される部分(非常駐部分と呼ぼう)に分けることが出来る。コア部分は、IPLのブートストラップの結果メモリ上にコピーされて、それ以降「常駐」する。

コア部分は、IPLの時にメモリにコピーできる形にして、ハードディスク上に(ファイルとして)置かれている。その他の非常駐の部分は、ユーザが書いた普通のプログラムと同じように、実行可能形式のファイルとしてハードディスク上に持っていて、実行する時にメモリにコピー(ロード)する。

(注)ここでは、常駐・非常駐の区別や、カーネル・非カーネルの区別、プロセス・非プロセスの区別、常時起動されているプロセスと必要時だけ起動されるプロセスの区別などは、厳密にはしないで置く。厳密な議論は十分に意味があるが、まずは全体のイメージを掴んでもらうことを目指そう。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-03-07 (水) 08:55:21 (5596d)