Jika fungsi menerima penunjuk untuk data ruang pengguna, Anda harus menggunakan copy_from_user()
untuk menyalin data yang diarahkan ke dari ruang pengguna ke ruang kernel (dan sebaliknya).
Perhatikan bahwa nilai penunjuk itu sendiri diteruskan oleh nilai (seperti semua parameter C), jadi Anda tidak perlu melakukan copy_from_user()
untuk mendapatkan nilai penunjuk sebelum Anda dapat copy_from_user()
data yang ditunjuknya.
Argumen numerik bekerja dengan cara yang sama seperti argumen pointer; dalam istilah C, keduanya skalar. Anda tidak harus menggunakan copy_from_user()
untuk menyalin nilai parameter; yang sudah disalin. Anda hanya perlu menggunakannya untuk menyalin data yang ditunjuk oleh penunjuk yang diteruskan.
Jadi jika Anda memiliki parameter tipe int
, Anda dapat menggunakannya secara langsung. Jika parameter Anda menunjuk ke int
, lalu int
objek akan berada di ruang pengguna, dan Anda perlu menggunakan copy_to_user
untuk menyalin nilai objek itu ke ruang kernel.
Saat pengguna meneruskan data ke ruang kernel, data ini dapat dibagi menjadi beberapa halaman, dan halaman ini bahkan dapat berada dalam memori yang ditukar . Dalam kasus ini, Anda harus menunggu kernel bertukar di halaman dan mendapatkan akses ke halaman tempat data berada. Dalam kasus tipe data dasar (seperti int atau pointer) juga benar bahwa beberapa arsitektur (terutama intel x86) jangan memaksa pengguna untuk menyelaraskan data sehingga bilangan bulat pun dapat dibagi di sekitar batas halaman. Anda dapat memiliki akses ke bagian pertama bilangan bulat Anda, tetapi menunggu bagian kedua ditukar oleh pengelola memori sebelum semuanya diakses.
Anda dapat menyimpan beberapa perjalanan bolak-balik dengan meletakkan semua data pengguna dalam struktur yang penunjuknya diteruskan ke kernel. Anda dapat menyalin_dari_pengguna sebagai blok dan menyimpan akses (dan berisiko diblokir beberapa kali)
Jadi, dan sebagai kesimpulan, gunakan fungsi bahkan untuk tipe dasar , karena jumlahnya banyak. Jangan berasumsi apa pun tentang di mana data pengguna berada saat berjalan dalam mode kernel. Anda memiliki akses ke sana, tetapi alamat virtual kernel dari data pengguna tidak ada hubungannya dengan alamat virtual yang terlihat dalam mode pengguna.