Linux Cihaz Suruculeri (Linux Device Drivers)- Ders 1

Kernel Modulu Nasil Yazilir , Neden Kernel Modul Yazma Geregi Duyulur?

Linux de process’ler iki temel durumda calisir. Bu durumlardan bahsederken “User Space” ve “Kernel Space” terimlerini kullanacagiz. Aslinda islemcilerdeki bu calisma ortamlari/durumlari daha cesitlidir, ornegin 80×86 islemcilerde 4 adet calisma durumu(state) bulunur. “Kernel Space” deki islemler oncelik seviyeleri ve herbir process icindeki thread’lerin calisma tarzlari acisindan “User Space” den farklilik gosterir. Buraya kadar anlattiklarim “Understanding the Linux Kernel” adli kitapta detaylica anlatilmis ve coook uzayabilecek mevzulardir. C programlamada tecrube sahibi olanlarinizin su ana kadar anlatilanlari anlamakta gucluk cekmemis oldugunu dusunuyorum.

Linux de driver yazma gerekliligi dogdugunda bunu ‘User Space’de de, ‘Kernel Space’de de yapabilirsiniz. Herbir ortamin kendine ozgu avantajlari ve dezavantajlari vardir;

User Space

Avantajlari;

* Tum C kutuphanesini kullanabilirsiniz

* Farkli debugger lar kullanabilirsiniz

* User Space de bir driver sorun yasadiginda basitce onu oldurebilirsiniz

Dezavantajlari;

* Interruptlar erisilebilir degildirler, ancak interruptlara erismek icin farkli teknikler kullanilmaktadir

* Memory ye direk erisim sadece mmap fonksiyonuyla mumkundur.

* Gorece daha yavas calisir

User Space de driver yazmanin yarattigi bu gibi dezavantajlar kritik bir is olan driver yaziliminda ciddi kayiplar yaratabilir.

Ilk Linux Driver’iniz ;

Oncelikle linux driver yazmak istiyorsaniz bilmeniz gereken ilk sey bir linux dagitimi kullaniyor olmaniz gerektigidir. Build islemlerini Makefile kullanarak yapacagimizdan mutlaka ‘GNU Autobuild tools’ u kullaniyor olmaniz lazim. Debian bir dagitim kullaniyorsaniz eger “build-essentials” paketi icerisinde GCC ve Autotools’u indirebilirsiniz. Ayrica kullandiginiz veya hedef kernelinize ait headers dosyalarinin da sisteminizde bulunuyor olmasi gerekiyor.

Oncelikle “mod_src” adli bir klasor olusturunuz($mkdir mod_src). Yazacagimiz kisa kodun build edilebilmesi icin asagidaki Makefile i kullanabilirsiniz;


### Makefile ############################################

obj-m += merhaba.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

#######################################################

Yukaridaki icerigi Makefile adi altinda  onceden yarattigimiz “mod_src” klasorun icine kaydediniz. Makefile’i kaydettik ama “merhaba” modulumuzun kaynak kodu halen hazir degil. En basit haliyle bir modul kodunu asagida bulabilirsiniz;


### merhaba.c  ###########################################

#include <linux/module.h> /* Butun moduller icin gereklidir*/
#include <linux/kernel.h>  /* printk debug ciktisi icin gereklidir */
#include <linux/init.h> /* module_init ve module_exit makrolari icin gereklidir */

MODULE_LICENSE("Dual BSD/GPL"); /* modulumuzun sahip oldugu lisans turunu belirtir */

/* modulun baslatilirken calistirdigi rutindir */
int __init merhaba_init(void)
{

printk(KERN_NOTICE, "MERHABA MODULU BASLATILDI \n"); /*log */
return 0;

}

/* modulun sonlandirilirken calistirildigi rutindir */
void __exit merhaba_exit(void)
{

printk(KERN_INFO "MERHABA MODULU SONLANDIRILDI \n"); /* log */
return 0;

}
/* bu makroyla kernel e modul baslatilirken merhaba_init rutininin calistirilmasi soylenir */
module_init(merhaba_init);

/* bu makroyla kernel e modul sonlandirilirken merhaba_exit rutininin calistirilmasi soylenir */
module_exit(merhaba_exit);

