1. ホーム
  2. linux

[解決済み] Linuxカーネルのcopy_from_userは、内部でどのように動作しているのでしょうか?

2022-03-01 10:23:46

質問

具体的にはどのように copy_from_user() 関数は、内部でどのように動作しているのでしょうか?カーネルがユーザーメモリ空間にアクセスする権限を持っていることを考えると、バッファを使用したり、メモリマッピングを行ったりするのでしょうか?

解決方法は?

の実装は copy_from_user() は、アーキテクチャに大きく依存します。

x86とx86-64では、ユーザー空間のアドレスから直接読み込み、カーネル空間のアドレスに書き込むだけで、SMAP(Supervisor Mode Access Prevention)が設定されていれば一時的に無効化する。 これのやっかいなところは copy_from_user() のコードは特殊な領域に配置され、その領域で障害が発生したときにページ障害ハンドラが認識できるようになっています。 メモリ保護フォールトは copy_from_user() は、他のプロセスコンテキストのコードによって引き起こされた場合のようにプロセスを殺すことも、割り込みコンテキストで発生した場合のようにカーネルをパニックにすることもなく、単に -EFAULT を呼び出し元に返します。