Linux Device Driver I & II Flashcards
Unterschied Modul und Driver
A kernel module is a bit of compiled code that can be inserted into the kernel at run-time, such as with insmod or modprobe.
A driver is a bit of code that runs in the kernel to talk to some hardware device.
Vorteile Module
Geringerer Ressourcen-Verbrauch im Kernel. Einfache Treiberentwicklung (es ist kein ständiges Rebooten notwendig)
Aufgaben der Funktion init_module()?
Modul bei Kernel-Subsysteme anmelden IO-Subsystem (Treiber) PCI Sys-Filesystem proc-Filesystem Initialisierung von Ojekten (z.B. Waitqueues) Reservieren von Ressourcen
Aufgaben der Funktion cleanup_module()
Freigeben der allozierten Systemressourcen
Abmelden des Moduls beim System
Wo speichert der Kernel Consolenausgaben?
Wie sind diese aufrufbar?
log_buffer -> klogd
etc/syslogd -> syslogd
Als was ist ein Treiber im Kernel repräsentiert?
Als ein Object
Instantiierung der struct file_operations
Registrieren des Objekts beim Chardev-Subsystem.
Grundprinzip: Für jede Applikationsfunktion gibt es eine
Funktion (Methode) im Kernel-Treiber-Objekt:
Wie werden Treiber eindeutig identifiziert?
Der Treiber meldet sich beim IO-Subsystem unter einer
eindeutigen Kennung (Major-Nummer) an.
Auf der User-Ebene gibt es eine Zuordnung zwischen dieser Major-Nummer und einem (Geräte-) Dateinamen (Aribut der Datei).
Im Kernel sind Major- und Minornummern durch eine 32-Bit breite Gerätenummer ersetzt worden.
Vorteile Funktionen oder gar ganze Applikationen im Kernel ablaufen zu lassen?
- Zeit – Kontextwechselzeit – eingespart
- verbesserte Reaktionszeit.
Was wird im Begriff »asynchrone Verarbeitung« zusammengefasst.
Interrupts werden asynchron zur App ausgeführt.
Was passiert beim eintreffen eines Interrupts?
Wird ein Interrupt ausgelöst, unterbricht die CPU sofort die aktuelle Verarbeitung und springt in eine Interrupt-Service-Routine (ISR)
Welche Funktion muss der Entwickler bei Treiber Entwicklung berücksichtigen
ISR Programmieren um mit Interrupts in einer Funktion umzugehen.
Diese werden beim einbinden beim Kernel registriert, der dann aufgerufen wird.
Was beinhaltet die Funktion requestirq
- die Interruptnummer,
- die Adresse der aufzurufenden Funktion (ISR),
- ein Flag,
- einen Namen als Kennung für den Treiber
- frei wählbare Kennung für das Gerät (dev_id).
Welche Interrupts dürfen sich schlafen legen welche nicht?
Nicht: HardIR, Tasklet
Allowed: Software IR, Kernel Threads
Was muss bei der Verwendung von Tasklets beachtet werden?
Race Condition -> Treiber entladen bevor Tasklet ausgeführt wurde.
Lösung: TaskletKill in modexit
Wie funktionieren Timer SoftIR?
- Anzahl periodischer Timerinterrupts.
- Im Zähler mit dem Namen jiffies gezählt.
- Alloc timer_list ptimer
- Übergabe function, data und expires an struct.
- add_timer -> ausführung
- del_timer_sync -> löschen Timer
Gleicher Treiber ruft von unterschiedlichen Stellen das Timer Tasklet auf. Wie wird sichergestellt das es zu keine crash kommt?
spin_lock_irqsave
Können sich Kernel Threads schlafen legen?
Ja
Was ist ein Kernel Thread?
Kernel-Thread entspricht einem Thread auf User-Ebene
Unterschied: Wird im Kernel abgearbeitet.
Wird gescheduled
Wie werden die Kernel Threads aufgerufen?
SystemCall
Warum hilft der Befehl fork im Kernel Thread nichts?
Sobald der System Call beendet ist wird die Bearbeitung im User Kontext fortgesetzt.
Verwende kernel_thread
Wie funktioniert kernel_thread()?
Kopie des aktiven Prozesses Threads
Funktion wird übergeben beim Scheduling
Wie lange werden Kernel Threads ausgeführt?
Da Kernel-Threads im Kernel-Level ablaufen, bekommen sie die CPU so lange zugeteilt, bis sie sich schlafen legen (wait_event oder wait_event_interruptible) oder beenden
!-> Alle anderen müssen warten
Wie wird ein Kernel Thread schlafen bzw geweckt?
- (wait_event oder wait_event_interruptible
- wake_up_interruptible
- Unterbrechen des Wartens durch das Senden eines Signals
In welchem Zustand muss sich der Kernel Thread befinden um von einem Signal unterbrechbar zu sein?
TASK_INTERRUPTIBLE
Was sind Workqueues?
Konkurieren mit Tasklets (nicht so hochprior)
Kernel Thread mit einer Queue und seq abarbeitung von Funktionen
Funktionen von Workqueues?
- create_workqueue()
static struct work_struct work_object; - INIT_WORK( &work_object, work_queue_function, NULL);
- queue_work einhängen Object in Workqueue.
- destroy_workqueue
Was Event Workqueue?
Standardmäßig initialisierte Queue für jede CPU der Funktionen abarbeiten kann
- schedule_work
- flush_scheduled_work.
Welcher Schutz vor Kernel Race Conditions stehen zur Verfügung?
Atomare Integer-Operationen Atomare Bit-Operationen Semaphore Interruptsperre Spinlocks
Befehl für atomic operations?
atomic_t index = ATOMIC_INIT(0);
atomic_set( &index, 4 );
old_index=atomic_read( &index );
Warum werden Spinlocks gebraucht?
Schützen von kritischen Abschnitten im ISR Kontext Hardirqs; Softirqs die sich nicht schlafen legen dürfen
Was ist der Kthread-Daemon
Der Kthread-Daemon ist selbst ein Kernel-Thread, in dessen Kontext der Kind-Thread erzeugt wird.
Eindeutiger Kontext
Warum gibt es Funktionen wie spin_lock_irqsave und spin_lock_irq
Wenn ein kritischer Bereich geschützt wird ist oftmals nicht ersichtlich in welchem Kontext. Z.B eine Funktion disabled interrupts eine nicht. Damit die Methode nicht einfach die Interrupts wieder frei gibt wird der Kontext gespeichert und wiederhergestellt.
Was ist Reordering? Welche Probleme enstehen dadurch und wie werden sie gelöst?
x Threads -> CPU oder Compiler ändern Ausführungsreihenfolge.
Lösung:
Spinlocks/Semaphore
Besser: Memory Barriers
Was sind High vs Low Level Driver?
„low level“-Treiber greifen direkt auf die Hardware zu.
„high level“-Treiber nutzen Funktionen, die ihnen die „core driver“ zur Verfügung stellen. USB-Geräte greifen beispielsweise nie selbst direkt auf Hardware zu.
Wie funktioniert Manuelle Ressourcen-Detektion Hardware-Anbindung?
Treiber spezifiziert die Geräte (Vendor- und Device-ID + Probe“ „Remove“ Funktion.
Treiber meldet sich beim PCI-Subsystem an.
Ist Hardware vorhanden, wird Probefunktion von PCI Subsystem aufgerufen. Der Treiber bekommt die zu
allozierenden Ressourcen mitgeteilt.
Nachdem die Ressourcen alloziert wurden, ist der „low level“ Zugriff möglich.
Was ist der Unterschied zwischen non blocking und asynchronous?
Non-blocking > if an answer can’t be returned rapidly, the API returns immediately with an error and does nothing else. So there must be some related way to query whether the API is ready to be called(select poll)
Asynchronous means that the API always returns immediately, having started a “background” effort to fulfil your request, so there must be some related way to obtain the result.(callback)
Nenne die 9 relevanten Treiberfunktionen die wir verwendet haben
open(), close(), read(), write()
ioctl(), select()/poll(), fcntl(), seek()
Was macht die Funktion ioctl()?
Universal-Funktion zur Kommunikation mit dem Treiber.
Unterstützt frei definierbare Kommandos mit frei definierbaren Parametern
Was macht die Funktion mmap()
Funktion, um Speicherbereiche eines Geräts (Hardware) in den Adressraum einer Applikation einzublenden.
Damit kann die Applikation performant (ohne Übergang in den Kernel-Mode) auf Hardware (-Register) zugreifen.
Was macht die Funktion select()/poll()
Funktion um festzustellen, ob an einem oder an mehrerenGeräten (Dateien oder Netzverbindungen) Daten zum Lesen bereit liegen bzw. Daten geschrieben werden können.
Was macht die Funktion lseek()?
Mit dieser Funktion kann in einer Datei (bzw. bei einem
Blockdevice) gezielt ein bestimmtes Byte gelesen bzw.
geschrieben werden
Welche zwei Zugriffsarten gibt es auf Geräte?
blocking und non blocking
Mit welchem Code wird non- und blocking Zugriff erreicht?
if(ReadPossible && instance->f_flags&O_NOBLOCK)
return -EGAIN
if(wait_event_interruptable(wq_reqd, READ_POSSIBLE)
return -ERESTARTSYS