LİNUX KERNEL ÇEKİRDEK MODUL PROGRAMLANMASI




Linux Kernel Çekirdek yapısı yüzlerce çeşitli modullerden oluşur. Bu moduller işletim sisteminin işlemleri ,driverlar, çeşitli sistem çağrıları benzeri işlemlerin gerçekleşmesini sağlar.





Öncellikle kendi modülümüzü eklemek için Linuz Kernel'i Kaynak Kod ile derlenmesi ve yüklenmesi gerekmetedir. Kernel'in kaynak kodlar ile derlenip yüklenmesi için bu yazımı incelemenizi tavsiye ederim (Tıklayınız)

Örnek olarak C Dillinde yazılan kullanıcıdan alınan 2 sayıyı toplayıp Kernel ekranına yazdıran modulü inceleyelim

1: Kaynak Kodlarından Derlenen Linux Klasörüne Girilmesi


Örnek olarak Kernel kaynak kod klasörüne girilmesi :

# cd /home/omansak/Downloads/linux-4.13.4
2: Modulleri içerek bir klasörün oluşturulması

# mkdir External_Modules
3: Oluşturacağımız module özel klasör oluşturulması

# cd External_Modules
# mkdir SampleSum
4: C Kodunun oluşturulması

# gedit SampleSum.c
#include <linux/init.h>
#include <linux/module.h>
static int valueX;
static int valueY;
module_param(valueX,int,0);
module_param(valueY,int,0);
MODULE_PARM_DESC(valueX,"valueX is a integer");
MODULE_PARM_DESC(valueY,"valueY is a integer");
static int onStart(void)
{
 printk(KERN_ALERT "valueX + valueY = %d",valueX+valueY);
 return 0;
}
static vpid onExit(void)
{
 printk("Module Closing...");
}
module_init(onStart);
module_exit(onExit);
"-Kernel üzerine standar C kütüphaneleri kullanılmaz bu yüzden kernel çekirdeğine ait kütüphaneler kullanılır.

stdio.h üzerinde bulunan scanf ile kullanıcıdan veri alma fonksiyonu kernel üzerinden module_param(değişken,tip,izinler) methodu ile gerçekleştirilir. Birçok izin mevcuttur tüm izinlerin verilmesi için "0" değeri kullanılır

module_parm_desc(değişken,mesaj) methodu ise alınacak değer için mesaj gönderme işlemine kullanılır.
module_init(method ismi) methodu modulun başlandığı zaman tetiklenecek fonksiyonu belirtir,
module_exit(method ismi) ise modulün kapandığı zaman tetiklenecek fonksiyonu belirtir."



5: Makefile dosyasının oluşturulması

# gedit Makefile
obj-m = SampleSum.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

6: Modulun Derlenmesi

# make
Bu komut ile modül derlendikden sonra

  • SampleSum.c  
  • SampleSum.ko  
  • SampleSum.mod.c  
  • SampleSum.mod.o  
  • SampleSum.o  
  • Makefile  
  • modules.order  
  • Module.symvers

klasör içerisine bu dosyalar oluşur ve artık modulümüz hazırdır. Sırada modulun çalıştırılması kalır.

7: Oluşturulan Modulun Çalıştırılması


# insmod SampleSum.ko valueX=19 valueY=95
komutu ile modülümüzü çalıştırabiliriz ve değişkenlerimizi komuttaki gibi gönderebiliriz.

# dmesg
ile kernel mesajlarını görebiliriz.

# lsmod

# rmmod -rf SampleSum
komutu ile modülümüzü devre dışı bırakabiliriz.


Olası Hatalar ve Çözümleri

1: "Makefile:3: *** missing separator. Stop".
Makefile dosyanızda boşluk(Space) karakterleri olabilir,bu karakterler yerine TAB karakteri koymalısınız.
2: "make not found"
Bu hata Kernel Kaynak kodlarının bozulması sonucunda meydana gelir, güncel Kerneli indirip tekrar derlenip kurulması gerekir.
3:"Could not save file"
Bu hata Kernel Dosyalarını değiştirmek için yönetici izninizin  olmadığını belirtir.

Yönetici şifrenizi oluşturmadıysanız 
# sudo passwd root
Yönetici olarak terminalde işlem yapmak için 
# su
Linux Terminal Komutları
1: "cd" istenilen klasöre girilmesi
2: "ls" klasör içeriğinin görülmesi
3: "mkdir" klasör oluşturulması
4: "gedit" dosya açılması yada düzenlenmesi
5: "su" yönetici olarak girilmesi
6: "dmesg" kernel/debug mesajlarının görülmesi
7: "make" kernele ait komut olup derlenme işlemini yapar


Yorumlar

Bu blogdaki popüler yayınlar

Web Servis ve Kimlik Doğrulama (Authentication) Yöntemleri

Linux Kernel ile Raspberry Pi 3'den TCP Protolü Ile Sensör Verileri Alınması

Yazılım Kalite Metrikleri