Linux Kernel Modülü Programlama

Linux Kernel Modülü Programlama

Bir önceki yazımda Kernel.org sitesinden son güncel kernel in indirilmesi ve opensource olarak Kurulması'na  değinmiştim. Bu yazımda ise ikinci ödevim olan  Linux Çekirdek Modülü Programlamaya  değineceğim. Kullanıcıdan iki  int değişken alan ve toplama işlemini gerçekleştirip log'a yazan bir  örnek anlatacağım.

Öncelikle Kernel nedir? Modül nedir ? Ne işe yarar ? kısaca bahsetmek istiyorum. Modüller C programlama dili ile geliştirilen yazılımlardır. Sıradan bir programa benzer. Bu programlar da Kernel’e yani Linux çekirdeğe eklenir ve çalışabilir hale getirilir. Linux sisteminin çekirdeğini “Kernel” olarak adlandırıyoruz. Kelime anlamı da zaten “çekirdek” aslında. Kernel, sistemdeki tüm donanım ve yazılımları kontrol ederek, gerektiğinde donanımın ilgili kısımlarını harekete geçirir, gerektiğinde yazılımları çalıştırır.
Driver yazılımları aslında birer modüldür. Bir donanıma ait örneğin DVD okuyucusuna ait driver yazılımını (sürücü) düşünelim. Bu driver ile kernel işletim sistemi ile donanımın haberleşmesini ve birlikte çalışmasını sağlar.
Bu işlem için Kernel’e eklenti yapmamız gerekecektir. Kernel’de yapılan değişiklikler sonucu kernel baştan derlenecek ve sistem yeniden başlayacaktır. Eğer bu linux tabanlı işletim sistemi sürekli açık kalması gereken bir sunucu ise problem oluşturacaktır. Bu tip durumlarda modüller hayat kurtarmaktadır. Çünkü sistemi kapatmadan modülleri devreye alabiliriz.
Linux tabanlı işletim sistemlerinde hazır modüller vardır. Örneğin default’ta yüklü olarak gelen donanımlara ait sürücüler (driver) gibi… Bunlar dışında bir modül de eklenebilir. Veya ihtiyaç kalktığı anda modül kaldırılır ve Kernel’in boyutu azaltılmış olur.
Modüllere özgü “insmod”,”modprobe”,”rmmod”, “lsmod”, “modinfo” gibi araçlar vardır.

Gerçekleştirdiğim örneğe geçecek olursak :

Ø  İlk adım root kullanıcısı olmak için #su komutunu giriyoruz.
Ø  Ardından  MyModules adında klasör oluşturarak yazacağım modül  programları burada bulunduracağım.  Komutu giriyoruz. 
  # mkdir MyModules
        
          Klasörün içine girmek için :
     # cd MyModules
       
Ø  Her örnek için ayrı bir klasör oluşturabilirsiniz. Benim örneğim 2. örnek olduğu için bir klasör daha oluşturdum.
  # mkdir 2
          
           Klasörün içine girmek için :
     # cd 2

Ø  Şimdi ise klasörümüzün içine  toplama işlemini gerçekleştiren kodu yazacağımız metin düzenleyicisini açıyoruz. Kullanımının oldukça zor olduğunu düşünüyorum. Ekleme yapmak için insert anlamına gelen  i harfine tıklayıp gerçekleştirebilirsiniz.
     # vi sum.c 



Yazdığımız kod C programlama diline benzer olduğunu söylemek isterim. Standart kütüphane tanımlaması yaptıktan sonra int olarak sayıları ve toplamı tanımladım. Kullanıcıdan girdi sağlamamızı sağlayan module_param tanımlamalarını gerçekleştirdim. module_param () değişkenin adını, karşılık gelen dosya için türünü ve izinleri olarak 3 argüman alır.  Modülün alabileceği bağımsız değişkenleri belgelemek için MODULE_PARM_DESC () tanımlaması gerçekleştirdim.. İki parametre tanımlaması gerçekleştirmemiz gerek. Bir değişken adı ve bu değişkeni açıklayan ücretsiz bir form dizgesi. Ardından SumTwoNum fonksiyonu içinde toplama işlemini gerçekleştirdim. printk() C programlama dilindeki kullanıma benzer ama asıl kulllanım amacı çekirdek için bir günlükleme mekanizması olur ve bilgileri günlüğe kaydetmek veya uyarı vermek için kullanılır. KERN_ALERT ifadesi öncelik belirtmek için kullanılır bunun gibi farklı kullanımlarda mevcuttur. En son olarak da Kernel'a yükleme yapmak için module_init () tanımı gerçekleştirdim.  Yazma işlemi bittikten sonra kaydedip çıkmak için ESC + Shift + nokta wq diyoruz. 



Ø  sum.c 'nin oluşup oluşmadığını kontrol etmek için  # ls komutunu kullanabilirsiniz.  Sıradaki aşamamız Makefile oluşturmaktır.  Sebebi ise derleme işlemini gerçekleştirmek.  Ayrıntılı bilgi için buraya  tıklayabilirsiniz


Burada dikkat etmeniz gereken yazım kuralları vardır. Aksi halde işleminiz gerçekleşmez ve hata alırsınız. All ifadesinden sonra bir alt satıra geçip Space tuşu yerine Tab tuşuna 1 kere basmanız yeterli olacaktır.  .  Yazma işlemi bittikten sonra kaydedip çıkmak için ESC + Shift + nokta wq diyoruz.
Makefile'ınız aşağıdaki gibi olmalıdır.


Ø  Sıradaki işlem çekirdeği derleme işlemidir.
     # make



Ø  Derleme işleminin ardından modülümüzü çekirdeğe eklememiz gerekir. Ekleme işlemini gerçekleştirirken kullanıcıdan girdi olarak alacağım sayıları da belirlemem gerekir.
     # insmod sum.ko  _numberOne=23 _numberTwo=45

Ø  Ardından tüm logları tarama işlemi ve en güncel logları getirmemiz lazım.
     # dmesg






Ø  Gerçekleştirdiğim işlemleri #history komutunu girerek görebilirsiniz.
Ø  Son olarak yararlandığım kaynağı siz de inceleyebilirsiniz.






Yorumlar

Bu blogdaki popüler yayınlar

LINUX KERNEL ILE RASPBERRY PI 3'DEN TCP PROTOKOLÜ ILE SENSÖR VERILERI ALINMASI

LINUX CHARACTER DRIVERS ÜZERİNDE KLAVYENİN LEDLERINI YAKMA