Gömülü Linux Sistemler - 3 : Device Drivers ve Kernel Uygulamaları

 Bu yazımızda Linux sistemleri değil özellikle Gömülü Linux Sistemleri'ndeki Kernel  yapısının ne işe yaradığından, Root FS yapısında hangi role sahip olduğundan ve Kernel modüllerinin ne anlama geldiğinden, nasıl yazıldıklarından bahsedeceğiz. Aslında uzun soluklu bir yazı olması gerekiyor. Fakat tek post altında bu uzun soluğu yaşatmak yerine birkaç part halinde Kernel yapısını anlatmaya çalışacağız.


1- Device driver, Device files nedir?

https://www.theseus.fi/bitstream/handle/10024/74679/Nguyen_Vu.pdf    -   Sayfa.12

Linux Device Drivers:


Linux'ta 3 tip device (cihaz) türü vardır. 

1-Network Devices

2-Block Devices

3-Character Devices

Network device'lar network arayüzleri olarak görünürler ve userspace'den "ifconfig" komutuyla görüntülenebilirler. Block device'lar depolama cihazları (harddisk vs.) gibi cihazlara userspace'den erişim imkanı sunarlar. Bunlar /dev dizini altında görüntülenirler. Karakter device'lar ise input, serial, graphics, sound gibi diğer cihaz türlerine userspace'den erişim imkanı verirler. 



2- Kernel nedir?

3- Rootfs içerisinde Kernel ile nasıl iletişilir?

4- Kernel-User Space iletişimi nasıl gerçekleşir?

5- Kernel Modülleri nedir ve nasıl çalışır?

6- Kernel modülü yazma ve derleme uygulaması.

    ***Uygulama: http://derekmolloy.ie/writing-a-linux-kernel-module-part-2-a-character-device/


1,2,5- Desktop/Linux Embedded.pdf , Syf:110, Chapter 7

          Desktop/Linux System Book.pdf, Syf:44, Chapter 3


6 - https://github.com/notro/rpi-source/wiki/Examples-on-how-to-build-various-modules#hello-world-example


1,2,3,4,5,6 -  https://bootlin.com/doc/training/linux-kernel/linux-kernel-slides.pdf



------------------------------------------------------------

lsmod: kernel modüllerinin listelenmesi.

insmod : modül ekleme.

Burada Kernel modül derleme uygulaması yaparken "kbuild" derleyicisini kullanacağız. "kbuild" , Linux sistemi tarafından kullanılan bir derleme sistemidir. Modüller gcc'ye uygun flagleri tutturabilmek ve derleme altyapısındaki değişikliklerle  uyumlu kalabilmek için "kbuild" kullanmalıdırlar. "in-tree" ve "out-of-tree" yapılarda modül derlemek için fonkyonalite sağlanır.Her ikisi için derleme aslında benzerdir. Tüm modüller başlangıtçta out-of-tree derlenir ve geliştirilir.

Bu uygulamada out-of-tree modüller derlemeyle ilgilenen geliştiricilere yönelik çalışma yapılmıştır. Harici modülleri derlemek isteyen geliştiricinin makinasında derlemede kullanılan başlık ve konfigürasyon dosyalarını içeren ön derlemeli (pre-built) kernel 'ın bulunması lazım. Ayrıca bu kernel, modüller etkinleştirilerek oluşturulmuş olması lazımdır. Eğer kernel dağıtımı kullanıyorsak kernel için dağıtıcı tarafından sağlanan ve bizim çalıştırabildiğimiz bir paketin olması lazım. 

Harici bir modülü derleyebilmek için:

make -C <path_to_kernel_src>  M=$PWD

Kbuild sistemi komutta verilen "M=" seçeneğinden ötürü harici bir modülün inşa edildiğini biliyor. 

Hali hazırda çalışan kernel kullanımına rağmen derlemek için ise:

make -C /lib/modules/$(uname -r)/build M=$(PWD)

Derlenen modülleri yükleyebilmek için ise kullanılan komut:

make -C /lib/modules/$(uname -r)/build M=$(PWD)  modules_install

şeklindedir.

Hello Uygulaması

Hello world modülünün eklenmesini uygulama olarak gerçekleştirelim.

mkdir hello && cd hello 

komutuyla modülün kaynak klasörünü oluşturur dizinin içine gireriz.

nano Makefile

dedikten sonra bu Makefile dosyasının içine aşağıdaki komutu yazarız.

obj-m := hello.o

Kaynak C kodunu ise şu şekilde yazalım:

#include <linux/module.h>
#include <linux/kernel.h>

int hello_init(void)
{
	pr_alert("Hello World :)\n");
	return 0;
}
void hello_exit(void)
{
	pr_alert("Goodbye World!\n");
}
module_init(hello_init);
module_exit(hello_exit);

Bu C kodu bir kernel modülünün nasıl yazıldığının en basir örneğidir. Bu kod genişletilebilir ve istediğimiz şekilde kernel 'ın yani çekirdek sistemin içinde çeşitli yerlere mesajlar gönderebilecek veya çeşitli donanımlara erişebilecek okuma yazma yapabilecek seviyeye getirilebilir. Belki de doğrudan bir donanımın aktif edilmesi için kullanılacak. Bu bir fiziksel arayüzün kernel modülü de olabilir böylelikle (sensör, aktüator, ekran vs. gibi). Şimdi kaynak kodumuzu derleme ve modül olarak kernel 'ın içine eklemeye geldi sıra.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
$ sudo insmod hello.ko
$ dmesg | tail -1
[58728.008906] Hello World :)
$ sudo rmmod hello
$ dmesg | tail -1
[58732.440677] Goodbye World!

# Install module (/lib/modules/<ver>/extra/hello.ko)
$ sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
$ sudo depmod
$ sudo modprobe hello

Ayrıca lsmod komutu ile çalışan modülleri listelediğimiz zaman yeni modülümüzün de bu listede yer aldığını rahatlıkla görebiliriz.






Yorumlar

Bu blogdaki popüler yayınlar

KV260 Kria Starter Kit Series: 3 - Petalinux Install and Boot

KV260 Kria Starter Kit Series: 1 - Power and Boot Up

KV260 Kria Starter Kit Series: 2 - Smartcam Application (Ubuntu)