17 Mart 2016 Perşembe

-Kernel Modül Geliştirme,Anlama 1-

/*
 * -Kernel Modül Geliştirme,Anlama 1-
 *  Bu makaleyi anlayabilmeniz için öncelikle "struct yapılarında fonksiyon kullanımı" bilgisine sahip olmanız gerekir.
 *  Bu konuda youtube kanalımdan yararlanabilirsiniz.
 * 
 * Bu makalede linux kernel modül geliştirmeye ilk adım atılmıştır. 
 * Kernel modül-driver ne olduğuna dair bilginizin olduğunu varsayıyorum.
 *  
 * Kernel modül geliştirirken "module.h" başlık dosyasını kullanırız.
 * Bu başlık dosyası içerisinde "KERNEL_MODUL_LCM" ismiyle bir struct tanımlı olduğunu varsayalım.
 * Bu struct yapısında belli kalıplara sahip içerikler bulunuyor. Kernel tarafına atacağımız çengel için belli başlı fonksiyon,değişen vb. bulunur.
 * Bu kalıp içerisinde kullanacağımız funksiyon ve/veya değişkenlerin veri tür-tipleri önemlidir ve dikkate alınmalıdır.
 * Dolayısıyla funksiyon parametre sayısı,parametre türü ve geri döndürdüğü değer dikkate alınmalıdır.
 * 
 * Aşağıda geliştirilen örnek kernel modulunde üç adet funksiyon bulunuyor. Bu funksiyonlar kernel tarafında "init,suspend,wakeup" olarak isimlendirilmiştir.
 * Dolayısıyla kernel içersinde bu funksiyonlar çağrılarak iş yaptırılıyor. Bizim geliştireceğimiz funksiyonları struct kalıbı vasıtasıyla
 * kernel tarafında bulunan funksiyonlara atayarak çengellemiş olacağız. Dolayısıyla kernel tarafında "init" çağrıldığında bizim modüle ait "test_init" funksiyonu çalışacaktır.
 * Örnek kodlar aşağıdadır.
 * 
 * NOT: Bu makale ve örnek kodlar kernel modül geliştirmeyi ve anlamayı örneklemiştir. Dolayısıyla bir kernel modül değildir ve kernel ile çalışmaz.
 * Mimariyi anlamak amacıyla geliştirilen örnek bir kod parçasıdır.     
 * * */

mymodul.h:
struct KERNEL_MODUL_LCM{

char *name;
void (*init)(void);
char (*suspend)(char *);
int (*wakeup)(void);


}; 


test.c:
#include "mymodul.h"
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>


#define MODUL_NAME  "TEST_MODULE"
void test_init(void)
{
 ///...
 printf("-inside init funciton\n");

}
char *test_suspend(char *n)
{
 ///...
  printf("-inside suspend function\n");
return n;
}
int test_wakeup(void)
{
///...
printf("-inside wakeup function\n");
return 0;
}

struct KERNEL_MODUL_LCM lcm_module = {
.name = MODUL_NAME,
.init = test_init,
.suspend = test_suspend,
.wakeup = test_wakeup,
};



/*Ayrıca:
 * Struct yapısı içerisinde funksiyon tanımlama yöntemiyle birçok funksiyon ve veri tutucuları struct olarak taşıyabilmek mümkündür.
 * Dolayısıyla onlarca-yüzlerce funksiyonu tek parametre ile farklı katmanlara ulaştırıp oradan erişerek kullanabiliriz.
 * Örnek:

 * */
void struct_send_me(struct KERNEL_MODUL_LCM  *dd)
{
  printf("module name: %s\n",dd->name); 
  dd->init();
  dd->suspend("--");
  dd->wakeup();
}
////

int main()
{

struct_send_me(&lcm_module);

return 0;

}


Hiç yorum yok:

Yorum Gönder