12 Ekim 2017 Perşembe

Linux Kernel Modül Geliştirme













KULLANICIDAN ALINAN İKİ İNTEGER SAYININ MODULER PROGRAMLAMA KULLANILARAK TOPLANMASI 

Öncelikle modüler programlama ile ilgili araştırma yaparak modüler programlamanın ne olduğunu ve neden kullanmam gerektiği hakkında bilgi edindim. Yaptığım araştırmalar sonucu hazırladığım sizler için de faydalı olacağını düşündüğüm özet aşağıda verilmiştir;

Modül Nedir ?

Kernel modülü, kernele sonradan eklenip çıkartılabilen kodlardır. C ile geşliştirilen Kernel Modülleri aslında sıradan bir programdan çok da farklı değildir.

Neden Modül Kullanmalıyız ?

Linux’da donanımlar kernel sürücüleri tarafından kullanılırlar. Bu modüller genellikle lib/modules dizisi altında bulunurlar ve açılış anında yüklenirler. Sistem içerisinde hazır modüller olduğu gibi kendimiz de modül ekleyebiliriz. Kernelin fonksiyonelliğini sistemi yeniden başlatmadan modüller sayesinde arttırılabilir. Bir donanım sürücüsünü düşünecek olursak, sürücü ile kernel, sistem ve donanım arasındaki bağlantıyı sağlayacaktır. Fakat bu işlem için kernele eklenti yapmamız gerekecektir. Kernele yapılacak her hangi bir müdahalede, kernelin tekrar derlenmesi ve sistemin yeniden başlatılması gerekir. Sunucu sistemleri gibi sürekli açık kalması gereken bilgisayarlar için yeniden başlatma işlemi istenmeyen bir durumdur. Bu tip durumları önlemek için modüller kullanılmaktadır.

=>Başlarken C kodları yazmak için kernel içinde  editöre .c uzantılı kısma yazmam ve başka bir editöre Makefile oluşturmam gerekiyor.
Deneme amacı ile  vim editörünü “apt-get install vim” kullanarak indirdim ve “hello World” yazdırabileceğim c kodunu editörde ayrılan kısma yazdım. Aynı şekilde Makefile oluşturmak için vim ile bir editör açtım. Makefile dosyası içerisinde projeyi derlerken işimizi kolaylaştıracak olan tanımlamalar bulunur.  Makefile dosyasını yazdıktan sonra “make” yazarak derlemeye çalıştım ve aşağıdaki hatayı aldım:
“Missing Separator” hatasını düzeltebilmek için uzun bir  araştırma yaptım ve Makefile dosyamda space yerine tab tuşu kullanamam gerektiğini öğrendim ancak daha sonra “No Target” ile devam eden hata aldım ve uzun süre çözemedim. Sorunun kullandığım editörden kaynaklandığını düşündğüm ve gedit kullanmayı denedim.

1. Linux-4.13.3 kernel içinde “open in terminal” dedikten sonra su ile root oldum .

2. mkdir NewModules adlı dosya oluşturdum

3. NewModules içinde “gedit Sum.c” komutunu yazarak açılan editöre c kodlarımı yazdım ve kaydettim. Sum.c ‘inin içeriği;



4. yine aynı dosya içerisinde “gedit Makefile” yazarak Makefile dosyasını tab kullanmaya dikkat ederek yazdım. Makefile içeriği;



5. “make” yazarak derlemeye çalıştım ve hata aldım aynı işlemleri başka dosyalar açarak tekrarladım her seferinde aldığım hata;




Hatanın kullandığım editörden bağımsız olduğunu anladım ve başka bir terminalde kernelimde herhangi bir yerde “make” veya “defconfig” “make menuconfig” yazdığımda “no targets” ve “no.. file” şeklinde hata aldım. Yaptığım işlem ve araştırma yaparak uyguladıklarım kernelde uzantılarda bir değişiklik yapmış veya yanlışlıkla gerekli dosyalarını lib/ altında silmiş olduğumu düşündüğüm için önceden indirdiğim “linux-4.13.3.tar.xz” dosyasını kullanarak ;
#make deconfig
#make
#make_modules
#make modules_install
#make install
#reboot
Adımlarını en baştan yaparak kurdum ve eskisini sildim.
ð Yeni kernel üzerinde NewModules dosyasını yukarıda anlattığım gibi yazdım , “Sum.c” ve Makefile yeniden oluşturdum.

ð  Bundan sonra “make” yazarak derlenmesini bekledim.


Derlendikten sonra oluşan dosyalar ;

6. “insmod Sum.ko numberOne=10 numberTwo=12” satırını yazdıyoruz.
İnsmod modulu kernele eklemek için kullanılır.
7.dmesg diyerek görmek istediğimiz toplamı elde ediyoruz.







8. rmmod –f Sum ile modülü kapatabilir silebiliriz