Mt2Hizmet 1
Mt2Hizmet
melankolıa18 1
melankolıa18
romegames 1
romegames
Krutzo 1
Krutzo
shrpnl 1
shrpnl
Best Studio 1
Best Studio
D 1
delimuratt
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Altın Konu Linux Kernel Modül Yazımı Rehberi

veXor

Herkesin kaderi, kalbinin eseri.
Uzman Moderatör
Admin
TM Üye
Katılım
6 Nis 2021
Konular
566
Mesajlar
1,113
Çözüm
2
Online süresi
25d 16h
Reaksiyon Skoru
1,288
Altın Konu
54
Başarım Puanı
264
MmoLira
31,182
DevLira
12
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

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.

Linux-Kernel-sys-visual.jpg


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:

  1. 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
  2. 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.
Linux Kernel modülü yazmak, işletim sisteminin kalbine doğrudan müdahale etme yeteneği sağlar. Bu güç, aygıt sürücüleri veya özel dosya sistemleri gibi kritik bileşenler geliştirmek için paha biçilmezdir. Ancak, bu alana adım atan her programcı, Kernel'in hassas yapısını anlamalı ve her kodu en üst düzeyde dikkatle test etmelidir.
 
Moderatör tarafında düzenlendi:
Paylaşım için teşekkürler :)
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst