GNU/Linux >> Belajar Linux >  >> Linux

copy_to_user() dan copy_from_user() untuk tipe data dasar

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.


Linux
  1. Dasar-dasar pengguna dan basis data MySQL

  2. tumpukan kernel dan tumpukan ruang pengguna

  3. Di mana Google Chrome untuk Linux menyimpan data khusus pengguna?

  1. Panduan Bash For Loop dan Contohnya

  2. Mengutip Di Ssh $host $foo Dan Ssh $host Jenis Konstruksi "Sudo Su User -c $foo"?

  3. File Pseudo Untuk Data Sementara?

  1. Kapan Dd Cocok Untuk Menyalin Data? (atau, Kapan Read() Dan Write() Partial)?

  2. Mengapa Disarankan Membuat Grup Dan Pengguna Untuk Beberapa Aplikasi?

  3. Manajemen Pengguna Linux Dasar