セグメンテーション違反って何ですか?

  • 投稿日:
  • by
  • カテゴリ:



「いまさら聞けない」パターンです。


WindowsならAVですよ。アクセスバイオレーション、アクセス違反例外。


じゃぁ、セグメンテーションのセグメントってなんのこと?という話になるわけです。


AVもSEGVも、ページフォールト時のエラー処理でしかないわけです。


そもそもページフォールトの”フォールト”が失敗という意味ですから、ややこしいのです。


”ページング失敗のエラー処理”。わけわからんでしょう。


ページフォールトは物理メモリに割り当てられていないページへのアクセスが発生したことを検出するために、”わざと”失敗させているのです。


チクタクバンバンで言うと、進む先にレールがないことをあらかじめ調べるのではなく、レールが無い状態になってから、必要なレールがどれかを調べるほうが効率が良いというわけです。


#分岐命令がいつ実行されるかわかったものではないので、あらかじめ準備すると、投機的になりがちなのでしょう。



D


ページフォールトの検出はCPU例外機能ですから、そりゃもういろんな要因で生じるわけです。ざっくり、要因はアドレスの値を見ればわかります。で、OSがアドレスを見て、SEGVにしたり、AVにしたりするわけです。


奇数アドレスにアクセスできないアーキテクチャにおいて、奇数アドレスへのアクセスが発生などはページフォールトではなく、ただのバスエラーというわけですね。しかしまぁそれはアーキテクチャ固有かつOSの実行固有の話になりますから、個別に調べてください、というわけです。


Windows,Linux,OS Xくらいを把握しておけばいいんじゃないですか?でもその知識を組み込み系でふりかざすとこれまた恥をかく原因になるので気をつけたほうがいいですよ、と。