copy_from_user(to、from、bytes)が実際のコピーを行うのはなぜですか?カーネルがユーザースペースデータにアクセスするだけなので、データを移動せずに物理アドレスをカーネルのアドレススペースに直接マッピングできますか?ありがとう、
4 に答える
copy_from_user()
通常、特定のデバイスドライバーを作成するときに使用されます。ここにはバイトの「マッピング」がないことに注意してください。発生しているのは、ユーザースペースにマップされた特定の仮想ロケーションからカーネルスペースのロケーションにあるバイトへのバイトのコピーだけです。これは、カーネルとユーザーの分離を強制し、セキュリティ上の欠陥を防ぐために行われます。カーネルが任意のユーザーメモリの場所にアクセスして読み取りを開始したり、その逆を行ったりすることは決してありません。そのため、syscallの引数と結果は、実際に実行される前にユーザーとの間でコピーされます。
copy_from_user()は、データのコピーを開始する前にいくつかのチェックを行います。ユーザースペースからデータを直接操作することは、スワップアウトされる可能性のある仮想アドレススペースに存在するため、決して良い考えではありません。
http://www.ibm.com/developerworks/linux/library/l-kernel-memory-access/
「この前に、 copy_from_user()が使用される理由を知っておくとよいでしょう」
カーネルはユーザースペースアプリケーションがカーネルメモリに直接アクセスすることを許可しないため、ポイントされたメモリが無効であるか、読み取り中に障害が発生した場合、ユーザースペースアプリケーションを使用するだけでカーネルがパニックになります。
「それが理由です!!!!!!」
したがって、copy_from_userを使用している間は、ユーザーにエラーが発生する可能性があり、カーネル機能には影響しません。
それは余分な努力ですが、カーネルの安全で安全な操作を保証します
システムコールの実装における主要な要件の1つは、引数として渡されたユーザーパラメータポインターの有効性を確認することです。ユーザーポインターはさまざまな方法でトリックを実行できるため、カーネルはユーザーポインターを盲目的に追跡しないでください。主な懸念事項は次のとおりです。1。他のプロセスアドレス空間に入ることができないように、そのプロセスアドレス空間からのポインタである必要があります。2.ユーザースペースからのポインターである必要があります。カーネルスペースポインターをだましてはいけません。3.メモリアクセス制限をバイパスしないでください。
これが、copy_from_user()が実行される理由です。これはブロックされており、ページフォールトハンドラーがページをスワップファイルから物理メモリに移動できるようになるまでプロセスはスリープします。