私はOSクラスのプロジェクトを仕上げていますが、データをユーザー空間からカーネルに安全にコピーし、カーネルからユーザー空間に戻すことに関係するいくつかのこと、およびこの情報を適切に破棄する方法を理解できません。
いくつかのシステムコールがあるとします:
//copies data into kernel space
long sys_into(void __user *data, long length);
// copies data into user space
long sys_from(void __user *data, long length);
どちらの場合long length
も、コピーされるバイト数です。
これまでに把握できたこと:
1. ポインター*data
が ではないことを検証しますnull
。
2. 検証するlength < 0
3. 使用する必要があるaccess_ok
. ただし、両方の機能に使用する必要があるのか、long sys_into()
3 のみに使用する必要があるのか はわかりません。 kmalloc(length) を使用してカーネルにコピーするときに、バイト数を割り当て、実際にこのメモリを割り当てることができることを確認します。
4. 最後にcopy_from_user
©_to_user
を使用してデータをコピーします。
これまでのところ、ほとんど情報が見つかりませんでした。1. 「Linux カーネル プログラミング」のソース コードの例(ご指摘のとおり、Linux カーネル開発の例は危険です)。2. http://www.quora.com/Linux-Kernel/How-does-copy_to_user-work
ありがとう !!!