セグメント・フォルトが発生すると、割り当てられていないか保護されていないメモリにアクセスすることを意味します。しかし、カーネルまたは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. RESTはサービススキーマについてどのように知っていますか?
- 5. Linuxカーネルはブート時にどのドライバをロードするのかをどのように知っていますか?
- 6. OrientDB - スキーマの障害についてDBにアクセスできない
- 7. カーネルはファイルが閉じていることをどのように知っていますか
- 8. Webサーバーの障害とはどういう意味ですか?
- 9. は、どのように知っていますか?
- 10. xavier_initializer()はアクティベーションをどのように知っていますか?
- 11. func2はどのようにコンテキストを知っていますか?
- 12. セグメント障害が発生するのはなぜですか?
- 13. Googleアナリティクスの動的セグメントはどのように遡っていますか?
- 14. crossdomain.xmlポリシーファイルをロードするときのネットワーク障害についてどうしたらいいですか?
- 15. カーネルがどのようにユーザスペース内にネットリンクが存在するかを知っていますか?
- 16. Linuxカーネルはドライバのファームウェアを探す場所をどのように知っていますか?
- 17. 私のビューはDataContextのないPresenterについてどのように知っていますか?
- 18. Narayana/XAはTM障害からどのように復旧しますか?
- 19. ハードウェア障害に対してRedisをセットアップするにはどうすればよいですか?
- 20. Wordpress Taxonomy - どのようにobject_idを知っていますか?
- 21. セグメンテーション障害:11ワンセグ障害の原因を見つけるために、GDBを用いて動的3Dアレイパラメータ
- 22. jsr 352チェックポイントは、障害/ロールバックシナリオでどのように機能しますか?
- 23. 内部関数はこのパラメータについてどのように知っていますか?
- 24. ExceptionクラスはArithmeticExceptionクラスについてどのように知っていますか?
- 25. SOAPによるWCF障害
- 26. 私はどのようにしてサービスのステータスを知っていますか?
- 27. Jackson FasterXML:Springはjsonオブジェクトをどのようにして知っていますか?
- 28. どのように知っている、libxsltはサポートEXSLTか
- 29. ネットワーク障害のコードを処理して復帰するにはどうすればいいですか?
- 30. 値が署名されているかどうかをGDBはどのように知っていますか?
何が無効なメモリですか? – venuswu
"無効なメモリ*アクセス*"は、いくつかの理由で無効になります。読み取り専用メモリに書き込もうとしているか、実行不可能なメモリでコードを実行しようとしているか、関連付けられたページが割り当てられていないアドレスを読み書きしようとしていますか? –