GİRİŞ
Selamlar. Bu yazımda sizlere sıfırdan linux üzerinde basit bir kernel modülünün nasıl yazıldığını ve işin mutfak kısmında neler döndüğünü anlatacağım.
Başlamadan önce temel linux ve c bilgisine ihtiyacınız olduğunu belirtmeliyim. Dilerseniz konuya geçelim.

PAKETLERİN İNDİRİLMESİ
Programlamaya geçmeden önce bazı gerekli araçları sistemimize kurmamız gerekiyor:
Ben, ide olarak vim tercih ediyorum. Dilerseniz başka bir ide kullanarakta yapabilirsiniz.

BASİT KERNEL MODÜLÜNÜN YAZILMASI
Kernel modülleride normal bir c programı gibi main ve exit entrylerine sahiptir.
Bu main ve exit entrylerini sağlamak için
Kütüphaneleri kullanılır.
Aynı zamanda main ve exit yapıları kernel modülü programlarken şu şekilde tanımlanır:
Yazdığımız kernel modülünü çekirdeğe yükleyebilmek için bu kodu lisanslamamız gerekir. Bunu gpl lisansı kullanarak yapabiliriz:
Parçaları birleştirelim ve bu şekilde ilk kernel modülümüzü yazalım:

KODLARIN COMPİLE EDİLMESİ VE ÇEKİRDEĞE YÜKLENMESİ
Kodları compile etmek için bir Makefile dosyasına ihtiyaç duyuyoruz. Kernel modülünüzün olduğu klasöre "Makefile" adında bir dosya oluşturun ve içine şu kodları yazın:
İlk kısımda "hello.o" objesi, oluşturduğumuz "hello.c" adındaki modülümüzün ismini alıyor. "hello.c" sonrasında bir obje dosyasına dönüştürülüyor.
Kodları derleyelim ve sonrasında dmesg ile yazdırdığımız mesajı görüntüleyelim.
Derlemek için:

Gördüğünüz üzere birden fazla dosya oluştu... çekirdeğe yükleyeceğimiz dosya "hello.ko" dosyası.
Yazdığımız mesajı çekirdek günlüğünde görüntülemek için:

Bu işlemleri yaptıktan sonra modülü çekirdekten kaldırmak, dmesg ile eski mesajları silmek ve make ile oluşturulan dosyaları kaldırmak kalıyor geriye.

KAPANIŞ
Bu yazımda sizlere basit bir kernel modülü nasıl yazılıyor bunu anlatmaya çalıştım. Eksik bıraktığım ya da değinmediğim bir kaç nokta daha var.
İlk girişten sizleri sıkmamak adına bunları şimdilik ileriki derslere bırakıyorum.
Umarım sizler için yararlı bir konu olmuştur, aklınıza takılan bir konuda sormaktan çekinmeyin.
Herkese iyi çalışmalar diliyorum.
Selamlar. Bu yazımda sizlere sıfırdan linux üzerinde basit bir kernel modülünün nasıl yazıldığını ve işin mutfak kısmında neler döndüğünü anlatacağım.
Başlamadan önce temel linux ve c bilgisine ihtiyacınız olduğunu belirtmeliyim. Dilerseniz konuya geçelim.

PAKETLERİN İNDİRİLMESİ
Programlamaya geçmeden önce bazı gerekli araçları sistemimize kurmamız gerekiyor:
Kod:
sudo apt update
sudo apt install -y linux-headers-$(uname -r) build-essential kmod vim
Ben, ide olarak vim tercih ediyorum. Dilerseniz başka bir ide kullanarakta yapabilirsiniz.

BASİT KERNEL MODÜLÜNÜN YAZILMASI
Kernel modülleride normal bir c programı gibi main ve exit entrylerine sahiptir.
Bu main ve exit entrylerini sağlamak için
C:
#include <linux/module.h> // Modüller için.
#include <linux/printk.h> // Çekirdek günlüğüne mesaj yazmak için.
Kütüphaneleri kullanılır.
Aynı zamanda main ve exit yapıları kernel modülü programlarken şu şekilde tanımlanır:
C:
int init_module(void) { return 0; }
void cleanup_module(void) { }
Yazdığımız kernel modülünü çekirdeğe yükleyebilmek için bu kodu lisanslamamız gerekir. Bunu gpl lisansı kullanarak yapabiliriz:
C:
MODULE_LICENSE("GPL");
Parçaları birleştirelim ve bu şekilde ilk kernel modülümüzü yazalım:
C:
#include <linux/module.h>
#include <linux/printk.h>
int init_module(void) {
pr_info("Merhaba, kernel!\n");
return 0;
}
void cleanup_module(void) {
pr_info("Gorusuruz, kernel.\n");
}
MODULE_LICENSE("GPL");

KODLARIN COMPİLE EDİLMESİ VE ÇEKİRDEĞE YÜKLENMESİ
Kodları compile etmek için bir Makefile dosyasına ihtiyaç duyuyoruz. Kernel modülünüzün olduğu klasöre "Makefile" adında bir dosya oluşturun ve içine şu kodları yazın:
Makefile:
obj-m += hello.o
PWD := $(CURDIR)
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Kodları derleyelim ve sonrasında dmesg ile yazdırdığımız mesajı görüntüleyelim.
Derlemek için:
Kod:
make

Gördüğünüz üzere birden fazla dosya oluştu... çekirdeğe yükleyeceğimiz dosya "hello.ko" dosyası.
Kod:
sudo insmod hello.ko
Yazdığımız mesajı çekirdek günlüğünde görüntülemek için:
Kod:
sudo dmesg

Bu işlemleri yaptıktan sonra modülü çekirdekten kaldırmak, dmesg ile eski mesajları silmek ve make ile oluşturulan dosyaları kaldırmak kalıyor geriye.
Kod:
sudo rmmod hello
sudo dmesg --clear
make clean

KAPANIŞ
Bu yazımda sizlere basit bir kernel modülü nasıl yazılıyor bunu anlatmaya çalıştım. Eksik bıraktığım ya da değinmediğim bir kaç nokta daha var.
İlk girişten sizleri sıkmamak adına bunları şimdilik ileriki derslere bırakıyorum.
Umarım sizler için yararlı bir konu olmuştur, aklınıza takılan bir konuda sormaktan çekinmeyin.
Herkese iyi çalışmalar diliyorum.
Bu içeriği görmek için giriş yapın.