GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara kerja copy_from_user dari kernel Linux secara internal?

Penerapan copy_from_user() sangat bergantung pada arsitektur.

Pada x86 dan x86-64, itu hanya membaca langsung dari alamat userspace dan menulis ke alamat kernelspace, sambil menonaktifkan sementara SMAP (Supervisor Mode Access Prevention) jika dikonfigurasi. Bagian yang sulit adalah copy_from_user() kode ditempatkan ke dalam wilayah khusus sehingga penangan kesalahan halaman dapat mengenali ketika terjadi kesalahan di dalamnya. Kesalahan perlindungan memori yang terjadi di copy_from_user() tidak mematikan proses seperti jika dipicu oleh kode konteks proses lainnya, atau membuat panik kernel seperti jika terjadi dalam konteks interupsi - ini hanya melanjutkan eksekusi di jalur kode yang mengembalikan -EFAULT kepada penelepon.


mengenai "bagaimana dengan copy_to_user karena kernel mengirimkan alamat ruang kernel, bagaimana proses ruang pengguna dapat mengaksesnya"

Proses ruang pengguna dapat mencoba mengakses alamat apa pun. Namun, jika alamat tidak dipetakan dalam proses ruang pengguna (yaitu dalam tabel halaman dari proses itu) atau jika ada masalah dengan akses seperti upaya menulis ke lokasi read-only, maka kesalahan halaman dihasilkan. Perhatikan bahwa setidaknya pada x86, setiap proses memiliki semua ruang kernel yang dipetakan dalam 1 gigabyte terendah dari ruang alamat virtual proses itu, sedangkan 3 gigabyte atas dari total ruang alamat 4GB (Saya menggunakan di sini klasik 32-bit case) digunakan untuk teks proses (yaitu kode) dan data. Salinan ke atau dari ruang pengguna dijalankan oleh kode kernel yang dijalankan atas nama proses dan sebenarnya itu adalah pemetaan memori (yaitu tabel halaman) dari proses itu yang sedang digunakan selama penyalinan. Ini terjadi saat eksekusi dalam mode kernel - yaitu mode istimewa/pengawas dalam bahasa x86. Dengan asumsi kode ruang pengguna telah melewati lokasi target yang sah (yaitu alamat yang dipetakan dengan benar dalam ruang alamat proses itu) agar data disalin ke, copy_to_user , dijalankan dari konteks kernel biasanya dapat menulis ke alamat/wilayah tersebut tanpa masalah dan setelah kontrol kembali ke pengguna, ruang pengguna juga dapat membaca dari penyiapan lokasi ini dengan proses itu sendiri untuk memulai. Detail yang lebih menarik dapat dapat ditemukan di bab 9 dan 10 dari Memahami Kernel Linux, Edisi ke-3, Oleh Daniel P. Bovet, Marco Cesati. Secara khusus, access_ok() adalah pemeriksaan validitas yang diperlukan tetapi tidak cukup. Pengguna masih dapat mengirimkan alamat yang bukan milik ruang alamat proses. Dalam hal ini, pengecualian Page Fault akan terjadi saat kode kernel mengeksekusi penyalinan. Bagian yang paling menarik adalah bagaimana penangan kesalahan halaman kernel menentukan bahwa kesalahan halaman dalam kasus seperti itu bukan karena bug pada kode kernel melainkan alamat buruk dari pengguna (terutama jika kode kernel yang dimaksud adalah dari modul kernel dimuat).


Linux
  1. Cara Mencari Web Dari Terminal Di Linux

  2. Bagaimana kernel Linux menentukan urutan panggilan __init?

  3. Bagaimana cara Linux mempertahankan kendali CPU pada mesin single-core?

  1. Bagaimana Cara Kerja Sticky Bit?

  2. Bagaimana cara kerja perintah 'ls' di Linux/Unix?

  3. Bagaimana cara menghitung penggunaan CPU dari suatu proses oleh PID di Linux dari C?

  1. Bagaimana cara kerja debugger di Linux?

  2. Bagaimana saya bisa memesan satu blok memori dari kernel Linux?

  3. Apakah kernel Linux 3.x menggunakan penjadwal proses CFS?