0

実験的な理由から、OS X 10.8.2 (x86 LP64 カーネルを実行) ボックスでスワッピングを完全に無効にしました。

アプリからシステム コールを実行すると、アドレス空間のレイアウトはどのようになりますか? つまり、アドレス空間全体が配線されているため (スワッピングなし)、カーネルから有効なユーザー アドレスに決定論的にアクセスし、そのアドレスを含むページがメモリに常駐していると想定できますか?

私の理解はイエスですが、ユーザー空間が64ビットか32ビットかに関係なく、OS Xカーネルは常に32ビットモードで実行され、プロセスアドレス空間全体が切り替えられ、4G全体がカーネルによって使用されることを読んだ後、少し混乱しています。これは 10.8.2 に適用されますか? この場合、カーネル空間から有効なユーザー空間アドレスにアクセスできなくなりますよね?

4

2 に答える 2

1

カーネル空間がアドレス空間の先頭 (つまり 0xffffff8000xxxxxx) に予約されている 64 ビット モードでも、スワップがない場合でも、代わりに動作するカーネル モードでない限り、ユーザー空間メモリにアクセスできません。そのユーザー空間プロセス。その理由は、アドレスがすべて仮想であり、どの物理ページがどのプロセスに属しているかを MMU に伝えるために CR3 (制御レジスタ) に依存しているためです。したがって、原則としてカーネル モードではすべてのメモリにアクセスできますが、CR3 がないと、どのページがどのプロセスに属しているかを把握できません。

したがって、システムコール内で、ユーザーモードメモリの内外にデータを移動できます(Linuxのcopy_[from/to]_userと同様に、そのためにcopyin/copyoutがあります)-ページが実際にいつものように交換。しかし、それはアクティブなユーザー空間メモリ、つまりアクティブなプロセスに対してのみです。確かに、他のプロセスの CR3 にアクセスするためのハックはありますが、(高品質のマルウェアを作成している場合を除いて) お勧めできません。

于 2013-09-26T03:59:34.863 に答える