Bu yazı sadece nasıl derleneceğine ilişkin olduğundan diğer konularla ilgili ayrıntılar başka yazılarımda sizlerle olacak.
Öncelikle nasıl bir kod yazmamız gerekiyor. Bu konuda tabi ki klasik int main yazarak sıradan bir process oluşturmayacağız. Onun yerine linux modülünde en az iki adet fonksiyon mevcut bunlardan biri init_module(void) diğeri ise cleanup_module(void) bu iki fonksiyondan başlangıç (initialization) fonksiyonu init_module olarak adlandırılırken bitiş (cleanup) fonksiyonu ise cleanup_module fonksiyonu olarak adlandırılır.
Ayrıca buraya kod yazarken standart C fonksiyonlarımız yerine linux/kernel.h ve /module.h başlık dosyalarının fonksiyonlarını kullanıyoruz. Standart C fonksiyonları user moda göre yazıldığından kernel modda kullanamıyoruz.
Gelelim kodumuza tabi ki herkez gibi bizde "Hello World" kodu yazacağız.
Kodlar Linux Kernel Module Guide'den alıntıdır.
/* * hello-1.c - The simplest kernel module. */ #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ int init_module(void) { printk(KERN_INFO "Hello world 1.\n"); /* * A non 0 return means init_module failed; module can't be loaded. */ return 0; } void cleanup_module(void) { printk(KERN_INFO "Goodbye world 1.\n"); }Kodu incelersek klasik bir C kodu fakat printf yerine printk kullanılmış. Bu da daha demin dediğimiz gibi stdio fonksiyonları yerine linux'un kernel başlık dosyasındaki fonksiyonları kullanmamızdan kaynaklanıyor. Ayrıca printk log'a yazar KERNEL_INFO ise bu log'un öncelik seviyesini belirler. Aşağıda direk linux kodlarından bu tanımlanan sabitlerin değerlerini görebilirsiniz.
#define KERN_EMERG KERN_SOH "" /* system is unusable */ #define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */ #define KERN_CRIT KERN_SOH "2" /* critical conditions */ #define KERN_ERR KERN_SOH "3" /* error conditions */ #define KERN_WARNING KERN_SOH "4" /* warning conditions */ #define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */ #define KERN_INFO KERN_SOH "6" /* informational */ #define KERN_DEBUG KERN_SOH "7" /* debug-level messages */ #define KERN_DEFAULT KERN_SOH "d" /* the default kernel loglevel */Gel gelelim modülü derlemeye. Öncelikle yeni bir klasör oluşturup kodumuzuda buraya atacağız. mkdir Dosya komutu ile Dosya isimli bir klasör oluşturduk. .c uzantılı dosyamızı bu klasöre atıyoruz. Daha sonra Makefile oluşturacağız. gedit Makefile yazın gedit programı açılacak buraya şunları yazacak ve kayıt edeceksiniz.obj-m += hello-1.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) cleanBunları yazıp kaydettikten sonra "make" komutunu giriyoruz. Artık herşey tamam ls komutu ile dizini listelediğinizde bir sürü dosyanın oluştuğunu göreceksiniz. Şimdi insmod hello-1.ko komutu ile modülümüzü çalıştırıyoruz. dmesg komutu ile kernel'da olup bitenden haberdar oluyoruz ve ekrana listelenen yaznının en sonunda Hello World-1 yazısını görürsek işlemi başarıyla yaptığımız anlamına geliyor. Daha sonra ise modülü kaldırmak için rmod hello-1.ko dediğimizde cleanup fonksiyonunun çalıştığını göreceğiz. Tekrar dmesg dediğimizde cleanup fonksiyonundaki printk ifadesinin listede yazılı olduğunu görüyorsak işlem tamam. Bugünlük yazımızında sonuna geldik kernel modül derleme üzerine daha ayrıntılı yazılar ile birlikte olacağız başlangıcı yaptık devamını ve ayrıntılarını inceleyeceğiz. Hepinize kolay gelsin. Güven Cenan Güvenal
Hiç yorum yok:
Yorum Gönder