Schnellreferenz

In diesem Kapitel wurden die folgenden Symbole aus dem Bereich der Hardware-Verwaltung eingeführt:

#include <linux/kernel.h>, void barrier(void)

Diese “Software”-Speicherbarriere fordert den Compiler auf, während dieser Anweisung allen Speicher als flüchtig zu betrachten.

#include <asm/system.h>, void rmb(void);, void wmb(void);, void mb(void);

Dies sind Hardware-Speicherbarrieren. Sie fordern die CPU (und den Compiler) auf, an dieser Stelle alle Lese- und Schreibzugriffe auf den Speicher abzuschließen, bevor neue anfangen.

#include <asm/io.h>, unsigned inb(unsigned port);, void outb(unsigned char byte, unsigned port);, unsigned inw(unsigned port);, void outw(unsigned short word, unsigned port);, unsigned inl(unsigned port);, void outl(unsigned doubleword, unsigned port);

Diese Funktionen werden verwendet, um auf I/O-Ports zu schreiben bzw. von diesen zu lesen. Sie können auch von Programmen aus dem User-Space aufgerufen werden, sofern diese Zugriffsrechte auf die Ports haben.

unsigned inb_p(unsigned port);, ...

Die Anweisung SLOW_DOWN_IO wird manchmal benötigt, um auf der x86-Plattform mit langsamen ISA-Karten klarzukommen. Wenn nach einer I/O_-Operation eine kleine Pause benötigt wird, können Sie die sechs wartenden Gegenstücke zu den oben genannten Funktionen verwenden, deren Namen auf _p enden.

void insb(unsigned port, void *addr, unsigned long count);, void outsb(unsigned port, void *addr, unsigned long count);, void insw(unsigned port, void *addr, unsigned long count);, void outsw(unsigned port, void *addr, unsigned long count);, void insl(unsigned port, void *addr, unsigned long count);, void outsl(unsigned port, void *addr, unsigned long count);

Die “String-Funktionen” sind optimiert, um Daten von einem Eingabe-Port in einen Speicherbereich oder in die andere Richtung zu transportieren. Solche Übertragungen werden implementiert, indem ein und derselbe Port so oft ausgelesen oder beschrieben wird, wie in count angegeben ist.

#include <linux/ioport.h>, int check_region(unsigned long start, unsigned long len);, void request_region(unsigned long start, unsigned long len, char *name);, void release_region(unsigned long start, unsigned long len);

Ressourcen-Allokatoren für I/O-Ports. Die check-Funktion gibt 0 im Erfolgsfall und einen Wert kleiner 0 im Fehlerfall zurück.

int check_mem_region(unsigned long start, unsigned long len);, void request_mem_region(unsigned long start, unsigned long len, char *name);, void release_mem_region(unsigned long start, unsigned long len);

Diese Funktionen erledigen die Ressourcen-Allokation von Speicherbereichen.

#include <asm/io.h>, void *ioremap(unsigned long phys_addr, unsigned long size);, void *ioremap_nocache(unsigned long phys_addr, unsigned long size);, void iounmap(void *virt_addr);

ioremap bildet einen physikalischen Adreßbereich in den virtuellen Adreßraum des Prozessors ab und macht ihn so für den Kernel verfügbar. iounmap gibt die Abbildung wieder frei, wenn sie nicht mehr benötigt wird.

#include <linux/io.h>, unsigned readb(address);, unsigned readw(address);, unsigned readl(address);, void writeb(unsigned value, address);, void writew(unsigned value, address);, void writel(unsigned value, address);, memset_io(address, value, count);, memcpy_fromio(dest, source, nbytes);, memcpy_toio(dest, source, nbytes);

Alle diese Funktionen werden verwendet, um auf I/O-Speicherbereiche zuzugreifen; entweder auf unteren ISA-Speicher oder auf obere PCI-Puffer.