CodeBlanks Logo Icon CodeBlanks

Modül yapısı

Bir çekirdek modülünün yapısını öğrenirsin.

Modül yapısı ve makrolar

Bir çekirdek modülü iki özel makro gerektirir: module_init ve module_exit. Bunlar yüklenme ve kaldırılma sırasında çağrılacak fonksiyonları bildirir.

Bunun yanı sıra MODULE_LICENSE, MODULE_AUTHOR, MODULE_DESCRIPTION gibi meta makrolar zorunludur. MODULE_LICENSE("GPL") yazmazsan çekirdek GPL olmayan modül sanar ve bazı sembollere erişimi kısıtlar. Modül kaynağı <linux/module.h> ve <linux/init.h> başlıklarını içerir. Bu yapı modülün çekirdekle uyumlu çalışmasını sağlar.

Init ve exit fonksiyonları

module_init ile bildirilen fonksiyon modül yüklenirken çağrılır. __init işaretiyle bu kodun yüklemeden sonra bellekten atılacağı söylenir.

Benzer şekilde module_exit fonksiyonu __exit ile işaretlenir ve yalnızca kaldırma sırasında çağrılır. Init fonksiyonu başarıyı 0, hatayı negatif kodla döndürür. Hata durumunda çekirdek modülü geri alır ve yüklemeyi reddeder. Bu yüzden init fonksiyonu her kaynağı ayrı ayrı denetler ve hata yolunda önceden alınanları bırakır.

Uygulama Modül meta bilgilerini yazdır

struct module_info { const char *key; const char *value; } tanımla. main içinde dört elemanlı bir dizi oluştur: {"module_init", "start"}, {"module_exit", "cleanup"}, {"MODULE_LICENSE", "GPL"}, {"MODULE_AUTHOR", "Ayşe"}. Bir for döngüsüyle her elemanı printf("%s=%s\n", ...) ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// module_info yapısını tanımla
// dört alanlık dizi oluştur ve for ile yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

struct module_info { const char *key; const char *value; };

int main(void) {
    struct module_info info[] = {
        {"module_init", "start"},
        {"module_exit", "cleanup"},
        {"MODULE_LICENSE", "GPL"},
        {"MODULE_AUTHOR", "Ayşe"}
    };
    int n = sizeof(info) / sizeof(info[0]);
    for (int i = 0; i < n; i++) {
        printf("%s=%s\n", info[i].key, info[i].value);
    }
    return 0;
}

Beklenen çıktı

module_init=start
module_exit=cleanup
MODULE_LICENSE=GPL
MODULE_AUTHOR=Ayşe

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Modül makrolarını eşle

Kavram Anlamı
module_init Başlatma
module_exit Temizleme
MODULE_LICENSE Lisans
MODULE_AUTHOR Yazar

2 Modül başlatma fonksiyonu hangi makro ile bildirilir?

  • MODULE_AUTHOR
  • printk
  • MODULE_LICENSE
  • module_init Doğru cevap

Açıklama: module_init yükleme fonksiyonunu bildirir.

3 MODULE_LICENSE çağrısını tamamla

Soru
MODULE_LICENSE("____");
Cevap
MODULE_LICENSE("GPL");

Açıklama: GPL lisansı çekirdek sembollerine tam erişim verir.

Uzman bölümündeki tüm dersler