obsługa modułów w jądrze 2.6.x

Obsługa modułow została dość znacznie zmieniona między wersjami 2.4 a 2.6
W jądrze 2.4 moduły występowały jako pliki obiektowe (.o).
W nowej wersji zastąpiono pliki obiektowe, plikami obiektowymi jadra (Kernel Objects), czyli plikami z rozszerzeniem .ko.
Miało to na celu pozostanie w zgodnosci z Ujednoliconym Modelem Urządzeń (Unified Device Model - UDM).
Nie była to oczywiście jedyna zmiana - oprócz zmian kosmetycznych, zmieniły się także narzędzia do obsługi modułów.
polecenia (a raczej ich nazwy) do obsługi modułów (insmod, rmmmod, depmod, lsmod) pozostały takie same, jednakże same pliki nie przenoszą się między jądrami 2.4, a 2.6.
główna zmiana zaszła w systemie ładowania/wyładowania modułu z jądra systemu.
w jądrach serii 2.4 przy korzystaniu z modułu, używano do tego makra MOD_INC_USE_COUNT, które zwiększało licznik "korzystających" z danego modułu, przy rezygnacji z używania - MOD_DEC_USE_COUNT.
wyładować moduł z systemu można było wtedy, gdy nikt z niego nie korzystał - czyli sprawdzając ten fakt makrem MOD_IN_USE.
gdy ktoś korzystał, jądro zabraniało usunięcia modułu, żeby uniknąć kłopotów.
nie było to jednak wystarczająco dobre rozwiązanie, gdyż zdarzały się sytuacje, gdy w wyniku "niepomyślnych" przeplotów moduł został wyładowany z systemu mimo, iż np. sprzęt z którego korzystał był w użyciu - powstawały tzw. race conditions.
w jądrach serii 2.6 powyższe makra i zmienne "korzystania z modułu" zastąpiono innymi:
funkcje te nie są częścią samego modułu, a napisane są na zewnątrz kodu modułu, więc sytuacje typu "race conditions" już nie grożą.
w treści samych modułów zmieniły się wyłącznie funkcje inicjalizacji/wyjścia - teraz zamiast init_module używamy module_init, a zamiast cleanup_module, module_exit.
poza tym, pisanie modułów generalnie pozostaje bez zmian.

najprostszy moduł:
    #include 
    #include 
    #include 

    static int hello_init(void)
    {
        printk(KERN_ALERT "Hello, world\n");
        return 0;
    }

    static void hello_exit(void)
    {
        printk(KERN_ALERT "Goodbye, cruel world\n");
    }

    module_init(hello_init);
    module_exit(hello_exit);
Literatura:


Powrót

Autor: Andrzej Talarek, at181298@zodiac.mimuw.edu.pl