In einem Gerätetreiber muß man natürlich auch die Hardware des Geräts ansprechen können. Dazu stellt der Kernel verschiedene Funktionen bereit, mit deren Hilfe man die Hardware-Ressourcen, z.B. IO-Ports, verwalten und ansprechen kann.
Normalerweise belegt man beim Start des Gerätetreibers, also in init_module(), alle Ressourcen, die das Gerät braucht. Dazu geht man folgendermaßen vor:
Auf die IO-Ports kann dann mittels inb(port), inw(port), outb(data, port) oder outw(data, port) zugegriffen werden, mit denen jeweils ein Byte (inb, outb) oder ein Wort (inw, outw) vom Port port gelesen, oder der Wert data auf den Port port geschrieben wird.
Falls man Interrupts belegen will, versucht man während der
Initialisierung mit der Funktion
request_irq(unsigned int irq,
void (*handler)(int, void *, struct pt_regs *),
long flags,
char *device, void *dev_id)
einer Interruptfunktion für den angegeben Interrupt zu belegen. Wenn
der Aufruf nicht fehlschlägt, wird die Funktion handler
bei jedem Interrupt aufgerufen. Mit free_irq(int irq, void
*dev_id)) gibt man
den Interrupt wieder frei, wenn der Treiber entfernt wird.
Wenn man Memory-Mapped Hardware ansprechen will, kann man direkt
Variablen auf die Speicherbereiche der Hardware legen, wenn der
Speicherbereich im ersten Megabyte, auch Adapterbereich genannt,
liegt. Mit folgender Codesequenz
bekommt man z.B. eine Variable, mit der man auf dem Adapterbereich an
Adresse D0000H wordweise zugreifen kann:
short *wert; int address = 0xD0000; werte = (short *)address;
Weiterhin stehen im Kernel Funktionen bereit, um Speicherbereiche (kmalloc()) oder DMA Kanäle (request_dma()) zu belegen. Die Funktionsweise ist im Quellcode des Kernels ersichtlich, z.B. im Soundtreiber oder verschiedenen Blocktreibern.