以前書いた、プログラム勉強中の知人から聞かれた話。
以前はC言語の勉強の話が多かったのだが、最近はエミュレータで 8bit 機時代の雑誌プログラムとかを楽しんでいる。
その時代のプログラムって、雑誌に 16進数で書かれたマシン語のゲームとか公開されていた。
それで、質問の際に、「ホットリセットとコールドリセットって何?」という話が出たのだ。
雑誌のプログラムを打ち込んだのだが何か間違いがあったのか暴走してしまい、リセットをかけてメモリ内を覗いたら(エミュレータなのでそういうことができる)、プログラムは消えないで残っていた。
リセットしたのだからメモリの中も消えるのでは? と不思議に思ったらしいのだが、そういえば「ホットリセット」「コールドリセット」という単語が雑誌内に時々出てきたことを思い出し、メモリが消えないことと関係があるのか知りたい、ということだった。
今時のコンピューターは「暴走してリセット」とかあまりやることがないから、リセットボタンを押すことも少ない。
ゲーム機だって、昔は「失敗したらリセット」とか普通だったのだけど、そもそもリセットボタンがついていないものが多くなっている。
だから、リセットについて知らなくても、特に問題は無い。
でも、彼は勉強中だから気になって知りたかった、というだけだ。
ホットリセット・コールドリセットの話をする前に、そもそも「リセット」とはなにか、ということから始めよう。
CPU のなかでは、いくつかの「数値を覚えておく機構」…一般に「レジスタ」と呼ばれる仕組みがある。
レジスタはフリップフロップという回路で作られている。
この回路は、2つの状態を持ち、通電している限り直前の状態を維持しているが、外からの信号によって状態を変えることができる。
これで「0と1」を表現し、沢山並べることで数を保持しているんだ。
さて、「通電している限り」と書いたが、通電「していない」状態から通電するとどうなるだろう?
これは、電気が供給され始めた瞬間の電気的なノイズなどにより最初の状態が決まり、それを維持することになる。
現代的な CPU は、メモリ内にプログラムを保持していて、今どこのメモリのプログラムを実行中かを示す「レジスタ」を持っている。このレジスタは「プログラムカウンタ」、略して PC と呼ばれる。
さて、PC もフリップフロップなのだから、電源を入れると「ランダムな」アドレスを示し、そのアドレスのプログラムを実行し始める。
ランダムなアドレスなのだから、何が書いてあるかわからない。でも、CPU はそれをプログラムだと思って実行するんだ。人間から見ると全く無意味な動作。いわゆる「暴走」状態だ。
ここで、CPU には「リセット」という信号線がある。ここの電圧を変化させて信号を送り込むと、CPU は PC の内容を規定の方法で強制的に「整える」。
規定の方法、というのは、CPU 毎に異なる。0 にする、というのもあるし、一番大きな番地のメモリに書かれた値を入れる、というものもある。
とにかく、CPU ごとに細かな方法は異なるが、PC を整えることができる、という動作は変わらない。
昔のマイコンの中には、電源投入後にリセットスイッチを明示的に押す必要がある物もあった。
でも、大抵は「通電すると、電源が安定するくらいの時間を待った後で、1度だけリセット信号を発信する」という回路と組み合わせる。
これで、電源を入れれば、ROM に書かれた内容が実行され、コンピューターを起動させることができる。
通常は、ROM に入っていて最初に実行されるプログラムは、外部記憶メディアからプログラムをメインメモリに読み込んで実行させるものだ。これを Initial Program Loader (IPL)と呼ぶ。後でまた出てくる。
昔は「外部メディア」は紙パンチテープや磁気カセットテーブだった。または、ROM の BASIC が直接起動される場合もある。
最近ではハードディスクやSSD、フラッシュロムからプログラムを読み込むことになる。
これが起動時の流れだが、起動後でも暴走した際など、リセットボタンを押せば、電源投入時と同じように IPL に処理を移して、最初から動作させることができる。
ここで、リセット信号が「CPU 内の PC レジスタを規定値にする」という役割しかないことに注目。
メモリの内容などはそのままだ。
もともとこの質問は「リセットしてもメモリの中は消えないの?」という疑問だった。今書いたことが答えで、コンピューターのリセットは、CPU 内の PC レジスタをリセットするだけなので、メモリの内容は消えない。
そして、この「周辺回路はすでに稼働している状態でのリセット」のことを、ホットリセットという。周辺はすでにいつでも動ける、「あたたまった」状態にあるリセットだな。
ただ、コンピューターの不調は周辺回路のせい、という場合もある。周辺回路が暴走して一切の信号を受け付けなくなっていたとすると、ホットリセットをかけても信号を受け付けないまま、ということがある。
この場合は、一度電源を切って、周辺回路の暴走状態も解消する必要がある。これをコールドリセットと呼ぶ。
今のコンピューターだと、よほどの問題がない限り、ホットリセットとコールドリセットに違いはない。
どちらでも IPL が起動され、一連の動作の中で周辺機器もすべて「リセット」されるためだ。
しかし、初期のマイコンなどでは、そんな気の利いたプログラムは無かった。周辺機器を使えるようにセットアップするプログラムは自己責任で動かす必要があったため、ホットリセットで「周辺機器は使える状態のまま」であることには、大きな意味があった。
だから言葉を分けていたのだが、今となってはこんな意味は失われているので、言葉の意味が分からなくても特に問題は無い。
これで最初に書いた「ホットリセットとコールドリセット」の説明としては十分なのだが、もう少し書こう。
リセット信号は「CPU に信号を送ると PC の値が変化する」という基本的なものだが、現代の CPU ではこの仕組みは拡張されている。
「割り込み」がそれだ。
CPU に対して外部から割り込み信号を送ると、CPU は実行中のプログラムをいったん中断して…あとで元に戻せるように PC の値をスタックに退避してから、PC の値を「あらかじめ設定したもの」に変更する。
リセットの場合は PC の値の「退避」がないことが大きく違うが、仕組みとしては似たようなものだし、実際割り込みをリセットの一種として使うこともある。また、通常のリセットを割り込みのように使うプログラムも見たことがある。
8bit 機時代のパソコンとして、Sharp の X1 シリーズの後期機種には、「IPL」と「NMI」の二つのリセットボタンがあった。
IPL は通常のリセットボタンだ。先にも書いたが、パソコンは起動するとまず IPL を実行する。
その IPL をすぐに実行させるためのボタン、というのは、つまりリセットボタンなのだ。
NMI とは Non-Maskable Interrupt (マスク不能割り込み)の意味で、詳細は書かないが「いつでも使える割り込み機能」のことだ。
こちらは、直前に実行していたプログラムが指定したアドレスに処理を移す。
IPL では動かすプログラムが決まっていたが、NMI は動かすプログラムを設定できる、という違いになる。
たとえば、マシン語モニタを使用中に、実行したプログラムが暴走してしまったとしよう。
NMI リセットを行うと、マシン語モニタのプログラムがコマンド待ちの状態に戻ってくる。
パソコンがリセットされるわけではないが、暴走したプログラムを中断して「なかったことにする」のだから、リセットだ。
でも、先ほど実行しようとして暴走したプログラムはまだメモリの中にあり、そのメモリを確認できるマシン語モニタのプログラムが動いている。デバッグするには非常に便利だ。
ゲーム機でも、PS2 のリセットスイッチは「リセット」だったが、同時期のゲーム機であるゲームキューブのリセットスイッチは「割り込み」だった。
攻略するようなゲームで、少し失敗したとしよう。PS2 でリセットを行うと、起動画面が出て、ゲームをロードして、タイトルに戻る。
でも、ゲームキューブでは瞬時にタイトルが表示される。すでにゲームを読み込んであるのだから、その最初の画面に処理を移したのだ。
光学ディスクのゲーム機なのに、ROM ゲーム機のように気軽にリセットできた。
この機能がなかったら、ピクミンは攻略ゲームとしてあそこまで高い評価にならなかっただろうね。攻略中は、ちょっと失敗するとリセットだから。
「リセット」は当たり前に使っている機能なのだが、その動作は結構多様で奥が深い。
最後に、話を聞いた知人が「こんな細かな話って、プログラマならみんな知ってるものなの?」と聞いてきた。
いやー、知らない人が多いと思うし、知らなくてよいと思う。
パソコンがリセット時にどんな動作をしているかなんて、OS を作るプログラマならともかく、普通のプログラマが知る必要はない。
僕がゲームプログラマやっていた時代は、ゲーム機の性能も低かったので、ハードウェアの性能を十分に引き出すプログラムが求められた。OS なんてなくて、ゲームのプログラムがハードウェアを直接駆動していた。
だから細かなハードウェアの仕組みまで調べて作っていたわけだけど、今はゲームも OS の上で動くような時代だし、プログラマがみんなこんな知識を持っている必要はない。
なので、ここに書いた話は、知っていても特に役立ちません。
年寄りが昔の武勇伝をひけらかしているようなものだと思ってください。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |