Abwärtskompatibilität

Glücklicherweise hat sich im Bereich des grundlegenden Hardware-Zugriffs wenig geändert. Es gibt nur einige wenige Dinge, die Sie beachten müssen, wenn Sie abwärtskompatible Treiber schreiben.

Hardware-Speicherbarrieren existierten in der Version 2.0 des Kernels noch nicht. Auf den damals unterstützten Plattformen waren solche Anweisungen nicht notwendig. Wenn Sie sysdep.h in Ihrem Treiber einbinden, erledigt sich das Problem dadurch, daß die Hardware-Barrieren als synonym mit den Software-Barrieren definiert werden.

Gleichermaßen wurden nicht alle Port-Zugriffsfunktionen (wie inb) auf allen Architekturen in älteren Kerneln unterstützt. Insbesondere die String-Funktionen waren oft nicht vorhanden. Wir liefern die fehlenden Funktionen in sysdep.h nicht nach: Es wäre nicht besonders einfach, das sauber durchzuführen, und es ist höchstwahrscheinlich auch nicht die Mühe wert, wenn man bedenkt, wie Hardware-abhängig diese Funktionen sind.

In Linux 2.0 hießen ioremap und iounmap vremap und vfree. Die Parameter und die Funktionalität waren gleich. Daher reichen oft einige Definitionen, die die Funktionsnamen auf ihre älteren Gegenstücke abbilden.

Unglücklicherweise funktionierte vremap zwar beim Zugriff auf “hohen” Speicher (wie auf PCI-Karten) wie ioremap, weigerte sich aber, die ISA-Speicherbereiche abzubilden. Damals wurde auf diesen Speicher direkt über Zeiger zugegriffen, so daß es nicht notwendig war, den Adreßraum abzubilden. Eine vollständigere Lösung, um ioremap für Linux 2.0 auf der x86-Plattform nachzubilden, sieht also folgendermaßen aus:


extern inline void *ioremap(unsigned long phys_addr, unsigned long size)
{
    if (phys_addr >= 0xA0000 && phys_addr + size <= 0x100000)
        return (void *)phys_addr;
    return vremap(phys_addr, size);
}

extern inline void iounmap(void *addr)
{
    if ((unsigned long)addr >= 0xA0000
            && (unsigned long)addr < 0x100000)
        return;
    vfree(addr);
}

Wenn Sie sysdep.h in Ihren Treibern verwenden, können Sie ioremap selbst beim Zugriff auf ISA-Speicher problemlos verwenden.

Die Allokation von Speicherregionen (mit check_mem_region und verwandten Funktionen) wurde im Kernel 2.3.17 eingeführt. In den 2.0- und 2.2-Kerneln gab es keine zentrale Möglichkeit, Speicher-Ressourcen zu allozieren. Sie können die Makros bei Verwendung von sysdep.h aber trotzdem einsetzen, weil sie die drei Makros unter 2.0 und 2.2 leer definieren.