06_Pr_senztag_part2_Z Flashcards
Was sind Major- und Minor-Nummern bei Gerätedateien?
Major- und Minor-Nummern sind Zahlen, die Gerätedateien zugeordnet werden. Die Major-Nummer identifiziert den zugehörigen Treiber, während die Minor-Nummer zwischen mehreren Gerätedateien desselben Treibers differenziert. Zum Beispiel zeigt der Befehl ls -l /dev/random
die Major-Nummer 1 und die Minor-Nummer 8.
Wie funktionieren Gerätedateien?
Gerätedateien dienen als Schnittstelle zwischen User-Space und Kernel-Space. Anwendungen laufen im User-Space und greifen über Gerätedateien auf Kernelmodule zu, die im Kernel-Space laufen.
Wie kann man in C Zufallszahlen aus einer Gerätedatei lesen?
c int fd = open("/dev/random", O_RDONLY); int randomnumber; read(fd, &randomnumber, sizeof(int)); close(fd);Dieser Code öffnet die Gerätedatei
/dev/random
, liest eine Zufallszahl und schließt die Datei.Wie funktioniert die Kommunikation über eine serielle Schnittstelle in C?
c int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY); write(fd, "Hallo Welt!", 12); char buffer[128]; read(fd, buffer, 128); printf("Received: %s\n", buffer); close(fd);In diesem Beispiel wird die serielle Schnittstelle
/dev/ttyUSB0
geöffnet, eine Nachricht gesendet, eine Antwort gelesen und die Datei wieder geschlossen.Wie erstellt man ein Festplatten-Image in C?
c int fd1 = open("/dev/sda1", O_RDONLY); int fd2 = open("harddisk.image", O_WRONLY | O_CREAT); char buffer[1024]; int readcount; while ((readcount = read(fd1, buffer, 1024)) > 0) { write(fd2, buffer, readcount); } close(fd1); close(fd2);Dieser Code kopiert den Inhalt der Festplatte
/dev/sda1
in eine Image-Datei harddisk.image
.Was ist ein Kernelmodul?
Ein Kernelmodul ist eine Erweiterung des Kernels, die zur Laufzeit geladen und entladen werden kann, um zusätzliche Funktionen bereitzustellen. Es bietet eine Funktionszeigertabelle, in der benutzerdefinierte Funktionen für Dateioperationen eingetragen werden können.
Wie sieht ein einfaches Kernelmodul aus, das ein konfigurierbares Zeichen wiederholt ausgibt?
c #include #include #include #include #include static int \_\_init my_init(void) { ... } static void \_\_exit my_exit(void) { ... } static int my_open(struct inode*, struct file*) { ... } static int my_release(struct inode*, struct file*) { ... } static ssize_t my_read(struct file*, char*, size_t, loff_t*) { ... } static ssize_t my_write(struct file*, const char*, size_t, loff_t*) { ... } static struct file_operations fops = { .owner = THIS_MODULE, .read = my_read, .write = my_write, .open = my_open, .release = my_release }; module_init(my_init); module_exit(my_exit); MODULE_LICENSE("Some License"); MODULE_AUTHOR("Matthias Janetschek"); MODULE_DESCRIPTION("An example module");
Was sind wichtige Dateioperationen in Kernelmodulen?
Wichtige Dateioperationen in Kernelmodulen sind open()
, release()
, read()
, write()
, und ioctl()
. Diese werden in der Datei /linux/fs.h
definiert.
Wie erfolgt der Datentransfer zwischen Kernel- und User-Space in Kernelmodulen?
Anwendungen übergeben Buffer im User-Space. Kernelmodule nutzen spezielle Kopierbefehle wie copy_to_user()
und copy_from_user()
, um Daten zwischen User-Space und Kernel-Space zu transferieren.
Wie können Kernelmodule parametrisiert werden?
Kernelmodule können mit Parametern versehen werden, wie im folgenden Beispiel:
c static char myparam = '1'; module_param(myparam, byte, 0660); MODULE_PARM_DESC(myparam, "A sample parameter");Dies erlaubt es, Parameter beim Laden des Moduls zu übergeben.
Wie kompiliert man ein Kernelmodul?
Kernelmodule können out-of-tree oder in-tree kompiliert werden. Ein Beispiel-Makefile für die Kompilierung eines Moduls sieht wie folgt aus:
makefile obj-m := mymodule.o CURRENT = $(shell uname -r) KDIR = /lib/modules/$(CURRENT)/build PWD = $(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) cleanDieses Makefile kompiliert das Modul
mymodule.o
unter Verwendung der aktuellen Kernel-Build-Umgebung.