Modul / Bangunan / Make / Pengujian / POC / Latihan / Catatan / Penafian / Lisensi / Buku / Tautan
Linux Kernel Module (LKM) Sandbox adalah kumpulan modul yang berbeda untuk belajar, menemukan, dan bereksperimen dengan pengembangan modul kernel Linux. Tujuan dari repositori ini juga untuk mempraktikkan pengembangan di dalam kernel Linux dan mempelajari konsep -konsep lain -lain sebelum melanjutkan untuk mengirimkan tambalan pertama ke kernel.
Sebagian besar modul menggambarkan satu konsep dan menunjukkan cara menggunakan API kernel. Beberapa modul menggabungkan lebih dari satu konsep untuk menyajikan bagaimana konsep bekerja bersama. Misalnya modul LKM_DEVICE mengakses perangkat karakter dan menyimpan nomor utamanya di /Proc. Atau modul LKM_MEM mengekspos informasi memori /swap dengan file di /proc juga.
Saya harap ini bisa berharga bagi pengembang lain yang mencoba mendekati kernel Linux.
| TIDAK. | Modul | Sumber | Keterangan |
|---|---|---|---|
| 1 | Debugf LKM | lkm_debugfs.c | Modul yang Menampilkan Cara Menggunakan Debugging Filesystem Debugfs |
| 2 | Perangkat LKM | lkm_device.c | Modul yang menunjukkan cara beroperasi dengan perangkat karakter dan menyimpan informasi perangkat di /proc |
| 3 | Nomor perangkat LKM | lkm_device_numbers.c | Menggambarkan nomor perangkat yang dialokasikan secara statis dan dinamis |
| 3 | Memori lkm | lkm_mem.c | Modul Mengekspos Informasi Memori dan Pertukaran ke /Proc |
| 4 | Perangkat berbasis memori LKM | lkm_mev.c | Driver untuk perangkat karakter berbasis memori, berdasarkan pada tingkat tertentu pada scull, dikembangkan dalam buku driver perangkat Linux, Bab 3 |
| 5 | Parameter LKM | lkm_parameters.c | Modul untuk melewati parameter dari pengguna- ke kernelspace |
| 6 | Lkm printk cantik | lkm_pp.c | Modul untuk menguji integrasi Pretty-Printk |
| 7 | LKM Proc | lkm_proc.c | Modul Mengakses /Proc Filesystem Menggunakan Sequential I /O |
| 8 | Proses lkm | lkm_process.c | Mengakses dan Mencetak Informasi Proses Saat Ini |
| 9 | LKM Sandbox | lkm_sandbox.c | Modul kotak pasir untuk percobaan yang berbeda |
| 10 | Kerangka lkm | lkm_skeleton.c | Modul kerangka untuk perancah modul baru yang lebih cepat |
Saat mengkloning untuk pertama kalinya, silakan klon juga submodul dengan --recurse-submodules untuk mendapatkan printk yang cantik juga.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
Untuk menjalankan semua tes yang tersedia, termasuk pemuatan/pembongkaran dasar dan semua tes konsep tambahan ..
make testPengujian dengan memuat, membongkar dan mengeluarkan buffer cincin kernel (sudo akan meminta izin root).
make test-module name= < module-name > Tes tambahan untuk perangkat kotak pasir termasuk modul pemuatan, mengumpulkan nomor perangkat utama dari /proc, membuat perangkat dan membandingkan pesan akhir baik menjalankan target makefile dengan make test-device atau menjalankan perintah berikut.
Untuk membuat perangkat karakter, nomor utama diperlukan dan dapat diperoleh dengan mengikat file /proc /lkm_device_major. Jumlah utama ini ditulis untuk buffer cincin kernel juga. Dimungkinkan untuk memberikan nomor utama ini menggunakan parameter modul param_major_num dan memuat modul ini seperti sudo insmod lkm_device.ko param_major_num=241 (pada saat ini alokasi statis ini tampaknya tidak dapat diandalkan. Registrasi yang gagal pada operasi itu tidak ada yang gagal.
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device Tes tambahan untuk akses kotak pasir ke /proc termasuk memuat modul, menguji jika file di dalam /proc ada dan mengeluarkan file itu. Entah menjalankan target target Makefile dengan make test-proc atau beberapa perintah berikut:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc Untuk pengujian tambahan untuk parameter lulus ke modul LKM_PARAMETERS menjalankan target target Makefile dengan make test-parameters . Ini akan memuat/membongkar modul dan membandingkan nomor parameter dan pesan yang disahkan saat memuat modul dengan nilai yang dibaca di sistem file/sys (/sys/module/lkm_parameters/parameter/*). Atau jalankan perintah berikut.
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parametersSaat triaging, debugging dan bekerja dengan bug dan masalah yang bisa berguna untuk bereksperimen dengan beberapa kode dan menulis POC untuk membuktikan beberapa pernyataan atau untuk menjawab pertanyaan. Berikut ini adalah kumpulan POC semacam itu yang menindaklanjuti petunjuk untuk membuktikan pernyataan, ide, dan pertanyaan yang baru -baru ini saya temui.
| Mengajukan | Keterangan | Motivasi |
|---|---|---|
| membandingkan-iopl-ioperm.c | Membandingkan izin I/O yang diberikan oleh IOPL dan IOPERM | BUG 205317 - IOPL (2) - Tingkat hak istimewa ditetapkan per -proses atau per -utamanya? |
| izin-revisited.c | Bagaimana izin I/O diberikan saat menggunakan Clone, Fork, Execve atau Pthread? | BUG 205317 - IOPL (2) - Tingkat hak istimewa ditetapkan per -proses atau per -utamanya? |
Untuk pemahaman yang lebih baik tentang konsep di ruang kernels, perlu untuk meninjau dan melatih dasar -dasar fundamental C dan perpustakaan standar. Di samping dapat meningkatkan pemahaman, dimungkinkan untuk membandingkan pendekatan. Sebagian besar dasar-dasar itu adalah tingkat rendah, dimulai dengan file I/O dan dapat dilihat sebagai sumber pendamping. Tidak pernah buruk untuk melatih sesuatu, tetapi kadang -kadang sedikit memalukan untuk mengakui harus melatih hal -hal seperti itu :)
| Mengajukan | Konsep |
|---|---|
| Clone.C | Proses kloning dengan klon () |
| execve.c | Mengeksekusi proses lain dengan execve () |
| fork.c | Membuat proses anak dengan fork () |
| io_ports.c | Operasi I/O Port Level Level |
| baca.C | Membaca file di vanilla c |
| Simple_circular_buffer.c | Penyangga bundar sederhana dan lurus ke depan |
| write.c | Menulis/Menambahkan File di Vanilla C |
Untuk membangun file -file itu cukup jalankan, make clean && make di ./rehearsals/ dan semua executable akan ditempatkan di direktori build.
"Modul kernel Linux adalah bagian dari kode biner yang dikompilasi yang dimasukkan langsung ke kernel Linux, berjalan pada cincin 0, cincin eksekusi terendah dan paling tidak terlindungi dalam prosesor x86-64."
"Paradigma pengembangan aplikasi tradisional sebagian besar dapat dibuang. Selain memuat dan membongkar modul Anda, Anda akan menulis kode yang merespons peristiwa sistem daripada beroperasi dalam pola berurutan."
"Dengan pengembangan kernel, Anda menulis API, bukan aplikasi sendiri."
Repositori ini akan meminta izin root kepada Anda, karena operasi tertentu seperti memuat/membongkar modul dan mengakses file dalam sistem Linux/GNU tergantung pada hak istimewa root. Makefile akan menyatakan sebelumnya untuk apa izin ini akan digunakan.
Anda dapat meninjau semua operasi ini dengan mencari repositori ini untuk sudo dan pastikan bahwa ini tidak akan disalahgunakan dengan cara apa pun. Saya menyadari bahwa ini bisa menjadi masalah keamanan, tetapi saya mencoba membuat proses ini sebanyak mungkin transparan. Tetapi juga sadar bahwa modul -modul ini akan datang tanpa jaminan apa pun. Panik kernel dan kehilangan data dapat terjadi, silakan gunakan lebih disukai di dalam mesin virtual.
Berikut ini adalah tabel dengan semua lokasi di mana sudo digunakan (kecuali readme.md).
grep -n -r " sudo " *| File: Baris | Penggunaan sudo |
|---|---|
| Makefile: 118 | |
| Makefile: 119 | $ (eval number_file_content = sudo cat $(number_file) ) |
| Makefile: 122 | |
| Makefile: 123 | |
| Makefile: 126 | @sudo rmmod $ (module_filename) |
| Makefile: 140 | @sudo mknod $ (device_filename) c cat $(proc_filename) 0 |
| Makefile: 143 | @Sudo RM $ (device_filename) |
| Makefile: 144 | @sudo rmmod $ (module_filename) |
| Makefile: 162 | @sudo rmmod $ (module_filename) |
| Makefile: 175 | @sudo mknod |
| Makefile: 176 | @echo "pengujian" | sudo tee $ (device_file) |
| Makefile: 178 | @Sudo RM -FV $ (device_file) |
| Makefile: 179 | @sudo rmmod $ (modul) |
| Makefile: 190 | @sudo insmod |
| Makefile: 193 | @sudo rmmod $ (modul) |
| Makefile: 207 | @sudo rmmod $ {module} |
| Makefile: 219 | @sudo insmod $ (modul) .ko |
| Makefile: 222 | @sudo rmmod $ (modul) |
| tests.mk:31 | @lsmod | awk '{print $$ 1}' | grep -qe "^$ (1) $$" && (sudo rmmod |
| tests.mk:75 | @Sudo DMESG --Clear |
| tests.mk:78 | @sudo rmmod $ (1) |
LKM Sandbox adalah perangkat lunak gratis: Anda dapat mendistribusikannya kembali dan/atau memodifikasinya di bawah ketentuan Lisensi Publik Umum GNU seperti yang diterbitkan oleh Free Software Foundation, baik versi 2 lisensi, atau (di opsi Anda) versi selanjutnya.
LKM Sandbox didistribusikan dengan harapan akan bermanfaat, tetapi tanpa jaminan apa pun; bahkan tanpa jaminan tersirat dari dapat diperjualbelikan atau kebugaran untuk tujuan tertentu. Lihat Lisensi Publik Umum GNU untuk lebih jelasnya.
Anda seharusnya menerima salinan Lisensi Publik Umum GNU bersama dengan LKM Sandbox. Jika tidak, lihat https://www.gnu.org/licenses/.