
PCのブート手順に興味をもって本やネットで調べていたのですが、
PC起動時のメモリマップの様子が理解できません。
(例:http://park12.wakwak.com/~eslab/pcmemo/boot/boot …
・割り込みベクタは、どのタイミングで誰が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というのは、ビデオカード(グラフィックスカード)やモデムカードなどのカード上に載っているフラッシュメモリなどに書かれているコードになります。
以上、ちょっと書きすぎた感もあるけど、参考になりましたら幸いです。
ご丁寧な回答ありがとうございます。
電源がはいってから、BIOS本体が動き出すまでの流れがよくわかりました。
まださわりを知ったレベルなので引き続き勉強していきたいと思います。
No.1
- 回答日時:
・割り込みベクタは、どのタイミングで誰が0x00000~0x00400にメモリに書き込むのか、
・割り込みベクタに書かれているジャンプ先というのは、システムBIOSの領域になるのか。
起動時はBIOSで、あとはOSまたは、ユーザープログラムによって書き換えられる。
・0xC0000~0XE0000に書かれる周辺機器の初期化用プログラムは誰がメモリに書き込むのか。
その領域にBIOS ROMが物理的につながっている。
BIOSが起動後、シャドウRAMへBIOSをコピーする。その後BIOS領域はシャドウRAMへ切替られる。
・そもそもメインメモリには書かれずにどこかにマップされているだけなのか、、
DOSとかは何も書かれていない領域にプログラムをロードして動かしてましたが、
Windowsの場合は、0x100000以降にマッピンされているメモリを使ってます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ノートパソコン 最近のノートPC 7 2023/03/07 22:48
- その他(パソコン・周辺機器) NVIDIAのシェーダーキャッシュ 1 2022/05/30 22:36
- CPU・メモリ・マザーボード BIOSアップデート 3 2022/07/09 22:30
- Android(アンドロイド) galaxy s8+にUSBメモリ(type-c)を接続し、動画再生すると熱くなるのですが… USB 5 2022/06/24 17:21
- CPU・メモリ・マザーボード BIOSの次にno option to boot toと表示されWindowsが起動できません 6 2022/05/20 23:19
- ドライブ・ストレージ 【緊急】USBメモリから変な音がする 6 2022/05/20 15:52
- CPU・メモリ・マザーボード AG03mk2使用時にデバイスが認識されなくなる【B550 phantom gaming 4】 2 2023/02/11 05:21
- CPU・メモリ・マザーボード ゲーミングpcのファンのことについて教えて欲しいです。 6 2023/03/05 07:44
- Android(アンドロイド) microSD Sandisk なら間違いはないですか 基本的にどれくらいもつと思いますか 4 2023/02/09 23:34
- USBメモリー・SDカード・フラッシュメモリー USBメモリの書き込み禁止を解除したい。 2 2023/03/25 08:21
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C-Builder OnChangeをマスク
-
PICマイコンでエンコーダパルス...
-
割り込みについて
-
コールバック関数について
-
VB6でSendKeyを利用したTab移動...
-
H8/36037 CCRの設定方法
-
マイコンのメインルーチン内でw...
-
C言語について(PWM)
-
このレジの並び方は間違ってま...
-
【組込み】割り込み中のstatic...
-
PICマイコン 割り込み実行時間...
-
ウォッチドッグタイマ(WDT)の...
-
Macターミナルで実行中のプログ...
-
トラックバック機能を作りたい
-
バックグラウンドのプロセスの...
-
VC++ 6.0 のソケット通信について
-
TCP/IP通信時のサーバーからの受信
-
ACCESS側からEXCELの書式を設定...
-
アセンブリ言語の問題
-
POSTデータが送信されなくなり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
CPU負荷率の安全な上限と計...
-
マイコン C言語 割り込み処理...
-
このレジの並び方は間違ってま...
-
USB機器からのデータ受信による...
-
【組込み】割り込み中のstatic...
-
VB6でSendKeyを利用したTab移動...
-
一定時間操作がなかったら、と...
-
VB.NET スレッドからのイベント...
-
irqbalance って
-
ウォッチドッグタイマ(WDT)の...
-
Timerコントロールによる動作の...
-
pic 複数の割り込み関数 切り分...
-
マイコンSH-2の割り込みを用い...
-
Amazonfireタブレットにわから...
-
STATUSのZフラグについて
-
マイコンの割り込みについて教...
-
Timerコンポーネントのインター...
-
電車乗車時、並んでいるのに割...
おすすめ情報