プロが教えるわが家の防犯対策術!

PCのブート手順に興味をもって本やネットで調べていたのですが、
PC起動時のメモリマップの様子が理解できません。
(例:http://park12.wakwak.com/~eslab/pcmemo/boot/boot …

・割り込みベクタは、どのタイミングで誰が0x00000~0x00400にメモリに書き込むのか、

・割り込みベクタに書かれているジャンプ先というのは、システムBIOSの領域になるのか。
また、
・0xC0000~0XE0000に書かれる周辺機器の初期化用プログラムは誰がメモリに書き込むのか。
そもそもメインメモリには書かれずにどこかにマップされているだけなのか、、

どなたか教えていただけるとありがたいです。

A 回答 (2件)

・割り込みベクタは、どのタイミングで誰が0x00000~0x00400にメモリに書き込むのか、


・割り込みベクタに書かれているジャンプ先というのは、システムBIOSの領域になるのか。
起動時はBIOSで、あとはOSまたは、ユーザープログラムによって書き換えられる。

・0xC0000~0XE0000に書かれる周辺機器の初期化用プログラムは誰がメモリに書き込むのか。
その領域にBIOS ROMが物理的につながっている。
BIOSが起動後、シャドウRAMへBIOSをコピーする。その後BIOS領域はシャドウRAMへ切替られる。

・そもそもメインメモリには書かれずにどこかにマップされているだけなのか、、
DOSとかは何も書かれていない領域にプログラムをロードして動かしてましたが、
Windowsの場合は、0x100000以降にマッピンされているメモリを使ってます。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
よく理解できました。
引き続きいくつかの本を読んで勉強したいと思います。

お礼日時:2012/12/01 10:40

まず、パソコンに限らず、ありとあらゆるメーカーのCPUがどう動くのか説明します。



CPUが最初に何処から命令を拾って動くかですが、CPUが最初に実行するのはブートローダ(Boot Loader)。その番地(アドレス)はCPUの種類毎にほぼ固定なので、そこからブートローダというプログラムが動きます。ちなみに、ブートコードというのはブートローダに書かれているコードのことを言います。

ほぼ固定と言ったのは、CPUによってはブートローダのアドレスを変えることが出来るものもあるからです。大抵はCPUの外部信号やNVRAM(不揮発の小さなメモリ空間)のデータとして入力し、その信号によってブートローダのアドレスが変わるようになっています。ブートローダは毎回同じことしかしないので、基本的にはフラッシュメモリ上に書かれた固定のコードです。

コンピュータのプログラムはコード領域とデータ領域、スタック領域を分けて使うように出来ているので、ブートローダはBIOSのためにこれらの領域を割り当てる作業をします。その間は、ハードウェアの割り込みが発生しては困るので、割り込みが起きないようにマスクします。これがマスカブルインタラプト、マスク可能な割り込みで、リセットとNMI以外の割り込みはすべてマスクできます。リセットやNMIはマスクできないので、ブートローダの中にそのコードが書かれています。

コード領域やデータ領域、スタック領域を初期化したら、大抵は別の領域(フラッシュメモリ)に書かれているBIOSのマスターコードをダイナミックメモリ(メインメモリ)にコピーします。これがシャドウイングという作業です。

次に、ブートローダは今書き込んだメインメモリにジャンプして、ようやくBIOSの本体が動き出します。
ここまでの一連の流れをブートストラップと言います。

ここで、BIOSはメインメモリに展開されたコードの中から、割り込みのジャンプ先となる先頭アドレスを、ベクタテーブルに書き込んで展開します。展開が終わると、利用可能な割込み源を調べて、割り込みを許可していきます。この段階にきて初めて、ビデオカードやキーボード等が使えるようになります。

例えば、私たちがパソコンのキーを押下すると、キーボードの先に繋がっているキーボードコントローラというハードウェアチップが割り込みを発生します。CPUは、割り込みが発生すると、いま動かしているプログラムをいったん中断し、必要なプログラムの実行手順をスタックに保存します。この必要手順のデータのことをコンテキストいい、必要手順をインタラプトエントリと言います。次にCPUはキーボードに対応した割り込みのジャンプ先にジャンプします。ジャンプ先の割り込みプログラムはインタラプトコード、割り込み処理とか、割り込みプログラムとも言います。インタラプトコードが終わると、CPUはそこに書かれた命令どおりにスタックからコンテキストを復元して元居た中断したプログラムのアドレスに戻り、プログラムを再開するようになっています。これが割り込みという動作です。

ちなみに、現在のインテル系のプロセッサには、特権レベルというものがあります。昔から変わっていないのは、0~3の4段階があると言う点。これは、セキュリティの観点で、特定のコードから他のコードが操作できないようにするもので、例えば、システムの重要なコードは、アプリケーションレベルのプログラムからは書き換えたり出来ないよう、ハードウェアレベルで設定できるようになっていて、これが特権レベルという仕組みです。

レベルの値が小さいほど、他より優先して動くように出来ています。
優先とは、現在のインテル系のプロセッサはマルチスレッディングを装備していますから、レベル0からレベル3のプログラムはそれぞれ平行して動いているのですが、レベル0のプログラムのほうが割かれる時間が長いと考えたらいいでしょう。

このなかでレベル0は最上位特権で、Windows では、カーネルモードと呼ばれています。
プロセッサ上の呼び名は、レベル0あるいはプロテクトモードです。プロテクトモードになると、リアルモードのプログラムはプロテクトモードが所有するメモリ空間にはアクセスできません。リアルモードではメモリ空間に限りがあって、それ以上使えないようになっているのです。元々、Intel系のCPUはリアルモードという呼び名がない時代、この限られた小さい1MBぐらいしかないメモリ空間で動いていました。この壁を越えるために編み出されたのがプロテクトモードであり広大なメモリ空間だったのです。
当然、リアルモードでは、アドレッシングの方法も違うので、どうあがいてもプロテクト空間にはアクセスできません。

そこでまた出てくるのが割り込みです。
リアルモードのCPUは、プロテクトモードに変わるために割り込みを発生させます。これはソフトウェア割り込みと言い、CPUの命令を起源として発生させる割り込みです。プロテクトモードに変わる割り込みが発生すると、CPU自体がプロテクトモードに切り替わり、プロテクト空間のメモリにアクセスできるようになります。ただし、プロテクトモードからは、リアルモードにアクセスできません。よって、プロテクトモードでは、またリアルモードに戻るための割り込みを発生させます。

この行き来が、Windows 3.1 の時代の、DOSモード(リアルモード) と Windows(プロテクトモード) です。
今はWindows 2000以降、Widows 7 や XP でもリアルモードに戻ることはありません。
レガシードライバと呼ばれる使われなくなった古いドライバの中にはリアルモードを使っているドライバが多くあって、このモード間の行き来が発生するため動作が遅いのです。

最後に、

> 0xC0000~0XE0000に書かれる周辺機器の初期化用プログラム

このメモリ空間はハードウェア的に例えばカードスロットに割り当てられています。
カードが刺された状態で電源が入ると、電源投入によってカードから発せられた割り込みによってBIOSはカードを識別します。
これによってBIOSは対応となるスロット番号にメッセージを送って、ネゴシエーション(カードとのやり取り)をした後にカードが要求したBIOS空間を開放しアクセスできるようにします。これがプラグアンドプレイという仕組み。

すなわち、VGA-BIOSや拡張BIOSというのは、ビデオカード(グラフィックスカード)やモデムカードなどのカード上に載っているフラッシュメモリなどに書かれているコードになります。


以上、ちょっと書きすぎた感もあるけど、参考になりましたら幸いです。
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございます。
電源がはいってから、BIOS本体が動き出すまでの流れがよくわかりました。
まださわりを知ったレベルなので引き続き勉強していきたいと思います。

お礼日時:2012/12/01 10:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!