Apa itu modul kernel?
Modul kernel adalah bagian dari kode, yang dapat dimuat dan dibongkar dari kernel sesuai permintaan.
Modul kernel menawarkan cara mudah untuk memperluas fungsionalitas kernel dasar tanpa harus membangun kembali atau mengkompilasi ulang kernel lagi. Sebagian besar driver diimplementasikan sebagai modul kernel Linux. Ketika driver tersebut tidak diperlukan, kami hanya dapat membongkar driver tertentu, yang akan mengurangi ukuran gambar kernel.
Modul kernel akan memiliki ekstensi .ko. Pada sistem linux normal, modul kernel akan berada di dalam direktori /lib/modules/
Sebelumnya kita telah membahas cara mengkompilasi kernel dari sumbernya.
Tutorial ini menjelaskan cara menulis modul Kernel menggunakan contoh sederhana Hello World.
Aku. Utilitas untuk Memanipulasi Modul Kernel
1. lsmod – Daftar Modul yang Sudah Dimuat
Perintah lsmod akan menampilkan modul yang sudah dimuat di kernel seperti yang ditunjukkan di bawah ini.
# lsmod Module Size Used by ppp_deflate 12806 0 zlib_deflate 26445 1 ppp_deflate bsd_comp 12785 0 ..
2. insmod – Masukkan Modul ke Kernel
perintah insmod akan memasukkan modul baru ke dalam kernel seperti yang ditunjukkan di bawah ini.
# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko # lsmod | grep "squash" squashfs 35834 0
3. modinfo – Menampilkan Info Modul
perintah modinfo akan menampilkan informasi tentang modul kernel seperti yang ditunjukkan di bawah ini.
# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko filename: /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko license: GPL author: Phillip Lougher description: squashfs 4.0, a compressed read-only filesystem srcversion: 89B46A0667BD5F2494C4C72 depends: intree: Y vermagic: 3.5.0-19-generic SMP mod_unload modversions 686
4. rmmod – Hapus Modul dari Kernel
perintah rmmod akan menghapus modul dari kernel. Anda tidak dapat menghapus modul yang sudah digunakan oleh program apa pun.
# rmmod squashfs.ko
5. modprobe – Tambah atau Hapus modul dari kernel
modprobe adalah perintah cerdas yang akan memuat/membongkar modul berdasarkan ketergantungan antar modul. Lihat perintah modprobe untuk contoh lebih detail.
II. Tulis Modul Kernel Hello World Sederhana
1. Memasang header linux
Anda perlu menginstal linux-headers-.. terlebih dahulu seperti yang ditunjukkan di bawah ini. Tergantung pada distro Anda, gunakan apt-get atau yum.
# apt-get install build-essential linux-headers-$(uname -r)
2. Kode Sumber Modul Hello World
Selanjutnya, buat modul hello.c berikut dalam bahasa pemrograman C.
#include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __init and __exit macros MODULE_LICENSE("GPL"); MODULE_AUTHOR("Lakshmanan"); MODULE_DESCRIPTION("A Simple Hello World module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; // Non-zero return means that the module couldn't be loaded. } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); } module_init(hello_init); module_exit(hello_cleanup);
Peringatan: Semua modul kernel akan beroperasi pada ruang kernel, mode yang sangat istimewa. Jadi berhati-hatilah dengan apa yang Anda tulis di modul kernel.
3. Buat Makefile untuk Mengkompilasi Modul Kernel
Makefile berikut dapat digunakan untuk mengkompilasi modul kernel hello world dasar di atas.
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Gunakan perintah make untuk mengkompilasi modul kernel hello world seperti yang ditunjukkan di bawah ini.
# make make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic' CC [M] /home/lakshmanan/a/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/lakshmanan/a/hello.mod.o LD [M] /home/lakshmanan/a/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'
Di atas akan membuat file hello.ko, yang merupakan contoh modul Kernel kami.
4. Sisipkan atau Hapus Modul Kernel Sampel
Sekarang kita memiliki file hello.ko, kita dapat memasukkan modul ini ke kernel dengan menggunakan perintah insmod seperti yang ditunjukkan di bawah ini.
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
Ketika sebuah modul dimasukkan ke dalam kernel, makro module_init akan dipanggil, yang akan memanggil fungsi hello_init. Demikian pula, ketika modul dihapus dengan rmmod, makro module_exit akan dipanggil, yang akan memanggil file hello_exit. Dengan menggunakan perintah dmesg, kita dapat melihat output dari contoh modul Kernel.
Harap dicatat bahwa printk adalah fungsi yang didefinisikan di kernel, dan berperilaku mirip dengan printf di perpustakaan IO. Ingatlah bahwa Anda tidak dapat menggunakan salah satu fungsi pustaka dari modul kernel.
Sekarang Anda telah mempelajari dasar-dasar untuk membuat modul Kernel Linux Anda sendiri.