GNU/Linux >> Belajar Linux >  >> Linux

Cara Menulis Modul Kernel Linux Anda Sendiri dengan Contoh Sederhana

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//kernel/.

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.


Linux
  1. Cara Menggunakan Perintah RMmod Di Linux Dengan Contoh

  2. Linux – Kernel Tercemar Di Linux?

  3. Bagaimana cara menulis file dengan C di Linux?

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

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

  3. Bagaimana cara membuat kode modul kernel Linux?

  1. Cara Membuat Thread di Linux (Dengan Program Contoh C)

  2. Bagaimana cara membangun modul kernel Linux agar kompatibel dengan semua rilis kernel?

  3. Cara menulis daemon linux dengan .Net Core