Treiber Flashcards

Treiber Programmierung

1
Q

Funktion um Speicher für ein CharDev zu reservieren.

A

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
Bsp:
alloc_chrdev_region(&dev, 0, 1, “hello”)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Treiber Objekt beim Kernel anmelden. Objekt reservieren.

A

cdev_alloc()
Bsp:
driver_object = cdev_alloc()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Treiber Klasse erstellen.

A

class_create(owner, name) -> Ist als Makro definiert.
Bsp:
cl = class_create(THIS_MODULE, “hello”);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Instanz des Treibers beim Kernel erstellen.

A

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”)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Treiber beim System abmelden.

A

void kobject_put(struct kobject *kobj)
Bsp:
kobject_put(&driver_object->kobj);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Nenne Systemfunktionen?

A
  • close()
  • read()
  • write()
  • seek()
  • select()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Was passiert bei der Funktion open() ?

A
  • Prüfen ob der Treiber geladen ist
  • Zugriffsrechte prüfen
  • welcher Zugriff auf das gerät wird verlangt
  • Rückgabewert: Filedeskriptor
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Treiber dem System hinzufügen (dem Kernel Bescheid geben dass ein neuer Treiber da ist).

A

int cdev_add(struct cdev *p, dev_t dev, unsigned count)
Bsp:
cdev_add(driver_object, dev, 1)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Reservierten Speicher für den Treiber freigeben. (4 Funktionen)

A
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);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Treiber write Funktion

A

static ssize_t driver_write(struct file* instanz, const char* user, size_t conut, loff_t* offset)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Was passiert bei der Funktion read() ?

A
  • Lesen von Daten

- Rückgabewert: Anzahl gelesener Bytes / Fehlercode

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Was passiert bei der Funktion write() ?

A
  • Schreiben von Daten

- Rückgabewert: Anzahl an geschreibenen Bytes/Fehlercode

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Was passiert bei der Funktion ioctl() ?

A
  • Funktion um mit dem Treiber zu kommunizieren

- Unterstützt frei definierbare Kommandos und Parameter

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Was passiert bei der Funktion mmap() ?

A
  • Funktion, um Speicherbereiche eines Geräts in den Adressraum einer Applikation einzublenden.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Was passiert bei der Funktion seek()/poll() ?

A
  • Funktion um zu prüfen ob an einem Gerät Daten zum lesen bereit liegen.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Treiber read Funktion.

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Erklären sie das Verhalten wenn ein Treiber im blocking mode ist?

A

Beim “blocking mode” wird die Application schlafen gelegt sobald keine Daten geschrieben oder gelesen werden können.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Treiber close Funktion

A

static int driver_close(struct inode * geraetedatei, struct file *instanz)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Treiber writeFunktion

A

static ssize_t driver_write(struct file* instanz, const char* user, size_t conut, loff_t* offset)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Treiber Funktionen zum FileOperations struct (struct fileoperations) hinzufügen.

A
static struct file_operations fops = {
        .owner = THIS_MODULE,
        .open = driver_open,
        .release = driver_close,
	.read = driver_read,
	.write = driver_write,
};
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Warum müssen die Treiber Funktionen in das struct fileoperations eingetragen werden?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Nenne die unterschiedlichen Kontexte in denen Treibercode ausgeführt werden kann.

A

Userkontext
Prozesskontext
Kernelkontext
Interruptkontext

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Nenne Funktionen um den Treiber in das Betriebssystem einzubinden.

A

init_module
cleanup_module
probe
remove

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Nenne Funktionen, die durch das Betriebssystem oder die Hardware getriggert werden.

A

ISR
Soft-IRQ´s
Kernel-Threads

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Welche Zugriffsarten gibt es um auf ein Gerät zu zugreifen?

A
  • > blocking mode

- > non blocking mode

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Erklären sie das Verhalten wenn ein Treiber im blocking mode ist?

A

Beim “blocking mode” wird die Application schlafen gelegt sobald keine Daten geschrieben oder gelesen werden können.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Erklären sie das Verhalten wenn ein Treiber im non blocking mode ist?

A

Beim “non blocking mode” wird der Aufruf direkt zurück kommen mit dem Fehlercode -EAGAIN.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Was gibt der Kontext an in dem Programmcode ausgeführt wird (Prozesskontext, etc.).

A

Der Kontext (Umgebung) gibt an, auf welche Daten und Dienste ein Codefragment Zugriff hat.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Beschreibe den Interrupt-Kontext.

A

Limitierte Funktionsauswahl, insbesondere
kein „Schlafen legen“ und kein Zugriff auf
Applikations-Speicherbereiche.
ISRs, Soft-IRQs, Tasklets und Timer.
GFP_ATOMIC

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Beschreibe den Kernel-Kontext.

