Rehber Linux Kernel programlama ile driver kodlama

Selam dostlar. Evde boş boş Linux Kernel module programlama işleri ile uğraşırken buraya da ufak rehber yazayım dedim. Bunu seri halinde de yapabilirim ancak şimdilik ilk giriş olacağından dolayı Linux kernel'ine ilk başta "hello, world!" yazdıracağız ve ardından ise tam sayı atamasını göstereceğim. Bu yazacağımız 2 program giriş seviyesinde, mantığını kavratmak içindir. İlerleyen zamanlarda USB'ye driver yazmasını vs göstermeyi planlıyorum. Neyse başlayalım.

Basit programlar yazacağımızdan dolayı şimdilik Raspberry Pi gibi herhangi bir aygıta vs ihtiyaç duymayacağız.

1) Gerekli programları kuralım:
Sudo apt-get install gcc Sudo apt-get install kate. Gcc programı derlemeye, kate ise IDE'dir.
2) Herhangi bir klasör üzerinde kate hello.c yazıyoruz.

C:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL"); //Lisansı ekliyoruz.
MODULE_AUTHOR("Linux Torvalds"); //Yazarın adını yazıyoruz.
MODULE_DESCRIPTION("Linux Kernel Hello, World!"); //Açıklamayı yazıyoruz.

static int __init hello_init(void) //Kernelin giriş kısmını yazıyoruz.
{
 printk(KERN_INFO "Hello, World! \n"); //Burada Hello world kodunu yazdırıyoruz.
 return 0;
}

static void __exit hello_exit(void) // Programın Çıkış kısmını yazıyoruz. Her yazdığımız programda bu kısmın bulunması zorunludur.
{
 printk(KERN_INFO "Goodbye, world\n");
}

module_init(hello_init); //giriş kısım.
module_exit(hello_exit); //çıkıs kısım.

Şimdi programı yazdık ve sıra makefile dosyasında. Bunun için yine açtığımız klasör içine kate Makefile yazıyoruz.
Şimdi makefile ile programı kernel'e göre derletmemiz gerekecek.

Kod:
obj-m += hello.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.

Şimdi bu programımız hazır halde. Sıra bunu derleme sırasında. Olduğumuz klasör içinde terminale "make" yazıyoruz.
Programımız derlendi. Sıra bunu kernelde gösterme vakti.
Derlendikten sonra birden fazla dosya oluşacak bunlardan. KO olanı bizim için önemli.
sudo insmod hello.ko yazıyoruz. Bunu yazdıktan sonra artık yazdığımız programı kernelde görebiliriz. Ancak bitmedi.
sudo rmmod hello bu kodu yazarak artık "hello" programını ismi ile kernele yazdırdık.

Ve artık tamamdır. Sıra görüntüleme vakti. Birden fazla şekilde görüntüleyebilirsiniz. Ben sizin için hepsini yazacağım.
sudo dmesg bu kod ile kernelde tüm yazılan çıktıları görüntüleyebilirisiniz.
sudo dmesg | grep -2 hello bu şekilde yalnızca kendi yazdığımız programı görebileceksiniz. Not: -2 kısmına çıkacak çıktı sayısı kadar yazabilirsiniz. (-5, -7, -i vs)
sudo dmesg | tail -2 bu kod ile kernele son yazılan çıktıları görüceksiniz. Not: Sadece kullanıcı tarafından.
Icode]sudo dmesg | grep -i kernel[/ICODE]kernel adıyla oluşturulmuş program üzerindede yazdığımız programı görüntüleyebilirisiniz.

Daha fazla şekilde de görüntüleyebilirsiniz ancak bu kadar yeterli diye düşünüyorum. Bu kernel programlama ile istediğiniz gibi driver kodlayabilirsiniz. İsteğe bağlı olarak da USB üzerinde de tam olarak driver kodlamayı gösterebilirim. Umarım yardımcı olmuşumdur. Eksiklerim varsa affola elimden geldiğince özen göstermeye çalıştım.

