15 Kasım 2015 Pazar

Linux Modül Uygulaması


Linux İle İki Ayrı Modül Uygulaması


       Modül oluşturmak için öncelikle yapmamız gereken modulün .c uzantılı dosyayı ardından makeflie adında bir dosya oluşturmak olacaktır.Bu dosyaları ekran üzerinde normal bir dosya oluştururmuş gibi oluşturup içerisine yeni belge ekleyerek yapmamız mümküdür.

      Oluşturduğumuz dosyalardan .c uzantılı iki dosya olacak (iki ayrı modül için), ben birisinin adına proc_1 diğerine ise proc_2 dedim isimleri kendi istediğiniz gibi değişitirebilirsiniz.

Proc1.c

#include<linux/module.h>//Needed by all the modules 
#include<linux/kernel.h>//needed for KERN_INFO 
#include<linux/init.h>//NEEDED FOR MACROS 

int topla(int p,int p2){
return p + p2; 
} 

EXPORT_SYMBOL(topla);

static int __init basla(void){
printk("Modul yukleniyor\n");
printk("Toplam:%d\n",topla(1,2)); 
return(0); 
} 

static void __exit bitir(void){
printk("Modul temizlendi\n"); 
}

module_init(basla); 
module_exit(bitir); 


Proc_2.c

#include<linux/module.h>//Needed by all the modules 
#include<linux/kernel.h>//needed for KERN_INFO 
#include<linux/init.h>//NEEDED FOR MACROS 

int topla(int p,int p2);

static int __init basla(void){
printk("Modul yukleniyor\n");
printk("Toplam:%d\n",topla(1,2)); 
return(0); 
} 

static void __exit bitir(void){
printk("Modul temizlendi\n"); 
}

module_init(basla); 
module_exit(bitir); 


   Bu iki .c uzantılı dosyamızı oluşturduktan sonra sıra geldi makefile dosyamızı oluşturmaya

Makefile

obj-m += proc_1.o
obj-m += proc_2.o


KDIR  := /lib/modules/$(shell uname -r)/build

all:
$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
$(RM) Module.markers modules.order



   Oluşturduğumuz bu 3 dosyayı aynı klasör içerisine attıktan sonra işlemlerimize devam ediyoruz.






    Şimdi ise oluşturduğumuz dosyalara terminal üzerinden erişim modüllerimizi yüklememiz gerekiyor.

   Terminal üzerinden dosyalara erişim için cd komutuyla dosya dizinine gideceğiz.

cd /home/ubuntu/Desktop/Proc


Dizine ulaştık şimdi ise make komutu ile modüllerimizi derliyoruz.



Modüllerimizi derledik, şimdi ise modüllerimizi kontrol edelim herhangi bir sorunla karşılaşmamak adına. 
Kontrol komutu ise kabaca: modinfo moduladi.ko şeklindedir.
Benim yaptığım modüllerde ise kod modinfo proc_1.ko ve modinfo proc_2.ko şeklinde oluşturulmaktadır.


Modüllerimizi yükleyelim.
Bu işlem için root yetkisine sahip olmamız gerekmektedir. Bu sebepten kodumuzun başına sudo yazacağız.

sudo insmod proc_1.ko
sudo insmod proc_2.ko

sudo komutunu verdikten sonra bizden şifre girmemizi isteyecektir. Bilgisayar şifremizi girdiğimiz zaman ise root yetkilerine sahip olacağız. 2.modülü yüklerken tekrar kodun başına sudo yazıyoruz fakat bu işlemden sonra şifre istemeyecektir. Çünkü artık root yetkilerine sahibiz.

En son işlem olarak modüllerimizi kontrol edebiliriz.

lsmod | grep modul

Bu komutu bizim yaptığımız örneğe uyarlayacak olursak.

lsmod | grep proc_1 
lsmod | greo proc_2

komutları oluşacaktır.



İşlemlerimiz bitti ve iki ayrı modül uygulaması yapmış bulunmaktayız.
Son yaptığımız işlemde lsmod | greg komutu ile modüllerimizi kontrol ettik ve birbirleri arasında fonksiyon veya veri kullanımı olduğunu anlamış olduk.



Kaynaklar

http://www.cagdastopcu.com/kernel-modul-programlama-giris.html

https://bekirkarul.com/posts/kernel-modulu-programlama.html

