/*
* -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