Linux Kernel Module Setup and Remove
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.
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.
Gerekli kodları yazdıktan sonra Ctrl + X ile dosya içindeki değişikleri kaydediyoruz.
Dosya adını doğrulayıp Enter deyip GNU nano dan çıkıyoruz.
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.
Taşıma yaptığımız klasöre gidip kontrol ediyoruz. Ve işlem başarılı.
Derleme işlemine başlamadan önce cat Makefile komutu ile oluşturduğumuz Makefile dosyası içinde yazdıklarımızı kontrol ediyoruz.
cat Hello.c ile de indirdiğimiz dosya içini kontrol ediyoruz.
Derleme işlemine başlamak için ve yetki sorunlarına takılmamak için sudo make komutunu kullanıyoruz.
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.
sudo make komutunu tekrarlıyoruz. Bu sefer sonuç başarılı.
Bulunduğumuz klasörde oluşan dosyaları ls komutu kontrol ediyoruz. Derleme ile birlikte yeni dosyalar eklenmiş.
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.
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.
lsmod komutu ile kernelde yüklü modülleri listeliyoruz. Ve en üstte yüklediğimiz “Hello” modülünü görüyoruz.
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.
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.
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.
Yüklü olan modülleri lsmod komutu ile kontrol ediyoruz. Listede Hello modülü yok.
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.
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