4

共有ライブラリがメモリにマップされると、Linux カーネルは仮想メモリ領域をこのメモリ領域に割り当て、それぞれのパーミッションをマークします。しかし、x86 arch のページ テーブル エントリには実行可能なビットがないことがわかっています。共有ライブラリの関数を呼び出すプログラムに「call *edx」のような呼び出し命令がある場合、Linux カーネルはターゲット アドレスが実行可能かどうかをどのように知ることができますか? 許可が vma リストで互換性がない場合、一般保護違反が発生しますか?

4

2 に答える 2

3

できません。

読み取り許可とは別の実行ページ許可がないアーキテクチャー (/オペレーティング・モード) では、カーネルは、MMU によって検出された障害の結果として、おそらく不正なアドレス実行を検出できません。

于 2013-02-05T20:36:15.177 に答える
0

理論的には、カーネルがメモリ領域オブジェクトのより細かいアクセス許可に基づいて決定できることは正しいですが、そのような決定手順は、(私が推測するに) 定期的なメモリ アクセスを行うページ フォールト ハンドラで行う必要があります。非常に高価です。

代わりに、カーネルは x86 で次の単純化規則を採用します。

  • 読み取りアクセス権は常に実行アクセス権を意味します
  • 書き込みアクセス権は常に読み取りアクセス権を意味します

出典: Linux カーネルについて、第 1 版、205 ページ

于 2016-02-26T19:06:55.950 に答える