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
"-Kernel üzerine standar C kütüphaneleri kullanılmaz bu yüzden kernel çekirdeğine ait kütüphaneler kullanılır.#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);
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
# 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
Yorum Gönder