セグメント・フォルトが発生すると、割り当てられていないか保護されていないメモリにアクセスすることを意味します。しかし、カーネルまたはCPUはどのようにそれを知っていますか?それはハードウェアによって実装されていますか?どのデータ構造がCPUをルックアップする必要がありますか?メモリのセットが割り当てられたら、どのデータ構造を変更する必要がありますか?カーネルはセグメント障害についてどのように知っていますか?
答えて
詳細はどのプラットフォームについて言及しているかによって異なりますが、通常、MMUは無効なメモリアクセスを試みると例外(割り込み)を生成し、カーネルはこれを割り込みサービスの一部として処理しますルーチン。
一般に、segフォールトは、CPUが物理的にアドレスできないメモリにプロセスがアクセスしようとしたときに発生します。メモリアクセス違反についてOSに通知するのはハードウェアです。その後、OSカーネルは、例外を引き起こしたプロセスにシグナルを送信します。
質問の第2部分に答えるには、ハードウェアとOSによって異なります。典型的なシステム(すなわちx86)では、セグメント相対アドレスを仮想アドレスに変換するために、CPUはセグメントレジスタを(グローバルまたはローカルの記述子テーブルを介して)参照します(これは通常、現代のx86オペレーティングシステム)、次に(MMUは実際にこのビットを実行しますが、x86ではCPUの一部です)、ページテーブルを参照してその仮想アドレスを物理アドレスに変換します。存在するとマークされていないページが見つかると(現在のビットがページディレクトリに設定されていない)、例外が発生します。 OSがこの例外を処理すると、あきらめたり(間違いやパニックを起こしたときに表示されるsegfaultシグナルを引き起こす)、ページテーブルを修正してメモリを有効にし、例外から続行します。通常、OSには、有効なページとそのページの入手方法を示す帳簿があります。これはデマンドページングがどのように発生するかです。
すべてが特定のアーキテクチャに依存しますが、ページ仮想メモリを持つすべてのアーキテクチャは基本的に同じように動作します。メモリには、割り当てられた各ページの仮想から物理へのマッピングを記述するデータ構造がメモリ内にあります。すべてのメモリアクセスに対して、CPU/MMUハードウェアはこれらのテーブルを検索してマッピングを検索します。これは恐ろしく遅いですが、速度を上げるためにハードウェアキャッシュがあります。
- 1. セグメント障害ポインタ
- 2. memcpy tcpソケットのセグメント障害
- 3. WCFの障害 - どのような障害ですか?
- 4. Linuxカーネルはブート時にどのドライバをロードするのかをどのように知っていますか?
- 5. カーネルはファイルが閉じていることをどのように知っていますか
- 6. func2はどのようにコンテキストを知っていますか?
- 7. は、どのように知っていますか?
- 8. Googleアナリティクスの動的セグメントはどのように遡っていますか?
- 9. crossdomain.xmlポリシーファイルをロードするときのネットワーク障害についてどうしたらいいですか?
- 10. 私のビューはDataContextのないPresenterについてどのように知っていますか?
- 11. Linuxカーネルはドライバのファームウェアを探す場所をどのように知っていますか?
- 12. Wordpress Taxonomy - どのようにobject_idを知っていますか?
- 13. SOAPによるWCF障害
- 14. 私はjoomlaについて何を知っていますか?
- 15. ScrollViewで起こっているタッチイベントについて、ギャラリーにどのように通知できますか?
- 16. ワンセグ障害やって、次のコードは、最後の行にワンセグ障害を取得<string>
- 17. どのように知っている、libxsltはサポートEXSLTか
- 18. ネットワーク障害のコードを処理して復帰するにはどうすればいいですか?
- 19. カーネルは物理ページについて2つの異なるプロセスによってどのように分かち合っているかを知っていますか?
- 20. WindowsバッチファイルIF障害 - 30000000000000はどのようにして40000000000になりますか?
- 21. より良いホスティングでのデータベース障害
- 22. XNAのテーブルレイアウトモジュールについて知っていますか?
- 23. 誰かが "perlfiddle"というサービスについて知っていますか?
- 24. システムスクロールバーの現在の幅はどのように知っていますか?
- 25. リンカーは、リンクするアーカイブをどのように知っていますか?
- 26. Maven2はプラグインの場所をどのように知っていますか?
- 27. eclipseはプロジェクトの名前をどのように知っていますか?
- 28. プロセスはバックグラウンドの状態をどのように知っていますか?
- 29. チェックボックスはテキストビューとの関連をどのように知っていますか
- 30. UIPageControl UIControlEventValueChanged - 以前の値はどのように知っていますか?
何が無効なメモリですか? – venuswu
"無効なメモリ*アクセス*"は、いくつかの理由で無効になります。読み取り専用メモリに書き込もうとしているか、実行不可能なメモリでコードを実行しようとしているか、関連付けられたページが割り当てられていないアドレスを読み書きしようとしていますか? –