Linux, esnekliği, kararlılığı ve açık kaynak kodlu yapısıyla bilinir. Bu gücün önemli bir kısmı, sistemin çalışırken bile fonksiyonelliğini değiştirmemize olanak tanıyan Kernel Modüllerinden (Kernel Modules) gelir. Kernel modülleri, çekirdek (Kernel) alanında çalışan, sisteme yeni donanım desteği, dosya sistemleri veya özel işlevler ekleyen program parçalarıdır.

Kernel modülü yazmak, standart kullanıcı alanı (user space) programlamasından farklı ve daha hassas bir süreçtir; çünkü modülün çökmesi, tüm işletim sisteminin çökmesine (Kernel Panic) neden olabilir.
Deneyimli bir Linux sistem programcısı ve editör olarak, bu makalede bir Linux Kernel modülünün nasıl yazılacağını, derleneceğini ve sisteme nasıl yükleneceğini adım adım örneklerle inceleyecek, çekirdek programlamanın temel yapılarını açıklayacağız.
Amacımız, yüklendiğinde bir mesaj yayınlayan ve çıkarıldığında başka bir mesaj yayınlayan basit bir modül yazmaktır.
Modül, temel olarak iki fonksiyondan oluşur: modülün başlangıcında çalışan başlatma fonksiyonu (init) ve modülün sonlandırılmasında çalışan çıkış fonksiyonu (exit).
C:
Kernel modüllerini derlemek, standart C programlarını derlemekten farklıdır. Modülü, Kernel'in inşa (build) sistemini kullanarak derlememiz gerekir.
Makefile:
Terminalde merhaba.c ve Makefile dosyalarının bulunduğu dizine gidilir ve derleme yapılır:
Bash:
Bu komutun sonucunda, Kernel modülü dosyamız olan merhaba.ko (Kernel Object) oluşur.
Modülü Kernel'e yüklemek için insmod (Insert Module) ve kaldırmak için rmmod (Remove Module) komutları kullanılır.
Kernel modüllerini yüklemek genellikle kök (root) yetkisi gerektirir.
Bash:
Modül yüklendikten hemen sonra, başlatma fonksiyonumuz (merhaba_baslat) çalışır ve mesajını Kernel loglarına yazar.
Yazılan mesajı görmek için Kernel mesaj loglarına bakılır:
Bash:
Çıktı Örneği:
Kod:
Modülü sistemden kaldırmak için dosya adı yerine, modülün adı kullanılır.
Bash:
Kaldırma işlemi başarılı olduğunda, çıkış fonksiyonumuz (merhaba_bitir) çalışır. Logları tekrar kontrol ettiğinizde ikinci mesajı görmelisiniz:
Bash:
Çıktı Örneği:
Kod:
Kernel modülleri, standart uygulamalardan farklı bir ortamda çalışır ve bu, geliştiriciler için önemli zorluklar yaratır:

