>>920
OSがプロテクトモード(保護モード)で動作して、アプリが保護違反をしてないかCPUが常に監視
しながら動くようになってからはその辺の事情は特に変わってない。なお、
スタックフレームは、

関数名 proc
 push ebp
 mov ebp,esp
 sub esp,定数値
 ・・・
 mov esp,ebp
 pop ebp
 ret
関数名 endp

のような形式になっていて、もしローカル変数として配列を確保して、それが
バッファオーバーランした書き込みを行った場合、上記の pop ebp で変なアドレス
がebpに入り、retで変なアドレスへ飛ぼうとする。変なアドレスに飛ぼうとしたら
そこで保護例外が起きる確率が高くなる。また、上記の関数の構造は、関数を
呼び出した親の関数でも同じなので、そこでも、祖父の関数へ戻る際、
最後の方で mov esp,ebpという命令が実行される。しかし、今言ったように
ebpに狂ったアドレスが入ってしまっていれば、この命令で esp = ebp
とされようとしたときにセグメンテーション・フォールトが起きる可能性が
高くなる。espへの代入は、保護に関して他のレジスタへの代入とは違う
特別な処理がされており、ss というスタックセグメントの範囲から逸脱していないか、
また、espが4で割り切れる値になっているかどうかのチェックが入る。
それは普通のページング・フォールトのチェックだけよりも調査項目が増えるので
より厳しくなる。