GNU/Linux >> Belajar Linux >  >> Linux

Cara Membuat, Mengkompilasi, Memuat Modul Kernel yang Dapat Dimuat LKM Linux

Misalkan kita ingin menambahkan beberapa fungsionalitas tambahan di kernel Linux.

Jadi, ide pertama yang terlintas di pikiran adalah untuk meningkatkan kernel dengan menambahkan lebih banyak kode ke dalamnya, mengkompilasi kode dan menjalankan kernel baru.

Tetapi proses ini memiliki kelemahan berikut di antara beberapa hal lainnya:

  • Kode yang ditambahkan menambah ukuran kernel secara permanen.
  • Seluruh kernel perlu dikompilasi lagi agar perubahan dapat dikompilasi.
  • Ini berarti bahwa mesin perlu di-boot ulang agar perubahan dapat diterapkan.

Solusi dari permasalahan di atas adalah konsep LKM.

LKM adalah singkatan dari Loadable kernel modules (LKM). Seperti namanya, LKM adalah modul yang dapat langsung dimuat di kernel pada saat dijalankan.

Modul kernel yang dapat dimuat mengatasi semua kekurangan yang disebutkan di atas.

  • Modul dapat dikompilasi secara terpisah
  • Modul dapat dimuat ke kernel pada saat dijalankan tanpa harus me-reboot mesin.
  • Modul dapat dibongkar kapan saja dan karenanya tidak ada pengaruh permanen pada ukuran kernel.

Cara Membuat LKM

Mari kita buat modul kernel dasar yang dapat dimuat.

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    printk(KERN_INFO "Welcome.....\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Bye....\n");
}

Jadi kita lihat bahwa kode di atas adalah LKM dasar.

  • Nama 'init_module' dan 'cleanup_module' adalah nama standar untuk LKM.
  • Jika Anda melihat lebih dekat maka Anda akan menemukan bahwa kami telah menggunakan 'printk' bukan 'printf'. Ini karena ini bukan pemrograman C biasa, ini adalah pemrograman tingkat kernel yang sedikit berbeda dari pemrograman tingkat pengguna biasa.
  • Header module.h dan kernel.h harus disertakan untuk mendapatkan kode yang dikompilasi.

Cara Mengkompilasi LKM

Untuk mengkompilasi LKM di atas, saya menggunakan Makefile berikut :

obj-m += lkm.o
all:
        sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Perhatikan bahwa perintah  yang dimulai dengan kata kunci 'sudo' di atas harus memiliki satu spasi tab dari kiri.

Jadi, ketika perintah di atas dijalankan, output berikut diamati:

make: Entering directory `/usr/src/linux-headers-2.6.32-21-generic'
CC [M]  /home/himanshu/practice/lkm.o
Building modules, stage 2.
MODPOST 1 modules
CC      /home/himanshu/practice/lkm.mod.o
LD [M]  /home/himanshu/practice/lkm.ko
make: Leaving directory `/usr/src/linux-headers-2.6.32-21-generic'

Setelah kompilasi di atas berhasil, Anda akan menemukan file .ko di direktori yang sama tempat kompilasi dilakukan.

File .ko ini adalah modul yang akan dimuat di kernel. Utilitas modinfo dapat digunakan untuk mengambil informasi tentang modul ini :

$ modinfo lkm.ko
filename:       lkm.ko
srcversion:     19967CB3EAB7B31E643E006
depends:
vermagic:       2.6.32.11+drm33.2 SMP mod_unload modversions

Jadi kita melihat bahwa utilitas 'modinfo' menyediakan beberapa informasi tentang modul ini.

Bagaimana LKM Dimuat

Setelah modul berhasil dikompilasi dan dibuat, sekarang saatnya untuk memasukkannya ke dalam kernel agar dapat dimuat pada saat dijalankan. Penyisipan modul dapat dilakukan dengan menggunakan dua utilitas berikut:

  • modprobe
  • insmod

Perbedaan antara keduanya terletak pada kenyataan bahwa 'modprobe' menangani fakta bahwa jika modul bergantung pada beberapa modul lain maka modul itu dimuat terlebih dahulu dan kemudian modul utama dimuat. Sedangkan utilitas 'insmod' hanya memasukkan modul (yang namanya ditentukan) ke dalam kernel.

Jadi 'modprobe' adalah utilitas yang lebih baik tetapi karena modul kami tidak bergantung pada modul lain, maka kami hanya akan menggunakan 'insmod'.

Jadi, untuk menyisipkan modul digunakan perintah berikut :

$ sudo insmod ./lkm.ko

jika perintah ini tidak memberikan kesalahan maka itu berarti LKM berhasil dimuat di kernel.

Untuk membongkar LKM digunakan perintah berikut :

$ sudo rmmod lkm.ko

Sekali lagi, jika perintah ini tidak memberikan kesalahan maka itu berarti LKM berhasil di-unload di kernel.

Untuk memeriksa apakah modul telah dimuat dan dibongkar dengan benar, kita dapat menggunakan utilitas dmesg yang memberikan kumpulan log terakhir yang dicatat oleh kernel. Anda akan melihat dua baris berikut di antara semua log lainnya :

....
....
[ 4048.333756] Welcome.....
[ 4084.205143] Bye....

Jika Anda kembali ke kode dan melihat maka Anda akan menyadari bahwa ini adalah log dari dua fungsi dalam kode.

Jadi kita melihat bahwa satu fungsi dipanggil saat 'insmod' dipanggil dan fungsi lainnya dipanggil saat 'rmmod' dipanggil.

Ini hanya LKM dummy. Dengan cara ini banyak LKM yang berfungsi (yang melakukan tugas yang berarti) bekerja di dalam kernel Linux.


Linux
  1. Bagaimana cara memuat modul kernel Linux dari kode C?

  2. Bagaimana cara memberikan nilai ke modul kernel Linux bawaan saat boot?

  3. cara menemukan jalur modul Linux

  1. Linux – Bagaimana Cara Menentukan Modul Yang Menodai Kernel?

  2. Linux – Kernel Tercemar Di Linux?

  3. Bagaimana kernel linux bisa sangat kecil?

  1. Linux – Bagaimana Cara Memuat Ulang Modul Kernel dengan Benar?

  2. Bagaimana cara membuat kode modul kernel Linux?

  3. Cara membuat atribut kelas sysfs sederhana di Linux kernel v3.2