Modül yapısı
- C kursu
- Uzman
- Ders 8/47
- 5 dk
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
#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
#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
MODULE_LICENSE("____");
MODULE_LICENSE("GPL");
Açıklama: GPL lisansı çekirdek sembollerine tam erişim verir.