A

Zugriff auf sämtliche Funktionen des Kernels,
inklusive „Schlafen legen“.
Kernel-Threads, Workqueues, Event-Workqueue
GFP_KERNEL

31
Q

Was für Aufgaben hat exit_module()?

A
  • Freigeben der allozierten Systemressourcen

- Abmelden des Modules beim System.

32
Q

Anmelden einer Hardware ISR, inklusiv Beispiel.

A

Mit request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) wird eine ISR beim System angemeldet.
Bsp:
request_irq(dev->irq, driver_isr, IRQF_DISABLED | IRQF_SHARED, “pci_drv”, dev)

33
Q

Was sind Soft-IRQ`s?

A

Werden im Interrupt-Kontext abgearbeitet

Abarbeitungszeitpunkt direkt nach einer ISR

34
Q

Was gibt die Minornumber an?

A

Die Minornumber dient zu Unterscheidung der einzelnen logischen Geräte.

35
Q

Was passiert bei folgendem Befehl “insmod”?

A

Es wird ein Liste angezeigt mit den geladenen Modulen.

36
Q

Wie greife ich auf die Major und Minor number zu?

A
minor = MINOR(dev_t);
major= MAJOR(dev_t);
37
Q

Was für Aufgaben hat exit_module()?

A
  • Freigeben der allozierten Systemressourcen

- Abmelden des Modules beim System.

38
Q

Was muss in der Treiberfunktion driver_close() beachtet werden?

A
  • zuvor allozierten Ressourcen frei geben.
  • Geräte counter zurück setzten
  • Rückgabewert: 0
39
Q

Was passiert bei der Treiberfunktion driver_read?

A
  • Datentransfer zwischen Kernel-User Space.

- Rückgabewert: Anzahl gelesener Bytes / Fehlercode

40
Q

Funktionen zum Datentransfer zwischen User und Kernel Space.

A
  • copy_to_user( to, from, len )

- copy_from_user( to, from, len )

41
Q

Bei einem Tasklet kann eine Race-Condition auftreten. Welche?

A

Wird der Tasklet-Code entladen bevor er aufgerufen wird, würde der Kernel nach einer ISR Code ausführen, der nicht mehr vorhanden ist.

42
Q

Damit im Betriebssystem die richtige driver_read() Funktion gefunden wird, muss welches Verfahren angewendet werden?

A
  • Der Treiber muss sich beim IO-Subsystem mit einer eindeutigen Kennung anmelden.
    alt: Major Minor Nummer
    neu: Gerätenummer (32 bit)
43
Q

Was gibt die Majornumber an?

A

Die Majornumber dient zur Identifikation des Treibers.

44
Q

Was gibt die Minornumber an?

A

Die Minornumber dient zu Unterscheidung der einzelnen logischen Geräte.

45
Q

Welcher type ist dev_t ?

A

dev_t ist ein typdef der wiederum aus einem u32 besteht. Dies ist die Gerätenummer.

46
Q

Wie greife ich auf die Major und Minor number zu?

A
minor = MINOR(dev_t);
major= MAJOR(dev_t);
47
Q

Was macht int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)?

A

alloc_chrdev_region registriert eine Reihe von Gerätenummern. Die Majornummer wird dabei dynamisch vom System vergeben.

48
Q

Was macht int register_chrdev_region(dev_t from, unsigned count, const char *name)?

A

register_chrdev_region registriert eine Reihe von Gerätenummern angefangen bei dem Parameter “from”. Es muss eine Gerätnummer vergeben worden sein.

49
Q

Was muss in der Treiberfunktion driver_open() beachtet werden?

A
  • Zugriffsüberwachung (Wie viel mal darf das Gerät geöffnet werden, Wie wird auf das Gerät zugegriffen lesend schreiben)
  • Initialisierung
50
Q

Was ist ein Kernel-Thread

A

Ein Thread, der im Kernel abläuft und keine Ressourcen im Userland besitzt.
Er besitzt einen eigenen PCB.

51
Q

Was ist ein Kernel-Thread

A

Ein Thread, der im Kernel abläuft und keine Ressourcen im Userland besitzt.

52
Q

Beschreibe kurz eine Race Condition, die bei Kernel Threads auftreten kann.

A

Ein Thread muss beendet sein, bevor der zugehörige Code entfernt wurde. D.h. auch, dass der Treiber evtl. auf die Beendigung eines Threads warten muss, bevor er entladen wird.

53
Q

Was passiert bei der Treiberfunktion driver_read?

A
  • Datentransfer zwischen Kernel-User space.

- Rückgabewert: Anzahl gelesener Bytes / Fehlercode

54
Q

Funktionen zum Datentransfer zwischen User und Kernel Space.

A
  • copy_to_user( to, from, len )

- copy_from_user( to, from, len )

55
Q

Was sind Workqueues?

A

Workqueues sind „vorgefertigte“ Kernel-Threads, in deren Kontext Funktionen (einmal) abgearbeitet werden.

56
Q

Wie kann man einen Kernel-Thread starten, nach dem er erzeugt wurde?

A

Mit wake_up_process(thread_id) wird eine wartender Thread aktiviert und rechenbereit gemacht.

57
Q

Welche Möglichkeiten gibt es einen Kernel-Thread zu erzeugen?

A
  1. Möglichkeit
    kthread_create(thread_code, data, “mykthread”)
    Diese Funktion erzeugt einen Thread, der noch nicht aktiv ist und damit vom Scheduler nicht ausgewählt wird.
  2. Möglichkeit
    kthread_run(thread_code, data, “mykthread”) wird ein Thread erzeugt und rechenbereit gesetzt.
58
Q

Erzeugen einer Workqueue.

A

Mit create:workqueue(name). Damit die workqueue aber arbeitet, muss sie mit queue_work(wq, &work) gestartet werden.

59
Q

Was passiert bei der Treiberfunktion driver_write?

A
  • Datentransfer zwischen Kernel-User Space.

- Rückgabewert: Anzahl transferierter Bytes / Fehlercode

60
Q

Erzwingen der Abarbeitung einer workqueue.

A

flush_workqueue(wq)

61
Q

Kann es bei einer wait_event_interruptible() zu einer Race-Condition kommen?

A

Ja kann es, wenn der befehl wake_up() vor der ISR kommt. Durch wake_up() läuft die Anwendung zu ende und entlädt den Treiber.

62
Q

Welche Arten von “Arbeit” nimmt eine workqueue entgegen?

A

Eine workqueue nimmt Arbeit von dem Typ struct work entgegen.

63
Q

Wie wird Arbeit für eine workqueue angelegt?

A

Statisch mit dem Makro DECLARE_WORK(work, work_func, data)

64
Q

Auf welche Schutzmechanismen kann innerhalb des Prozesskontext zurückgegriffen werden?

A

Atomare Operationen
Spinlocks
Mutexte
Semaphore

65
Q

Auf welche Schutzmechanismen kann innerhalb des Interruptkontextes zurückgegriffen werden?

A

Atomare Operationen

Spinlocks

66
Q

Auf welche Schutzmechanismen kann innerhalb des Kernelkontext und Prozesskontext zurückgegriffen werden?

A

Atomare Operationen
Spinlocks
Mutexte
Semaphore

67
Q

Funktionen die den Taskzustand beeinflussen.

A

wait_event_interruptible( wait_queue, Bedingung)
schläft genau so lange, bis entweder die Wartebedingung erfüllt ist oder aber ein Signal den Prozess aufweckt (return -ERESTARTSYS;).

68
Q

Kann es bei einer wait_event_interruptible() zu einer Race-Condition kommen?

A

Ja kann es, wenn der befehl wake_up() vor der ISR kommt. Durch wake_up() läuft die Anwendung zu ende und entlädt den Treiber.

69
Q

Nenne ein Beispiel bei der Verwendung eines Mutex.

A

mutex_lock(my_mutex)
/kritischer Bereich/
mutex_unlock(my_mutex)

70
Q

Mutexe können auch unterbrechbar gelockt werden.

A
if(mutex_lock_killable(my_mutex)) {
    return -ERESTARTSYS;
}
/*kritischer Bereich*/
mutex_unlock(my_mutext)
71
Q

Wie wird ein Mutex definiert?

A

DEFINE_MUTEX(my_mutex)

72
Q

Bei der Verwendung sind Mutexe den Semaphoren vorzuziehen. Warum?

A

Mutexe sind speichereffizienter als Semaphore.

73
Q

Wann verwendet man spinlock_irqsave()/spin_lock_irqrestore() und spin_lock()/spin_unlock()?

A

Man verwendet spin_lock() und spin_unlock() wenn die geteilte Ressource nur im Prozesskontext verwendet wird. Wird die Ressource auch im Interruptkontext verwendet, muss im Prozesskontext spin_lock_irqsave() und spin_lock_irgrestore() benutzt werden.

74
Q

Was machen spin_lock_bh() und spin_unlock_bh().

A

Die beiden Funktionen schalten Soft-IRQ´s ab lassen aber Hardware-Interrupts zu.