Kernel modülü yazmak, standart kullanıcı alanı (user space) programlamasından farklı ve daha hassas bir süreçtir; çünkü modülün çökmesi, tüm işletim sisteminin çökmesine (Kernel Panic) neden olabilir.
Deneyimli bir Linux sistem programcısı ve editör olarak, bu makalede bir Linux Kernel modülünün nasıl yazılacağını, derleneceğini ve sisteme nasıl yükleneceğini adım adım örneklerle inceleyecek, çekirdek programlamanın temel yapılarını açıklayacağız.
1. Hazırlık ve Ortam Kurulumu
Kernel modülü yazmaya başlamadan önce, sisteminizin doğru yapılandırıldığından emin olmalısınız:- Gerekli Paketler: Sisteminizde kurulu olan Linux Kernel sürümüne ait başlık dosyalarına (kernel headers)ihtiyacınız vardır. Bu dosyalar, Kernel'in iç yapısıyla etkileşim kurmanızı sağlayan arayüzleri içerir.
- Ubuntu/Debian: sudo apt install build-essential linux-headers-$(uname -r)
- Fedora/CentOS: sudo dnf install kernel-devel
- Basit Bir C Derleyici: Modül C diliyle yazılır, bu yüzden gcc ve make araçları olmazsa olmazdır.
2. İlk Kernel Modülümüz: "Merhaba, Çekirdek!" (Hello, Kernel!)
Amacımız, yüklendiğinde bir mesaj yayınlayan ve çıkarıldığında başka bir mesaj yayınlayan basit bir modül yazmaktır.
Adım 2.1: Modülün Kaynak Kodu (merhaba.c)
Modül, temel olarak iki fonksiyondan oluşur: modülün başlangıcında çalışan başlatma fonksiyonu (init) ve modülün sonlandırılmasında çalışan çıkış fonksiyonu (exit).
C:
#include <linux/module.h> // Tüm modüller için gerekli
#include <linux/kernel.h> // printk() gibi temel fonksiyonlar için
// Modülün Başlatma Fonksiyonu (Yükleme anında çalışır)
static int __init merhaba_baslat(void)
{
// printk, Kernel'in loglama fonksiyonudur. KLOG_INFO seviyesini kullanırız.
// dmesg komutuyla çıktısını görebiliriz.
printk(KERN_INFO "Merhaba, Cekirdek! İlk Kernel Modulumuz Yukleniyor.\n");
return 0; // Başarılı başlatma
}
// Modülün Çıkış Fonksiyonu (Kaldırma anında çalışır)
static void __exit merhaba_bitir(void)
{
printk(KERN_INFO "Gule Gule, Cekirdek! Modul basariyla kaldirildi.\n");
}
// 1. Modülün Başlatma Fonksiyonunu kaydetme
module_init(merhaba_baslat);
// 2. Modülün Çıkış Fonksiyonunu kaydetme
module_exit(merhaba_bitir);
// Opsiyonel: Modül Bilgileri
MODULE_LICENSE("GPL"); // Lisans, genellikle GPL olmalıdır.
MODULE_AUTHOR("Uzman Editor");
MODULE_DESCRIPTION("Basit bir deneme Kernel modulu.");
MODULE_VERSION("1.0");
Adım 2.2: Derleme Dosyası (Makefile)
Kernel modüllerini derlemek, standart C programlarını derlemekten farklıdır. Modülü, Kernel'in inşa (build) sistemini kullanarak derlememiz gerekir.
Makefile:
# Modülün adı (merhaba.c'deki merve)
obj-m := merhaba.o
# Sistemin mevcut Kernel'inin dizini
KDIR := /lib/modules/$(shell uname -r)/build
# 'pwd' mevcut dizini gösterir
PWD := $(shell pwd)
# make komutu çalıştırıldığında, Kernel'in build sistemini çağırırız
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
# Temizlik ve kaldırma işlemi için
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
Adım 2.3: Derleme İşlemi
Terminalde merhaba.c ve Makefile dosyalarının bulunduğu dizine gidilir ve derleme yapılır:
Bash:
make
Bu komutun sonucunda, Kernel modülü dosyamız olan merhaba.ko (Kernel Object) oluşur.
3. Modülün Yüklenmesi ve Kaldırılması
Modülü Kernel'e yüklemek için insmod (Insert Module) ve kaldırmak için rmmod (Remove Module) komutları kullanılır.
Adım 3.1: Modülün Yüklenmesi (insmod)
Kernel modüllerini yüklemek genellikle kök (root) yetkisi gerektirir.
Bash:
sudo insmod merhaba.ko
Modül yüklendikten hemen sonra, başlatma fonksiyonumuz (merhaba_baslat) çalışır ve mesajını Kernel loglarına yazar.
Adım 3.2: Logları Kontrol Etme
Yazılan mesajı görmek için Kernel mesaj loglarına bakılır:
Bash:
dmesg | tail
Çıktı Örneği:
Kod:
[ 1234.567890] Merhaba, Cekirdek! İlk Kernel Modulumuz Yukleniyor.
Adım 3.3: Modülün Kaldırılması (rmmod)
Modülü sistemden kaldırmak için dosya adı yerine, modülün adı kullanılır.
Bash:
sudo rmmod merhaba
Kaldırma işlemi başarılı olduğunda, çıkış fonksiyonumuz (merhaba_bitir) çalışır. Logları tekrar kontrol ettiğinizde ikinci mesajı görmelisiniz:
Bash:
dmesg | tail
Çıktı Örneği:
Kod:
[ 1234.567890] Merhaba, Cekirdek! İlk Kernel Modulumuz Yukleniyor.
[ 1234.600000] Gule Gule, Cekirdek! Modul basariyla kaldirildi.
4. Kernel Programlamanın Temel Farkları ve Riskleri
Kernel modülleri, standart uygulamalardan farklı bir ortamda çalışır ve bu, geliştiriciler için önemli zorluklar yaratır:
- Bellek Kısıtlamaları: Kernel modülleri, kullanıcı uygulamaları gibi dinamik bellekten kolayca yararlanamaz. Bellek tahsisinde özel Kernel API'leri (kmalloc gibi) kullanılmalıdır.
- Hata Ayıklama (Debugging) Zorluğu: Kernel'de hata ayıklama zordur. Standart hata ayıklama araçları kullanılamaz ve hataların büyük bir kısmı printk logları üzerinden takip edilir. Bir modül hatası, sistemin tamamen çökmesine (Kernel Panic) yol açabilir.
- Yüksek Yetki: Kernel modülleri, en yüksek yetki seviyesinde (Ring 0) çalıştığı için, modüldeki en ufak bir güvenlik hatası, tüm sistemi savunmasız hale getirebilir.


