誤操作を防ぐために、めんどくさい操作を要求する製品は多い。
例えば、駅の非常停止ボタンを操作するのに、フタを開けて、ボタンを押さないといけないようになっているのもそうだよね。
うっかり押してしまうことのないように。けど押したい時にはすぐにわかるように。
そういうところの折り合いを付けた製品なんだろうと思う。
こういう機械的な工夫はあれこれ見ることがあるが、
コンピュータの中でも誤動作防止のためにめんどくさい操作を要求するものはある。
コンピュータを使う技術者でもそういうことを意識することがあるかというと必ずしもそうでもない。
こうやって守られている機能というのは得てしてヤバイ機能だから、直接触ることはあまりしないのだから。
まず、簡単なところから。
特定のレジスタにマジックワードを書き込むと隠し機能が動くと言うものがある。
レジスタのアドレスとマジックワードは完全に秘密で、普通に使うときに触ることは想定されない。
しかし、変な動きをするプログラムが通常触らない範囲のレジスタを触って、結果として隠し機能につながっているレジスタに来る可能性もある。
それでも書き込まれたビット列があらかじめ決められたマジックワードと一致しなければ、その機能が動くことはない。
マジックワードが 0x00000001 とかだったらかぶってしまう可能性も高そうだが、
0xDEADBEEF、すなわち10進数で-559038737と書き込まないとうごかないなら、かぶってしまう確率は低そうだ。
簡単な仕組みだけど、けっこう安全性は高そうだ。
もうちょっと手の込んだ操作を要求するならば、レジスタに2回連続で書き込まないと動かないとか。
0xDEADBEEF と書き込んだ次に、0xFACEB00Cと書き込むと、隠し機能が動くとか。
1回でも一致するのは相当な偶然だが、偶然で2回一致するのはないだろうということか。
他の機能と共用しているレジスタに2回連続で正しいマジックワードを書き込むと動くというのもあって、
これは、プログラムでそのレジスタに書き込むとき、値が化けてマジックワードと一致してしまうことは1回はあるかもしれないと考えたのだろう。
ヤバイ機能を司るレジスタに安易にアクセス出来ないようにするという考えもある。
あらかじめレジスタのとあるフラグを立てない限り、そういうレジスタ群には書き込みができないようになっているとか。
通常のプログラムが何か間違えていて危ないレジスタに触れてしまうプログラムになってしまっていても、
通常のプログラムではそのフラグを立てることはしないから、危ないレジスタに触ろうとしても拒否されると。
このあたりの機能はOSとも関連が深くて、一般のプログラムはそのプログラムで使っているメモリ空間だけにアクセス出来るようになっている。
システム全体の動作に影響を与えかねないレジスタの操作はOSのプログラムに任せるという役割分担があるわけだ。
そういう役割分担を実現する手段として使う機能なのだろう。
開発職場でのデバッグというのはそうやって埋め込んだ隠し機能のオンパレードで、
この機能が意図せず動いてしまったら怖いなぁとか、そういう機能も使いながら動作を確認していると。
ただ、実際問題として、どういう条件が揃えばそういう機能が動いてしまうのかという疑問もある。
プログラムの論理的な問題というのが真っ先に思いつくのだが、それ以外の要因というのもあって、
なんかの拍子にメモリのデータが化けたり、バスを流れるデータが化けたりというのもある。
そういう変なことがあっても危ない機能が動かないようにする。上のような工夫をするのもそういうことを考えてのことだ。