カーネルがプロセス自体と同じ仮想アドレス空間にマップされるときになぜ必要なのですかcopy_from_user()
?copy_to_user()
学習目的のためにいくつかの(おもちゃ)カーネルモジュールを開発した後、私はこの事実copy_from_user()
とcopy_to_user()
ユーザースペースバッファからユーザースペースバッファにデータをコピーする必要があることにすぐに気づきました。そうしないと、誤ったアドレスに関連するエラーが原因で競合が発生する可能性があります。
しかし、0x1fffff
仮想アドレスがユーザ空間バッファを指している場合、そのアドレスがカーネルで無効であるのはなぜですか?カーネルは同じ仮想アドレス空間にあるため、0x1fffff
同じ物理メモリにマップされます。
ベストアンサー1
アドレス空間マッピングは一部(すべてではありません!)アーキテクチャでは同じですが、同じアーキテクチャでも保護レベルは異なります。copy_from_user
などは3つの主な目的を果たします。
- 読み取りまたは書き込みメモリの権限が、ユーザースペースで実行されているプロセスが読み取りまたは書き込みを許可することを確認します。これは、プロセスがプロセスが実行できないメモリにアクセスするようにカーネルをだまさないようにします。
- たとえば、要求されたアドレスが現在マップされていない場合(ゼロページまたは置換ページを考慮)、エラーはカーネルの競合から保護するために特定のエラー処理を許可します。
- 自己保護機能により、コアが転倒しないようにします。例えば 界面活性剤またはカーネル固有のアドレス空間(S / 390)。
一部のアーキテクチャでは、これらの機能がショートカットを使用できるようにするメモリレイアウトを使用しています。例えば物理メモリの直接マッピングを使用しますが、そうではないと仮定することはできません。