http://salihayesilyurt.blogspot.com.tr/2013/12/sistem-programlama-proc-uygulamas.html

http://obenseven.com.tr/linux/dersnotlari/149-kernelmodulleri

16 Ekim 2015 Cuma

Linux Açık Kaynak Kodlu Kernel Çekirdek Güncellemesi

Herhangi bir linux dağıtımı kurulduğunda default çekirdeğe sahip oluyoruz. Çekirdekteki önemli değişikleri de standart güncellemelerimizi yapar gibi alabiliyoruz.
sudo apt-get update
sudo apt-get install
Default çekirdekte yapamayacağımız şeyleri yapabilmek için,
desteklenmeyen bir donanımı desteklemek için,
çekirdek kodunda hata ayıklamak için,
çekirdek kaynak kodunu keşfetmek ve nasıl çalıştığı hakkında bilgi sahibi olmak için
çekirdeğin direk kaynağından derlenmesi gerekiyor.
Öncelikle eğer linux için sanal makine kullanacaksanız depolama alanınızın en az 30GB olmasını tavsiye ederim.

Güncel çekirdek sürümünü öğrenmek içinuname -r yazıyoruz.

İlk olarak www.kernel.org adresine girip latest stable kernel’i indirerek başlıyoruz. Bu terminal üzerinden de yapılabilir. Ben bu yazıyı yazarken bu sürüm 4.2.3’dü. Aşağıdaki komutları da kendi versiyonunuza göre düzenlemeniz gerekiyor.


İndirdiğimiz dosyayı indirilenler klasöründen /usr/src dizinine taşımamız gerekiyor.

cp /home/ubuntu/Downloads/linux-4.2.3.tar.xz /usr/src
Eğer bu kodu çalıştırdığınızda aşağıdaki gibi bir hata alıyorsanız yapmanız gereken işlem;
Terminala sudo -s yazıp daha sonra password girerek terminalde root moduna geçmeniz gerekmektedir veya yazdığınız her kodun başına sudo ekleyerek de bu işlemi gerçekleştirebilirsiniz.


Şimdi /usr/src dizinine geçiyoruz.

cd /usr/src
tar.xz uzantılı dosyayı klasöre çıkartıyoruz.
tar –xJvf linux-4.2.3.tar.xz
Çıkarttığımız klasöre geçiş yapıyoruz.
cd /linux-4.2.3
Bu dizinde, eski ayarları temizlemek için şu komutu yazıyoruz:
make proper
Bir sonraki işlemde ihtiyacımız olacağından libncurses5-dev kütüphanesini güncelliyoruz. İleride bir hata ile karşılaşmamak için bu adımı atlamamalıyız.
sudo apt-get install libncurses5-dev
Çekirdeğinizde düzenlemeler yapmak için hazırlanmış bir arayüz var. Bu ekrandan çekirdeğe eklemeler çıkarmalar yapabiliyoruz. Yaptığınız eklemeler boot süresini arttırabilir. Ben ekleme yapmadan exit yapıp ekrandan ayrıldım. Aşağıdaki çalışmassa nedeni terminal penceresinin küçük olması olabilir, terminalinizi tam ekran yaparak devam edebilirsiniz.
make menuconfig

 Yapılandırma dosyasındaki fazlalıkları temizleyerek devam ediyoruz.

make clean
Şimdi çekirdek imajını derliyoruz, şimdiye kadarki işlemlerden biraz daha uzun sürecek.
make bzImage

En uzun sürecek işlem bu, yaklaşık 4 saat. Modülleri derleme komudunu veriyoruz.
make modules

Derlediğimiz modülleri /lib/modules içine taşıyoruz.

make modules_install


Ve son aşama, artık işlemi sonlandırabiliriz.
make install 

Şimdi yeni çekirdeğimizin sürümünü kontrol edebiliriz.

uname -r
Eğer çekirdek sürümünüz 4.2.3 ise başarılı bir şekilde güncellemeyi yapmışsınızdır. Eğer değil ise işlemleri en baştan daha dikkatli bir şekilde yapmanızı öneririm.
Teşekkürler.

Güncelleme yaparken kullandığım kaynaklar:
http://kod5.org/linux-cekirdegi-kerneli-nasil-derlenir/
http://www.thegeekstuff.com/2013/06/compile-linux-kernel/