Linux Kernel Module Setup and Remove

Önce kurulumunu gerçekleştireceğimiz modülü masaüstüne indiriyoruz. Ardından işlemler sonucunda oluşacak dosyaların bir arada durması için mkdir kernel-module ile klasörü oluşturuyoruz. Klasörün içine girdikten sonra kernel işlemlerin kullanmak üzere pico Makefile ile Makefile dosyamızı oluşturuyoruz.

_config.yml

GNU nano açıldıktan sonra gerekli komutları yazıyoruz. Fakat bu noktada dikkat edilmesi gereken hususlar var. Öncelikle derlemesini yapacağımız dosya adı ile aynı adı taşıyacak dosya adını ekliyoruz, dosya adı uzantısının “.o” olarak yazılmasına dikkat ediyoruz yoksa derleme sırasında hatalar oluşabilir. Ek olarak boşluk bırakırken “boşluk tuşu(space)” tuşu yerine “Tab” tuşunu kullanıyoruz.

_config.yml

Gerekli kodları yazdıktan sonra Ctrl + X ile dosya içindeki değişikleri kaydediyoruz.

_config.yml

Dosya adını doğrulayıp Enter deyip GNU nano dan çıkıyoruz.

_config.yml

Sıra indirdiğimiz Hello.c dosyamızı işlemleri yapacağımız klasöre taşıyoruz. İndirdiğimiz dosyanın bulunduğu dizin olan masaüstüne cd .. komutu ile dönüyoruz. mv Hello.c kernel-module/ komutu ile taşıma işlemini gerçekleştiriyoruz.

_config.yml

Taşıma yaptığımız klasöre gidip kontrol ediyoruz. Ve işlem başarılı.

_config.yml

Derleme işlemine başlamadan önce cat Makefile komutu ile oluşturduğumuz Makefile dosyası içinde yazdıklarımızı kontrol ediyoruz.

_config.yml

cat Hello.c ile de indirdiğimiz dosya içini kontrol ediyoruz.

_config.yml

Derleme işlemine başlamak için ve yetki sorunlarına takılmamak için sudo make komutunu kullanıyoruz.

_config.yml

Fakat terminal bize kullandığımız boşluklar ile ilgili uyarı veriyor. Çözüm: pico Makefile dosyayı düzenleme moduna geçiyoruz. Tab boşluklarla ilgili bir sıkıntı olmamasına rağmen sorunun sebebini bulmak biraz zaman alıyor. Bunun üzerine dosyayı yazarken kullandığım adımları düşünüp dosyayı baştan yazıyorum. Bu sefer ilk yaptığımdan farklı olarak alt satıra geçmek için Enter yerine “alt yön (↓)” tuşunu kullanıyorum. Değişiklikleri kaydedip düzenleme modundan çıkıyorum.

_config.yml

sudo make komutunu tekrarlıyoruz. Bu sefer sonuç başarılı.

_config.yml

Bulunduğumuz klasörde oluşan dosyaları ls komutu kontrol ediyoruz. Derleme ile birlikte yeni dosyalar eklenmiş.

_config.yml

Sıra modülün yüklenmesine geldi. İşlem yaptığımız klasörde insmod Hello.ko komutu ile c dosyasının derlenmesiyle oluşan ko dosyasını kaynak olarak gösteriyoruz.

_config.yml

Yetki ile ilgili sorun yaşadığını söylüyor terminal. sudo insmod Hello.ko komutu ile tekrar deniyoruz. Herhangi bir hata veya bilgi gelmedi.

_config.yml

lsmod komutu ile kernelde yüklü modülleri listeliyoruz. Ve en üstte yüklediğimiz “Hello” modülünü görüyoruz.

_config.yml

Yüklenen modül ile ilgili tam kontrolleri sağlamak için dmesg komutu ile kernel üzerinde yayınlanan mesajları görüntülüyoruz.

_config.yml

Hello.c içinde yer alan _init hello_start(void) içinde alan bilgiler constructor(yapıcı) maksadı taşıdığından çalışma durumunda içindeki mesajı ve varsa operasyonları yapmasını bekliyorduk. En altta görüldüğü üzere constructor metodu içindeki mesajları görüntülüyoruz. Bu da modül ekleme işleminin başarılı bir şekilde yapıldığını gösteriyor.

_config.yml

Sıra yüklediğimiz modülü kaldırmakta. Yine yetki sorunu olmaması için sudo rmmod Hello komutu ile modülü kaldırıyoruz. Yine bir hata veya bilgi mesajı almadık.

_config.yml

Yüklü olan modülleri lsmod komutu ile kontrol ediyoruz. Listede Hello modülü yok.

_config.yml

dmesg komutu ile kernel üzerindeki mesajları tekrardan gözlemliyoruz. Modül kaldırma sırasında da Hello.c için _exit hello_end(void) çalışma durumunda destructor(yıkıcı) özelliği gösterip içindeki mesajları veya operasyonları gerçekleştirmesini bekliyoruz. Kernel mesajlarında gördüğümüz üzere “Goodbye Mr.” Mesajı bize modül kaldırma işleminin başarılı bir şekilde yapıldığını gösteriyor.

_config.yml

Kernel e modul ekleme ve kaldırma işlemlerini başarı ile tamamladık. İnternette daha farklı örnek modulleri kurmaya çalışarak kendimizi daha geliştirebiliriz.

Kaynak Kodlar

Hello.c

/**
* @file hello.c
* @author Akshat Sinha
* @date 10 Sept 2016
* @version 0.1
* @brief An introductory "Hello World!" loadable kernel
* module (LKM) that can display a message in the /var/log/kern.log
* file when the module is loaded and removed. The module can accept
* an argument when it is loaded -- the name, which appears in the
* kernel log files.
*/
#include <linux/module.h>	 /* Needed by all modules */
#include <linux/kernel.h>	 /* Needed for KERN_INFO */
#include <linux/init.h>	 /* Needed for the macros */

///< The license type -- this affects runtime behavior
MODULE_LICENSE("GPL");

///< The author -- visible when you use modinfo
MODULE_AUTHOR("Akshat Sinha");

///< The description -- see modinfo
MODULE_DESCRIPTION("A simple Hello world LKM!");

///< The version of the module
MODULE_VERSION("0.1");

static int __init hello_start(void)
{
	printk(KERN_INFO "Loading hello module...\n");
	printk(KERN_INFO "Hello world\n");
	return 0;
}

static void __exit hello_end(void)
{
	printk(KERN_INFO "Goodbye Mr.\n");
}

module_init(hello_start);
module_exit(hello_end);

Makefile

Modul kurulum esnasında hata almamak kendiniz oluşturup içini yine kendiniz doludurunuz. >Enter yerine alt yön (↓) , >Çoklu boşluk yerine Tab

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