さて、私たち全員がC / C ++プログラマーが一度に私たちのタイムリーでない敵、悪魔のような信号SIGSEGV、セグメンテーション違反に遭遇したことを理解しています。さて、これは(過去形を強調して)魔法のGCC(またはg ++)コンパイラーによって吐き出されたマシンコードの一部内のフェイルセーフ/チェックシステムの形式であると理解しました。
だが!今日、私は仮想化されたArch Linuxシステム上で古き良きNASMを備えたx86アセンブラーをいじくり回していましたが、驚いたことに、そして残念なことに、悪意のあるSegFaultによってコーディング作業が再び妨げられました。
恐ろしい信号を生成したコードは次のとおりです。
mov eax, 0x7
mov [0xB8000], eax
Linuxカーネルがアセンブルされたプログラムをシェルにロードし、そこから実行することを理解しましたが、このMOV命令はプロセッサと1対1で相互作用すると思いました。カーネルは、私がアクセスしようとしていることをカーネルがどのように検出できるのでしょうか。少しのメモリで、命令を停止しますか?
プログラムがシェルにロードされたときに正確に何が起こるか、シェルに一度持っている権限、さらにはシェルとは何か、またはそれがどのように機能するかを理解するふりはしませんが、ASMがあなたに与えたと確信していましたプロセッサを完全に制御します。この魔法のカーネルは、プロセッサへの直接コマンドをどのように妨害しますか。また、本質的に純粋なマシンコードを作成するときに、このオペレーティングシステムコマンドのチェーンを実行しなければならないのはなぜですか。:O