10

ある種のキャラクター デバイスを実装しましたが、copy_from_user 関数のヘルプが必要です。

私は構造を持っています:

struct  my_struct{

int a;

int *b;
};

ユーザー空間で初期化し、「書き込み」関数を使用して my_struct へのポインターを char デバイスに渡します。カーネルのスペース キャラクター デバイスの 'write' 関数では、*char からこの種の構造体にキャストします。kmalloc を使用して構造体にいくらかのメモリを割り当て、それに対して実行copy_from_user します。

単純な「int a」には問題ありませんが、b が指す値ではなく、b 値のポインター (アドレス) のみをコピーするため、現在カーネル空間にいて、ユーザー空間メモリを指すポインターを使用しています。 . これは正しくありません。ユーザー空間ポインターに直接アクセスするべきではありません copy_from_user。構造体のすべてのポインターにアクセスしてから、関数を使用して「読み取り」関数のすべてのポインターをコピーする 必要がありcopy_to_userますか?

4

2 に答える 2

14

copy_from_userポインタの取得方法に関係なく、カーネル空間からユーザー空間メモリにアクセスするには、常に and similar を使用する必要があります。bはユーザー空間メモリへのポインタであるため、アクセスするには を使用する必要がありますcopy_from_user

これらの関数は、次の 2 つの重要な追加タスクを実行します。

  1. ポインターがカーネル空間ではなくユーザー空間を指していることを確認します。このチェックがないと、ユーザー空間プログラムは、通常のセキュリティをバイパスして、カーネル メモリの読み取りまたは書き込みを実行できる可能性があります。
  2. ページ フォールトを正しく処理します。通常、カーネル モードでページ フォールトが発生すると、OOPS またはパニックが発生します。一連copy_*_userの関数には、すべてが正常であることを PF ハンドラーに伝える特別なオーバーライドがあり、フォールトは通常どおり処理する必要があります。また、障害が IO によって解決できない場合 (つまり、通常は aSIGSEGVまたはが発生する場合SIGBUS)、代わりにエラー コードを返して、呼び出し元が でユーザー空間に戻る前に必要なクリーンアップを実行できるようにし-EFAULTます。
于 2009-11-08T23:52:24.873 に答える
6

あなたの推測は正しいです。value にアクセスする必要がある場合は*b、 を使用する必要がありますcopy_from_user(またcopy_to_user、ユーザー プロセスで値を更新する必要があります)。

于 2009-11-08T23:52:04.083 に答える