メモリに直接アクセスしようとした後、カーネルパニックが発生したため、興味があります(その後、これらの関数を見つけました)。
質問する
26784 次
2 に答える
33
これらの関数はいくつかのことを行います:
- 提供されたユーザー空間ブロックが完全にアドレス空間のユーザー部分内にあるかどうかを確認します (
access_ok()
)。これにより、ユーザー空間アプリケーションがカーネルにカーネル アドレスの読み取り/書き込みを要求するのを防ぎます。 EFAULT
いずれかのアドレスにアクセスできない場合はエラーを返し、カーネルをクラッシュさせる代わりにエラーをユーザー空間に返すことができます (ユーザーメモリアクセス関数の1つ);- たとえば、仮想的にタグ付けされたキャッシュを使用するアーキテクチャで一貫性を確保したり、SMAP などの保護を無効にしたり、S/390 などの個別のユーザー/カーネル アドレス空間を持つアーキテクチャでアドレス空間を切り替えたりするなど、アーキテクチャ固有の魔法が可能になります。
于 2012-10-01T01:27:45.700 に答える
13
これらの関数は、メモリにアクセスできるかどうかをチェックします。カーネルがアクセスできないアドレスに直接アクセスしようとすると、パニックが発生します。さらに、カーネルとユーザーのアドレス空間が異なる場合があります...ユーザーアドレス空間の有効なアドレスはカーネルでアクセスできない場合があり、アクセスできる場合は、ユーザーのものではなくカーネルのものを指している可能性があります。
詳しくは、 https://developer.ibm.com/articles/l-kernel-memory-accessを参照してください。
歴史的なメモ: 昔々、カーネルがユーザーアドレス空間の一部になるように設計されたオペレーティングシステムがあり、それらのシステムでは、カーネルは常にユーザー空間に直接アクセスできました。そのようなシステムはまだあるかもしれませんが、最新の Linux はそうではありません。もちろん、カーネルアドレス空間の一部であるユーザープロセスのメモリは、常に実装のオプションであり、copy_to_user と copy_from_user を大幅に高速化できます。
于 2012-10-01T01:13:54.730 に答える