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?
Was passiert bei der Funktion open() ?
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() ?
- Rückgabewert: Anzahl gelesener Bytes / Fehlercode
Was passiert bei der Funktion write() ?
- Rückgabewert: Anzahl an geschreibenen Bytes/Fehlercode
Was passiert bei der Funktion ioctl() ?
- Unterstützt frei definierbare Kommandos und Parameter
Was passiert bei der Funktion mmap() ?
Was passiert bei der Funktion seek()/poll() ?
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