
説明
アドレス空間には仮想と物理の2種類があります。物理モデルでは(通常はカーネルによって使用されます)メモリは制限されており、各アドレスは物理アドレスに対応します。
仮想メモリはプロセスによって使用されます。制限はありません(ポインタサイズによるものを除く)より多くのメモリを取得するには、プログラムは単にそれを要求するだけです(請求できる金額は無視)各アドレスは異なる物理アドレスにマップされます。
これにより、プロセスが RAM から読み取れる内容が制限されます。
問題
理由は、システムコールがring0を使用するが、同時に(少なくともLinuxでは)プロセス状態が割り込み可能に更新され、システムコールが仮想アドレス空間を使用していることが示唆される。
私の理解では、CPUリングはアドレス空間ではなく特権命令に関するものである。(MMU関連なので)。
つまり、境界外の読み取り(脆弱性のため)カーネル コード内のシステム コールの実行中に発生します。他のプロセスからメモリを返すことはできますか?
答え1
カーネル モード コードは、さまざまなプロセスのアドレス空間をスヌーピングするなど、ほぼすべての操作を実行できます。
はい、カーネルモードのコードは仮想アドレス空間を使用します。カーネル管理する物理アドレス空間ですが駆け込む物理アドレス空間。
ユーザー モードでは、物理アドレスをアサートする方法がないため、RAM から必要なものを何も読み取ることができません。
カーネル モードはアドレス変換を有効にして実行されるため、カーネル モード コードも仮想アドレスのみをアサートできます。ただし、k モード コードは、ページ テーブル エントリを設定して、アクセスする可能性のある任意の物理アドレスに変換する仮想アドレスを定義できます。
答え2
カーネルによって呼び出されるシステム コールは物理アドレス空間を使用します。
プロセスによって呼び出されるシステム コールは仮想アドレス空間を使用します。