21

メモリに直接アクセスしようとした後、カーネルパニックが発生したため、興味があります(その後、これらの関数を見つけました)。

4

2 に答える 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 に答える