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.
 
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.
Hocam bir de kernel modulu nasil yazilir ayrintili bir sekilde anlatirsan bilgileniriz.
 
Hocam bir de kernel modulu nasıl yazilir ayrintili bir sekilde anlatirsan bilgileniriz.

2. versiyonu daha kapsamlı şekilde 2-3 güne ekleyeceğim. Onda hem tam sayı atama, modül ekleme ve en sonunda USB üzerinde hepsini göstereceğim. Hocam demeyi unutmuşum. Bu verdiğim program ile zaten kernele modül yüklüyorsunuz.
 
Son düzenleme:
2. versiyonu daha kapsamlı şekilde 2-3 güne ekleyeceğim. Onda hem tam sayı atama, modül ekleme ve en sonunda USB üzerinde hepsini göstereceğim. Hocam demeyi unutmuşum. Bu verdiğim program ile zaten kernele modül yüklüyorsunuz.
Ah pardon hello world kelimesini gorunce kodu okumamisim, ben daha cok donanim suruculeri falan nasil yaziliyor onu merak ediyorum.
 
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.
Elinize sağlık emeğiniz için ama kernel modülü derlemek için linux headers gerekiyor, Makefile'da bu kodu yazmışsınız ama bağımlılıklarda belirtmemişsiniz. Bazı dağıtımlar linux headers paketini yüklü bir şekilde sunmuyor.
 
Elinize sağlık emeğiniz için ama kernel modülü derlemek için Linux headers gerekiyor, Makefile'da bu kodu yazmışsınız ama bağımlılıklarda belirtmemişsiniz. Bazı dağıtımlar Linux headers paketini yüklü bir şekilde sunmuyor.

Hocam açıkçası ben Debian kullanıyorum ve makefile üzerinden direk derledim. Zaten gcc kurulması gerektiğini söyledim. Linux .hlar tüm dağıtımlarda bulunuyor diye biliyorum.

Ah pardon hello world kelimesini gorunce kodu okumamisim, ben daha cok donanim suruculeri falan nasıl yaziliyor onu merak ediyorum.

USB üzerinden onu daha iyi kavrarsınız hocam.
Kafanıza takılan kısım neresi hocam?
 
Hocam açıkçası ben Debian kullanıyorum ve makefile üzerinden direk derledim. Zaten gcc kurulması gerektiğini söyledim. Linux .hlar tüm dağıtımlarda bulunuyor diye biliyorum.
Hocam /usr//lib/modules/$(uname -r)/build klasörü headerları barındırıyor, gerekli configuration orda bulunduğu için derleyebiliyorsunuz. Sadece bağımlılıklarda eksiklik gördüm yoksa birşey yanlış olduğunu düşünmüyorum.
Kafanıza takılan kısım neresi hocam?
Kafanıza takmanıza gerek yok, espri yapmayı çok seviyor.
 
Hocam /usr//lib/modules/$(uname -r)/build klasörü headerları barındırıyor, gerekli Configuration orada bulunduğu için derleyebiliyorsunuz. Sadece bağımlılıklarda eksiklik gördüm yoksa bir şey yanlış olduğunu düşünmüyorum.

Kafanıza takmanıza gerek yok, espri yapmayı çok seviyor.

:) hocam biraz araştırdım ve kernel.h, module.H, stat.h, init.h vs gibi dosyalar her dağıtımda bulunuyor. Daha ilerleyen bölümlerde tty.h, security.h gibi birçok dağıtımca bulunmayan header dosyaları oluyor. O zaman ise tabii ki bağımlılıkları paylaşacağım.
 

Technopat Haberler

Yeni konular

Geri
Yukarı