Tam sayı atama programını daha kapsamlı bir rehberde atmayı düşündüm.
 
Cilginca bir ihtimal ama adamin isi gucu olabilir.

Hocam o çılgınca ihtimal gerçek olduğundan dolayı buraya herhangi bir şey yazmadım. İşde çalışıyorum ve boş zamanlarımda siteyi geliştirmeye çalışıyorum. Ve en büyük sorunum ise 4 gün boyunca Google hesabıma giriş yapamamdı. Google beni bot olarak algıladığından dolayı hesaba giremedim en sonunda Debian'ı geri kurunca düzeldi (işle ilgili olarak Windows kurmuştum). Site işleri hemen 2-3 günde kurulmuyor. Türkçe olarak yayınladığımdan dolayı birden fazla bilgi vermem gerekiyor, detaylı olması lazım. Aslında pek de ilgilenemiyorum açıkçası. Şu anlık open Source şekilde USB cihazlarına özel kendimce program yazıyorum (kernel üzerinde). Bu tür sebeplerden dolayı pek zamanım yok. İyi sosyaller.
 
Hocam o çılgınca ihtimal gerçek olduğundan dolayı buraya herhangi bir şey yazmadım. İşde çalışıyorum ve boş zamanlarımda siteyi geliştirmeye çalışıyorum. Ve en büyük sorunum ise 4 gün boyunca Google hesabıma giriş yapamamdı. Google beni bot olarak algıladığından dolayı hesaba giremedim en sonunda Debian'ı geri kurunca düzeldi (işle ilgili olarak Windows kurmuştum). Site işleri hemen 2-3 günde kurulmuyor. Türkçe olarak yayınladığımdan dolayı birden fazla bilgi vermem gerekiyor, detaylı olması lazım. Aslında pek de ilgilenemiyorum açıkçası. Şu anlık open Source şekilde USB cihazlarına özel kendimce program yazıyorum (kernel üzerinde). Bu tür sebeplerden dolayı pek zamanım yok. İyi sosyaller.

Hocam merhaba bende 1 aydir kernel programlama ile ilgileniyorum. "sscanf()" ile %d ile değisken atayacagim zaman ... ile başlayan hata aliyorum. Nasil duzeltebilirim tesekkurler.
 
Hocam merhaba bende 1 aydir kernel programlama ile ilgileniyorum. "sscanf()" ile %d ile değisken atayacagim zaman ... ile başlayan hata aliyorum. Nasil duzeltebilirim tesekkurler.

Hocam böyle soru mu sorulur Allah aşkına? Kodun tam çıktısını verseniz ve koduna atsanız anlayacağım. Sorununuzu pek anlayabilmiş değilim ancak sscanf için.
static int sscanf("%d %d", int *num1, int *num2);
Şu tarz bir şeyler deneyebilirsiniz. Galiba siz "&num1" tarzı bir şeyler denediniz diye "..." ile başlayan hatayı aldınız. "int *num1" şeklinde denerseniz olabilir. Ancak yine de çıktıyı tam olarak ve kodu atsanız daha iyi olur.
 
Hocam böyle soru mu sorulur Allah aşkına? Kodun tam çıktısını verseniz ve koduna atsanız anlayacağım. Sorununuzu pek anlayabilmiş değilim ancak sscanf için.
static int sscanf("%d %d", int *num1, int *num2);
Şu tarz bir şeyler deneyebilirsiniz. Galiba siz "&num1" tarzı bir şeyler denediniz diye "..." ile başlayan hatayı aldınız. "int *num1" şeklinde denerseniz olabilir. Ancak yine de çıktıyı tam olarak ve kodu atsanız daha iyi olur.

Gerçekten çok teşekkürler. Siteniz çıkınca lütfen haber edin.
 

Geri
Yukarı