27 Ekim 2014 Pazartesi

Linux Kernel Modül Derleme

    Merhaba arkadaşlar bugün linux kernel modülleri nasıl derlenir nasıl hazırlanır onlardan bahsedeceğim. Öncelikle kernel modül yazmanız için C programlama diline hakim olmanız gerekmektedir. Kullanılan dil bu olmakla beraber az çok Linux komutlarına aşina olmakta fayda var şahsen ben bu konuda biraz acı çektim. Kernel modülleri kernel'ı tekrar derleme ihtiyacı duyulmadan kernel modda çalışan program yazma denebilir. Bunların en büyük örneklerinden biri tabi ki sürücüler.
    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) clean
   Bunları 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