アカウント名:
パスワード:
>まともなOSとCPUはこれを検知してSIGSEGVを発行する。
OSがレジスタ監視してたらそれって効率低下とかならないんですか?この辺の知識まったくないので、結構驚きました。
そういうfaultが発生したときのシステムの挙動ってどうなるの?
1.CPUは動作を停止する2.CPUはエラーの割り込み発生するが、実は割り込み処理のコードが無くてreturnで戻ってくるだけ3.ちゃんと割り込み処理のコードがあってOSはエラー発生を検知するが、リカバリーの処理はしない(ログを取るだけ)4.OSは割り込みを検知したら、アプリケーションレベルでの何らかの誤り訂正等の処理をする
たぶん3か4じゃないかと思うのだが......
例外の種類とOSによる。
管理領域違反とかは、カーネルに処理が戻った時にレジスタとかバックトレースだけ回収して問答無用でアプリケーションを落とすのが普通。組み込みとかだと、例外通知だけして復帰も有り得るかもしれん。
多分一番身近な例外は、キャッシュミス(TLBミス)とかページフォルトで、この場合はカーネル側でデータのロードを行って、そのまま処理に戻るのが普通。
例外(シグナル)を捕捉する処理をアプリケーションが持ってればそこに飛んでくだけで、メモリアクセス程度では問答無用でアプリケーションを落とすような事は少ないですよ。例外を捕捉しない場合もOS等の提供するデフォルトの例外処理が自殺なだけの事も多い。
管理領域違反つってんのに…
例えばCで*((int*)rand())=0;すると例外処理してても強制終了される場合があるという主張ですか?ユーザモードのメモリ空間にはカーネルモードのアクセス禁止なデータなんてマップされませんよ。マップ済みならアクセスフラグに違反したら例外出るけど補足できるし、未マップ領域は当然例外で補足できます。
たとえ乱数で埋まった不正命令まみれのメモリ領域にジャンプしても、例外機構自体を破壊したり強制終了処理を呼ばなければまず落ちませんて。
敢えてユーザ空間にマップしといてアプリの例外処理に飛ぶ前に握りつぶすOSはあるのかもしれませんが、どの道アクセス出来ないのは変わらないし悪意の立証も出来ない。意地が悪いだけで意味が無いでしょう。
だから例外の種類とOSによる、って書いてあるのに(俺が書いたんじゃないが)、なんでunixのモデルから頭が離れられないの
>そういうfaultが発生したときのシステムの挙動ってどうなるの?
SIGSEGV。
底抜けに親切な御仁だ
OSがレジスタを監視しているのではなく、予めメモリの領域ごとにアクセス保護を設定しておいてあって、設定に反するアクセスを行うと例外(割込)が発生するということになります。
jzkey さんのコメント(#2850641)にある『構造体がページの末尾にあったときに』というのは、ページを跨がない場合は設定に反することなくアクセス出来てしまうので例外が発生しないということです。
詳しくはMMUについて勉強すると良いと思います。
レジスタに値を取り込む為の「メモリアクセス」で例外が起きます。メモリアクセス時に仮想アドレスから物理アドレスに変換したりする処理の中で引っかかるはず。CPUが自動的に行う処理の中でOSから指定された条件を満たせばCPUが例外処理に移行します。予め設定された条件を見たさなければ例外処理は起きないので、そこまでの効率低下は起こりません。逆に、こうして処理される例外の中でも時間がかかる代表がディスクアクセスを伴うページフォルト。
仮想アドレスから物理アドレスに変換するのはハードで処理されるとは言え若干の効率低下を伴うはずだけど、仮想アドレスの利点の方が大きいから組み込み以外ではそんなこと気にせずバンバン使う。その辺りの機能はメモリ保護と絡めて使うこともできるから、セキュリティ的にも美味しい。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
にわかな奴ほど語りたがる -- あるハッカー
OSってレジスタ監視してんだ。 (スコア:0)
>まともなOSとCPUはこれを検知してSIGSEGVを発行する。
OSがレジスタ監視してたらそれって効率低下とかならないんですか?
この辺の知識まったくないので、結構驚きました。
Re:OSってレジスタ監視してんだ。 (スコア:3, 参考になる)
Re: (スコア:0)
そういうfaultが発生したときのシステムの挙動ってどうなるの?
1.CPUは動作を停止する
2.CPUはエラーの割り込み発生するが、実は割り込み処理のコードが無くてreturnで戻ってくるだけ
3.ちゃんと割り込み処理のコードがあってOSはエラー発生を検知するが、リカバリーの処理はしない(ログを取るだけ)
4.OSは割り込みを検知したら、アプリケーションレベルでの何らかの誤り訂正等の処理をする
たぶん3か4じゃないかと思うのだが......
Re:OSってレジスタ監視してんだ。 (スコア:1)
例外の種類とOSによる。
管理領域違反とかは、カーネルに処理が戻った時にレジスタとかバックトレースだけ回収して問答無用でアプリケーションを落とすのが普通。
組み込みとかだと、例外通知だけして復帰も有り得るかもしれん。
多分一番身近な例外は、キャッシュミス(TLBミス)とかページフォルトで、この場合はカーネル側でデータのロードを行って、そのまま処理に戻るのが普通。
Re: (スコア:0)
例外(シグナル)を捕捉する処理をアプリケーションが持ってればそこに飛んでくだけで、
メモリアクセス程度では問答無用でアプリケーションを落とすような事は少ないですよ。
例外を捕捉しない場合もOS等の提供するデフォルトの例外処理が自殺なだけの事も多い。
Re: (スコア:0)
管理領域違反つってんのに…
Re: (スコア:0)
例えばCで*((int*)rand())=0;すると例外処理してても強制終了される場合があるという主張ですか?
ユーザモードのメモリ空間にはカーネルモードのアクセス禁止なデータなんてマップされませんよ。
マップ済みならアクセスフラグに違反したら例外出るけど補足できるし、未マップ領域は当然例外で補足できます。
たとえ乱数で埋まった不正命令まみれのメモリ領域にジャンプしても、
例外機構自体を破壊したり強制終了処理を呼ばなければまず落ちませんて。
敢えてユーザ空間にマップしといてアプリの例外処理に飛ぶ前に握りつぶすOSはあるのかもしれませんが、
どの道アクセス出来ないのは変わらないし悪意の立証も出来ない。意地が悪いだけで意味が無いでしょう。
Re: (スコア:0)
だから例外の種類とOSによる、って書いてあるのに(俺が書いたんじゃないが)、なんでunixのモデルから頭が離れられないの
Re: (スコア:0)
>そういうfaultが発生したときのシステムの挙動ってどうなるの?
SIGSEGV。
Re:OSってレジスタ監視してんだ。 (スコア:1)
底抜けに親切な御仁だ
Re: (スコア:0)
OSがレジスタを監視しているのではなく、予めメモリの領域ごとにアクセス保護を設定しておいてあって、設定に反するアクセスを行うと例外(割込)が発生するということになります。
jzkey さんのコメント(#2850641)にある『構造体がページの末尾にあったときに』というのは、ページを跨がない場合は設定に反することなくアクセス出来てしまうので例外が発生しないということです。
詳しくはMMUについて勉強すると良いと思います。
Re: (スコア:0)
レジスタに値を取り込む為の「メモリアクセス」で例外が起きます。
メモリアクセス時に仮想アドレスから物理アドレスに変換したりする処理の中で引っかかるはず。
CPUが自動的に行う処理の中でOSから指定された条件を満たせばCPUが例外処理に移行します。
予め設定された条件を見たさなければ例外処理は起きないので、そこまでの効率低下は起こりません。
逆に、こうして処理される例外の中でも時間がかかる代表がディスクアクセスを伴うページフォルト。
仮想アドレスから物理アドレスに変換するのはハードで処理されるとは言え若干の効率低下を伴うはずだけど、
仮想アドレスの利点の方が大きいから組み込み以外ではそんなこと気にせずバンバン使う。
その辺りの機能はメモリ保護と絡めて使うこともできるから、セキュリティ的にも美味しい。