########################################################

Yukaridaki icerigi de merhaba.c adi altinda onceden olusturdugumuz “mod_src” klasoru altina kaydedelim. Simdi kaynak kodunu tasiyan dosyamiz da hazir olduguna gore modulumuzu build edebiliriz. Bunu asagidaki komutla yapabilirsiniz;
$ make

Evet sadece bu kadar. Bir sorun cikmadiysa modul dosyalariniz build ve link edilir ve sonunda “merhaba.ko” adi altinda bir dosya “mod_src” altinda yaratilir. Asagidaki komutla modulunuzu sisteme yukleyebilirsiniz;
$ sudo insmod merhaba.ko

Modulumuzun kernele yuklenip yuklenmedigini asagidaki komutla gorebiliriz;
$ lsmod

Asagidaki komut sadece bizim modulumuzle ilgili olan satiri yakalayacaktir;
$ lsmod | grep merhaba

Loglarimiz nereye gitti? /var/log/kern.log dosyasinin en alt satirina “MERHABA MODULU BASLATILDI ” mesaji kaydetmis olacaktir. Bu mesaj stdout a yazilmaz yani insmod ile modulu yuklediginizde bu ciktiyi terminalde goremezsiniz. Asagidaki komutla ilgili log dosyasini okuyabilirsiniz;
$ dmesg

Modulunuzu sistemden kaldirmak icin asagidaki komutu calistiriniz;
$ sudo rmmod merhaba

Yine “dmesg” komutuyla kern.log okunabilir. Goreceksiniz ki “MERHABA MODULU SONLANDIRILDI ” mesaji dosyaya kaydedilmis.

Linux Cihaz Suruculeri (Linux Device Drivers) – Ders 2

Linuxdeki Temel Cihaz Surucu Tipleri Nelerdir ?

Linux de cihazlar temel olarak uc basliga ayrilir; block cihazlar ve char cihazlar ve network cihazlari. Bu cihazlarin herbiri icin yazilan moduller/driver lar da yapi bakimindan farklilik gosterir.

Karater Cihazlar (Character Devices)
Bir bilgi dizisi seklinde erisilebilir cihazlardir, bu her defada istenilen miktarda veriye erisilebilmeyi saglar. Surucu tasariminda en azindan open, close, read ve write fonksiyonlari kullanilmaktadir. Konsol ve seri port bu ture ornek olarak gosterilebilir. Dosya sisteminde “/dev/” dizini altinda bulurlar.

Blok Cihazlar (Block Devices)
Kabaca bir dosya sistemine ev sahipligi yapan sistem denilebilir. Unix sistemlerinde blok cihazlar IO fonksiyonlarini sadece bir yada birden fazla bloklar halinde yapilabilir. Bu blok buyuklukleri genelde 512 byte olarak tanimlanmistir. Sabit suruculer bu ture ornek olarak verilebilir. Karakter cihazlar gibi dosya sisteminde “/dev/” dizini altinda bulurlar.

Network Cihazlari/Arayuzleri (Network Interfaces)
Network cihazlari bilindigi uzere donanimsaldir, ancak bu onlarin yazilimsal olarak tasarlanamayacagi anlamina gelmez ki loopback arayuzu bunun bir kanitidir. Bir network surucusu istemciler arasindaki baglanti hakkinda hicbirsey bilmez, sadece paketler uzerinde calisir. Baglantilarla alakali kisimlari protocol stack’ler halleder.
Kernel ile network cihaz suruculeri arasinda blok ve karakter cihaz suruculerinden farkli bir iletisim mevcuttur. Bu nedenle de network cihazlari diger ikisinde oldugu gibi dosya sistemi uzerinde “/dev/” dizininin icerisinde gosterilemezler. Unix sistemler her bir network arayuzune ayri bir isim verir (orn: eth0) ve erisimlerini bu sekilde saglar.

Asagidaki komutu calistirdiginizda sisteminizde calisan suruculeri ve onlara bagli olan cihazlari goreceksiniz. Karsiniza cikan listede karakter cihazlarin basinda ‘c’, blok cihazlarin basinda ise ‘b’ harfi bulunmaktadir.
$ ls -l /dev/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s