割り込みベクタとPC起動手順についての疑問

このQ&Aのポイント
  • 割り込みベクタはどのタイミングで設定されるのか?システムBIOSの領域に書かれるのか?
  • 割り込みベクタに書かれるジャンプ先、周辺機器の初期化用プログラムは誰がメモリに書き込むのか?
  • PC起動時のメモリマップの様子が理解できません。どなたか教えていただけませんか?
回答を見る
  • ベストアンサー

割り込みベクタは誰が設定するのか。

PCのブート手順に興味をもって本やネットで調べていたのですが、 PC起動時のメモリマップの様子が理解できません。 (例:http://park12.wakwak.com/~eslab/pcmemo/boot/boot2.html#poweron) ・割り込みベクタは、どのタイミングで誰が0x00000~0x00400にメモリに書き込むのか、 や ・割り込みベクタに書かれているジャンプ先というのは、システムBIOSの領域になるのか。 また、 ・0xC0000~0XE0000に書かれる周辺機器の初期化用プログラムは誰がメモリに書き込むのか。 そもそもメインメモリには書かれずにどこかにマップされているだけなのか、、 どなたか教えていただけるとありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まず、パソコンに限らず、ありとあらゆるメーカーの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というのは、ビデオカード(グラフィックスカード)やモデムカードなどのカード上に載っているフラッシュメモリなどに書かれているコードになります。 以上、ちょっと書きすぎた感もあるけど、参考になりましたら幸いです。

komanoze
質問者

お礼

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

その他の回答 (1)

  • tsunji
  • ベストアンサー率20% (196/958)
回答No.1

・割り込みベクタは、どのタイミングで誰が0x00000~0x00400にメモリに書き込むのか、 ・割り込みベクタに書かれているジャンプ先というのは、システムBIOSの領域になるのか。 起動時はBIOSで、あとはOSまたは、ユーザープログラムによって書き換えられる。 ・0xC0000~0XE0000に書かれる周辺機器の初期化用プログラムは誰がメモリに書き込むのか。 その領域にBIOS ROMが物理的につながっている。 BIOSが起動後、シャドウRAMへBIOSをコピーする。その後BIOS領域はシャドウRAMへ切替られる。 ・そもそもメインメモリには書かれずにどこかにマップされているだけなのか、、 DOSとかは何も書かれていない領域にプログラムをロードして動かしてましたが、 Windowsの場合は、0x100000以降にマッピンされているメモリを使ってます。

komanoze
質問者

お礼

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

関連するQ&A

  • メモリアクセスにつきまして

    PC/AT互換機においてのメモリマップの仕組みについて質問があります。 例えばIO空間には0x00~0x100までのアドレスが割り当てられているとしたら、そのアドレスにアクセスがあった場合メインメモリにおけるアドレス0x00~0x100間には物理的には何にも読み書きされないのでしょうか? また、VRAM領域というのがありますがその領域にアクセスするということは物理的にビデオカードにあるVRAMに読み書きが行われるのであって、メインメモリのその領域には一切アクセスされないという解釈で正しいのでしょうか?? 何かご存知の方がいらっしゃいましたらお助け下さいませ。。

  • XPでなにかやっていると青画面になる

    自作PCにXPをインストールしたのですが、 どうもフリーズを起こしたり、ブルースクリーンが出ます。 ブルースクリーンのエラー内容は、色々ありまして。 0x7F 0x8E 0xC5 0xD1 0xE3 0xAなどがあります。(確認できたのがここまで) このエラーたちで調べてみたのですが、原因がはっきりしません。 どなたか、お助けください。お願いします。

  • 1台のHDにインストールできるOSの数は、4つまでですか?

    http://www.remus.dti.ne.jp/~ponya/multi_boot0.htmlの「基本領域と拡張領域」に以下の一文があります→。「通常OSが起動に必要とするファイルはこの基本領域に置かれている必要があります。基本領域は一台のハードディスクの中に4つまでしか作成できません。」 しかし、http://park15.wakwak.com/~unixlife/malutiboot.htmlをごらん頂いて、すぐ下の「Linux,Windows,FreeBSD,Soralisとのマルチブート 」というところをごらん頂きますと、第4パーティションの拡張パーティションのところにLinuxをインストールしてあります。 これは、どういうことなんでしょうか?OSは基本領域にインストールしなくてはならないと前者のページには書いてあります。矛盾していませんか? 両方とも、ちょっと古めの文献みたいなので、今は変わっているのでしょうか?また、5つのOSのブートを考えているのですが(WinPro,FreeBSD,Solaris,FedoraCore,Debian)、これは普通にGRUBを使うのでは無理なのでしょうか?MBMを使えば論理パーティションからも起動できるので大丈夫だということがわかりました。 詳しい方、よろしくお願いします。

  • BIOSの設定変更後

    BIOSの設定変更後 自作初心者でBIOSもイマイチ分からないですが、 中古パーツで自作しました。 CPU  AMD AthlonXP 1700+ マザボ ASUS A7V8X メモリ PC2700 512M 後はATAHDD AGPグラボ 光学DVD 電源を入れるとピーブ音無しでロゴ画面ー>BIOSのCPU設定画面(DELキーは押していない)になり、 CPU設定をマニュアルで133/33 * 11.0 とし、F10キー すると画面が真っ黒になり、再起動でも真っ黒のまま。CMOSクリアするとまたBIOSのCPU設定 画面に・・・CPUの設定を無視してブート順を変更しただけでも同じく真っ黒になり、また CMOSクリア・・・・ どうすれば良いでしょうか?よろしくお願いします。

  • OS XP→2000への入れ替え Win2000が起動しません。

    PCはDell Dimension 8400、HT Intel Pentium4、メモリ(DDR2-SDRAM)、HDD SATA、OS WinXP Professionalを使用しています。BiosでDrives→SATA Operation→RAID Onに設定した後、2000を新規インストールするためにFDD起動ディスクを使用して起動し、F6を押してAHCIコントローラを導入し無事インストールが終了したと思うのですが、2000起動時に次のようなエラーが出て起動できません。***STOP:0x0000007B (0xF201B84C,0xC0000034,0x00000000,0x00000000) INACCESSIBLE_BOOT_DEVICE 調べたのですがよくわかりません。どなたか解決方法がわかる方、よろしくお願いいたします。

  • Pentium4(925XE)のDDR2メモリについて

    DDR2のメモリを4GB(1GBx4)を購入して925XEのボードに取り付けてWinxpで動作させてました。が『システム』でみると3GBまでしか認識しません。ボードはグラフィックボードレスなのでPCI Express x 16で接続しています。この場合1GBも少なくなってしまうのでしょうか。BIOSでもきちんと認識しています。やはり3GB分のメモリで動作するということなのでしょうか。すっきりさせてください。よろしくお願いします。

  • Puppy LinuxをUSBメモリブート

    USBメモリブートできなくて困ってます。 PC初心者です。 現在PCを二台所持しています。 一台は2006年に買ったノート、もう一台は2000年くらいに買ったデスクトップです。 ネットで検索に検索を重ね、なんとかUSBメモリにpuppyを入れました。 2006年に買ったPCはUSBメモリブートに対応しているらしく、BIOSのブート優先順序を入れ替えたところPuppyをブートできました。 問題はもう一台の古いPCです。(本来こちらのPCでPuppy Linuxをブートさせたくてはじめた事です。) こちらのPCはUSBメモリブートには対応していないので、PloP Boot Manager(これも検索で見つけました。) でどうにかしようということになりまして、CD-RにこれのISOファイルをDeep Burnerで焼きました。 焼き終わったCD-Rの中身はBOOT、LICENCE.TEX、LIESMCH.TEX、README.TEX の4項目となっています。 そして2006年購入のPCと同じようにBIOSのブート優先順位を変えました。(1、CD-R 2、USB,FDD 3、HDD) この状態でCD-Rをいれ、USBもセットし、いざPCを再起動するのですが、なんどやってもwindowsがブートしてしまいます。 なぜなんでしょうか?初歩的な質問かもしれませんが、よろしくお願いします。

  • BIOS画面の点滅

    PCの電源を入れると、BIOSバージョンの表示とメモリ読み込み、 ドライブの読み込み画面が表示され、ここは問題ないのですが、 次にブートディスクを読みに行く画面で画面が点滅します。 ところが、次のNTLOADERやWindowsそのものでは大丈夫。 Linuxを立ち上げようとするとプロセスの立ち上げ画面で、 やはり同じように点滅して見ることが出来ません。 (Xは立ち上がりません) チェックしようと思ってBIOS設定画面に行くと、 同じように点滅していて判読不可能で何がなにやら… 1秒に1回ぐらいのペースで点滅するのですが、 表示される時間が極端に短いのでさっぱりです。 BIOSの修復をしようと思っても出来ませんし、 恐らくコレではOSの再インストールも無理でしょう。 こういう場合、どうすればよいのでしょう? faithのショップブランドもののブック型PC、 2年ぐらい前に買ったもので、Windows2000と NTFS領域にLinuxMLDを入れて使っています。 ビデオカードはオンボードなのですが、 "Intel81820 Graphics Controller"と書かれています。 (Winの画面のプロパティ>アダプタで見ると)

  • M.2 SSDをブートデバイスとして設定出来ない

    MB B450 steel legend CPU AMD Ryzen7 3700X メモリ SNIPER X 8GBx2 ストレージ システムドライブ CFD M.2 2280 NVMe PCI-E Gen.3 x 4(NVMe 1.3) サブドライブ(SATA接続) Crucial SSD MX50 1TB 電源 Enhance 800W ゴールド 上記の構成でwindows10をUSBメモリーからクリーンインストールしました。 再起動すると何故かブートエラーになるのでBIOSを確認すると、ブートデバイスとしてM.2 SSDを選択できません。 スクリーンロゴからブートメニューを開いたら認識されており、M.2SSDを選択すると普通に起動します。 今までに試した対策 BIOSアップデート SATAソケットの差し替え及びSATA接続の解除 上記を試しましたが、SATA接続のSSDを外すとUSBブートしか選択出来ません。 ブートメニューに入ると同じくM.2SSDが選択できるので問題なく起動します。 思い当たる節がなく手詰まりですので、有識者の方のご意見を伺いたいと思います。

  • 起動しません!

    NECのVALUESTAR(XP)を使っていますが突然画面がおかしくなりセーフモードを立ち上げようとしても画面が青くなりエラーのメッセージが出ます。 エラーを要約すると disable BIOS MEMORY OPTIONS SUCH AS CACHING OR SHADOWING UNMOUNTABLE-BOOT-VOLUME TECNICAL INFORMATION STOP:0X000000ED,0XC000009C,0X00000000,0X00000000) どうすれば復活できますか?