Treiber Flashcards
Treiber Programmierung
Funktion um Speicher für ein CharDev zu reservieren.
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
Bsp:
alloc_chrdev_region(&dev, 0, 1, “hello”)
Treiber Objekt beim Kernel anmelden. Objekt reservieren.
cdev_alloc()
Bsp:
driver_object = cdev_alloc()
Treiber Klasse erstellen.
class_create(owner, name) -> Ist als Makro definiert.
Bsp:
cl = class_create(THIS_MODULE, “hello”);
Instanz des Treibers beim Kernel erstellen.
struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, …)
Bsp:
device_create(cl, NULL, dev, NULL, “hello”)
Treiber beim System abmelden.
void kobject_put(struct kobject *kobj)
Bsp:
kobject_put(&driver_object->kobj);
Nenne Systemfunktionen?
- close()
- read()
- write()
- seek()
- select()
Was passiert bei der Funktion open() ?
- Prüfen ob der Treiber geladen ist
- Zugriffsrechte prüfen
- welcher Zugriff auf das gerät wird verlangt
- Rückgabewert: Filedeskriptor
Treiber dem System hinzufügen (dem Kernel Bescheid geben dass ein neuer Treiber da ist).
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
Bsp:
cdev_add(driver_object, dev, 1)
Reservierten Speicher für den Treiber freigeben. (4 Funktionen)
void cdev_del(struct cdev *p) void device_destroy(struct class *class, dev_t devt) void class_destroy(struct class *cls) static inline void unregister_chrdev(unsigned int major, const char *name) Bsp: cdev_del(driver_object); device_destroy(cl, dev); class_destroy(cl); unregister_chrdev_region(dev, 1);
Treiber write Funktion
static ssize_t driver_write(struct file* instanz, const char* user, size_t conut, loff_t* offset)
Was passiert bei der Funktion read() ?
- Lesen von Daten
- Rückgabewert: Anzahl gelesener Bytes / Fehlercode
Was passiert bei der Funktion write() ?
- Schreiben von Daten
- Rückgabewert: Anzahl an geschreibenen Bytes/Fehlercode
Was passiert bei der Funktion ioctl() ?
- Funktion um mit dem Treiber zu kommunizieren
- Unterstützt frei definierbare Kommandos und Parameter
Was passiert bei der Funktion mmap() ?
- Funktion, um Speicherbereiche eines Geräts in den Adressraum einer Applikation einzublenden.
Was passiert bei der Funktion seek()/poll() ?
- Funktion um zu prüfen ob an einem Gerät Daten zum lesen bereit liegen.
Treiber read Funktion.
static ssize_t driver_read(struct file* instanz, char* user, size_t count, loff_t* offset)
struct file *instanz: Info über die Treiberinstanz
char *user: Speicherbereich im User-Space
size_t count: Größe des Buffers im User-Space
loff_t offs: Offset
Erklären sie das Verhalten wenn ein Treiber im blocking mode ist?
Beim “blocking mode” wird die Application schlafen gelegt sobald keine Daten geschrieben oder gelesen werden können.
Treiber close Funktion
static int driver_close(struct inode * geraetedatei, struct file *instanz)
Treiber writeFunktion
static ssize_t driver_write(struct file* instanz, const char* user, size_t conut, loff_t* offset)
Treiber Funktionen zum FileOperations struct (struct fileoperations) hinzufügen.
static struct file_operations fops = { .owner = THIS_MODULE, .open = driver_open, .release = driver_close, .read = driver_read, .write = driver_write, };
Warum müssen die Treiber Funktionen in das struct fileoperations eingetragen werden?
Der Kernel benötigt die Adressen der Funktionen des Treibers, damit er diese bei einem Systemcall aufrufen kann. Das struct fileoperations stellt die Verbindung für den Kernel zwischen der Treiberfunktion und dem Treiber her.
Nenne die unterschiedlichen Kontexte in denen Treibercode ausgeführt werden kann.
Userkontext
Prozesskontext
Kernelkontext
Interruptkontext
Nenne Funktionen um den Treiber in das Betriebssystem einzubinden.
init_module
cleanup_module
probe
remove
Nenne Funktionen, die durch das Betriebssystem oder die Hardware getriggert werden.
ISR
Soft-IRQ´s
Kernel-Threads
Welche Zugriffsarten gibt es um auf ein Gerät zu zugreifen?
- > blocking mode
- > non blocking mode
Erklären sie das Verhalten wenn ein Treiber im blocking mode ist?
Beim “blocking mode” wird die Application schlafen gelegt sobald keine Daten geschrieben oder gelesen werden können.
Erklären sie das Verhalten wenn ein Treiber im non blocking mode ist?
Beim “non blocking mode” wird der Aufruf direkt zurück kommen mit dem Fehlercode -EAGAIN.
Was gibt der Kontext an in dem Programmcode ausgeführt wird (Prozesskontext, etc.).
Der Kontext (Umgebung) gibt an, auf welche Daten und Dienste ein Codefragment Zugriff hat.
Beschreibe den Interrupt-Kontext.
Limitierte Funktionsauswahl, insbesondere
kein „Schlafen legen“ und kein Zugriff auf
Applikations-Speicherbereiche.
ISRs, Soft-IRQs, Tasklets und Timer.
GFP_ATOMIC