Artikelverzeichnis
gettimeofday
gettimeofday
ist eine Funktion, die häufig auf UNIX und UNIX-ähnlichen Systemen verwendet wird, um den genauen Wert der aktuellen Uhrzeit und des aktuellen Datums zu ermitteln. Es befindet sich in <sys/time.h>
der Header-Datei und kann aufgerufen werden mit:
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
gettimeofday
Die Funktion akzeptiert zwei Parameter: struct timeval *tv
und struct timezone *tz
. tv
Ist ein timeval
Zeiger auf eine Struktur, die zum Speichern des erhaltenen Zeitwerts verwendet wird. tz
ist ein timezone
Zeiger auf eine Struktur, die zum Abrufen von Zeitzoneninformationen verwendet wird (in neueren Systemen ist dieser Parameter veraltet und kann übergeben werden NULL
).
timeval
Die Struktur ist wie folgt definiert:
struct timeval {
time_t tv_sec; // 秒数
suseconds_t tv_usec; // 微秒数
};
gettimeofday
Nachdem die Funktion erfolgreich ausgeführt wurde, werden die aktuellen Zeit- und Datumsinformationen in der Struktur gespeichert, tv
auf die der Parameter zeigt timeval
.
Hier ist ein gettimeofday
einfaches Beispiel für die Verwendung der Funktion zum Abrufen der aktuellen Uhrzeit:
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval tv;
if (gettimeofday(&tv, NULL) == 0) {
printf("Current time: %ld seconds, %ld microseconds\n", tv.tv_sec, tv.tv_usec);
} else {
printf("Failed to get the current time.\n");
}
return 0;
}
Beachten Sie, dass gettimeofday
0 für Erfolg und -1 für Fehler zurückgegeben wird. Bei Erfolg können die Sekunden- und Mikrosekundenwerte durch Zugriff auf die Felder tv.tv_sec
und abgerufen werden.tv.tv_usec
Es ist erwähnenswert, dass gettimeofday
die Funktion eine Zeitgenauigkeit im Mikrosekundenbereich bietet. In einigen neuen Systemen wird jedoch die Verwendung modernerer Funktionen empfohlen, z. B. , clock_gettime
die präzisere Zeitfunktionen bieten.
kmalloc
kmalloc
Es handelt sich um eine Funktion im Linux-Kernel, die zur dynamischen Zuweisung von Kernel-Speicherplatz verwendet wird. Dabei handelt es sich um einen vom Kernel bereitgestellten Speicherzuweisungsmechanismus, um zur Laufzeit Speicherblöcke zuzuweisen, die für Kernel-Code und -Daten verwendet werden können.
kmalloc
Der Prototyp der Funktion <linux/slab.h>
ist in der Header-Datei definiert und wird allgemein wie folgt verwendet:
void* kmalloc(size_t size, gfp_t flags);
size
Der Parameter gibt die Größe des zuzuordnenden Speicherblocks in Bytes an.flags
Parameter sind Flags, die zur Steuerung des Speicherzuweisungsverhaltens verwendet werden. Es kann sich um eines oder eine Kombination der folgenden Flags handeln:GFP_KERNEL
: Gibt die Zuweisung des regulären Kernel-Speichers an.GFP_ATOMIC
: Stellt die Zuweisung von atomarem Speicher dar und eignet sich für die Zuweisung von Speicher im Interrupt-Kontext oder in kritischen Bereichen, die durch Spin-Locks geschützt sind.GFP_DMA
: Gibt die Speicherzuteilung an, die für DMA-Vorgänge verwendet werden kann.- Andere Flags: Es gibt andere Flags, die verwendet werden können, um ein bestimmtes Speicherzuweisungsverhalten anzugeben, z.
GFP_NOWAIT
B.GFP_HIGHUSER
usw.
kmalloc
Die Funktion gibt einen Zeiger auf den zugewiesenen Speicherblock zurück oder kehrt zurück, wenn die Zuweisung fehlgeschlagen ist NULL
.
Es ist zu beachten, dass kmalloc
Sie nach Verwendung des zugewiesenen Speichers die entsprechende kfree
Funktion verwenden sollten, um den Speicher freizugeben, um Speicherlecks zu vermeiden.
Alles in allem kmalloc
handelt es sich um eine Funktion, die im Linux-Kernel zum dynamischen Zuweisen von Kernel-Speicherplatz verwendet wird. Dies bietet eine bequeme Möglichkeit, Speicherblöcke zur Laufzeit zuzuweisen und je nach Bedarf unterschiedliche Zuweisungsstrategien und Flags auszuwählen.
dev_t
dev_t
Ist ein Datentyp, der zur Darstellung von Gerätenummern im Linux-Kernel verwendet wird. Eine Gerätenummer ist ein Wert, der ein Gerät im System eindeutig identifiziert.
In Linux-Systemen können Geräte physische Geräte (z. B. Festplatten, serielle Schnittstellen usw.) oder virtuelle Geräte (z. B. virtuelle Dateisysteme, Pseudoterminals usw.) sein. Jedem Gerät wird eine eindeutige Gerätenummer zugewiesen, die zur Identifizierung und zum Zugriff auf das Gerät innerhalb des Kernels verwendet wird.
dev_t
Typvariablen bestehen normalerweise aus zwei Teilen: Hauptzahl und Nebenzahl. Hauptgerätenummern identifizieren den Gerätetyp, während Nebengerätenummern verschiedene Instanzen oder Partitionen desselben Gerätetyps identifizieren.
Im Benutzerbereich makedev
können Makros verwendet werden, um Haupt- und Nebengerätenummern zu einem einzigen dev_t
Gerätenummerntyp zu kombinieren. Zum Beispiel:
dev_t device = makedev(major_number, minor_number);
Anschließend können Sie MAJOR
die MINOR
Makros und verwenden, um die Haupt- und Nebengerätenummern aus der Gerätenummer zu extrahieren. Zum Beispiel:
unsigned int major = MAJOR(device);
unsigned int minor = MINOR(device);
In der Kernel-Entwicklung dev_t
werden Typgerätenummern häufig in Gerätetreibern verwendet, um Geräte eindeutig zu identifizieren und zu bedienen. Die Gerätenummer spielt eine wichtige Rolle bei der Registrierung des Geräts, beim Öffnen von Gerätedateien und beim Durchführen von Gerätevorgängen.
Int- Typ ohne Vorzeichen, 32 Bit, wird zum Definieren der Gerätenummer im Treiber verwendet. Die oberen 12 Bits sind die Hauptgerätenummer und die niedrigen 20 Bits sind die Nebengerätenummer.
Zusammenfassend lässt sich sagen, dev_t
dass es sich um den Datentyp handelt, der zur Darstellung der Gerätenummer im Linux-Kernel verwendet wird. Er besteht aus einer Hauptgerätenummer und einer Nebengerätenummer und wird zur eindeutigen Identifizierung des Geräts im System verwendet.
alloc_chrdev_region
alloc_chrdev_region
Es handelt sich um eine vom Linux-Kernel bereitgestellte Funktion zur dynamischen Zuweisung des Hauptgerätenummernbereichs von Zeichengeräten im Kernel.
In Linux-Systemen ist ein Zeichengerät eine spezielle Geräteklasse, die /dev/tty
den Zugriff auf das Gerät beispielsweise über eine Zeichengerätedatei ermöglicht. Jedes Zeichengerät verfügt über eine eindeutige Hauptnummer, die den Gerätetyp identifiziert.
alloc_chrdev_region
Der Prototyp der Funktion lautet wie folgt:
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, const char *name);
dev
ist eindev_t
Zeiger auf eine Variable vom Typ, die den zugewiesenen Bereich von Gerätenummern empfängt.firstminor
Ist die erste Nebengerätenummer im Bereich der zuzuweisenden Gerätenummern.count
Ist die Anzahl der Geräte innerhalb des zuzuordnenden Gerätenummernbereichs.name
ist ein optionaler Gerätename, der zum/proc/devices
Anzeigen von Geräteinformationen in verwendet wird.
Nach dem Aufruf alloc_chrdev_region
der Funktion weist der Kernel einen zusammenhängenden Bereich von Gerätenummern zu und speichert diese in dev
der Variablen, auf die der Zeiger zeigt. Die Hauptgerätenummer des zugewiesenen Gerätenummernbereichs wird MAJOR(*dev)
aus und die Nebengerätenummer MINOR(*dev)
aus abgerufen.
Dieser Funktion müssen die angegebene erste Nebengerätenummer firstminor (normalerweise 0), die Anzahl der zuzuweisenden Geräte count und der Gerätename übergeben werden. Die nach Aufruf dieser Funktion automatisch zugewiesene Gerätenummer wird in dev gespeichert.
Durch die dynamische Zuweisung von Gerätenummern können die Nachteile der manuellen Angabe von Gerätenummern vermieden werden, sie hat jedoch auch ihre eigenen Nachteile, dh es ist unmöglich, die /dev
Erstellung
Nachdem Sie den zugewiesenen Gerätenummernbereich nicht mehr verwendet haben, müssen Sie unregister_chrdev_region
den Bereich mithilfe einer Funktion freigeben. Zum Beispiel:
unregister_chrdev_region(*dev, count);
alloc_chrdev_region
und unregister_chrdev_region
Funktionen werden typischerweise während der Initialisierungs- und Bereinigungsphasen von Zeichengerätetreibern verwendet, um Gerätenummernbereiche zuzuweisen und freizugeben.
Zusammenfassend alloc_chrdev_region
handelt es sich um eine Funktion im Linux-Kernel, mit der der Hauptgerätenummernbereich von Zeichengeräten dynamisch zugewiesen wird. Sie bietet eine bequeme Möglichkeit, den Gerätenummernbereich zuzuweisen und ihn für die Registrierung und Verwendung von Zeichengeräten zu verwenden.
Es gibt zwei Methoden zur Vergabe von Gerätenummern: statisch und dynamisch. Statische Zuweisung ( register_chrdev_region()
Funktion) bedeutet, dass dem System eine bestimmte Anzahl von Gerätenummern zugewiesen wird, indem die erste Gerätenummer (die untergeordnete Gerätenummer ist normalerweise 0) über die Parameterfunktion angegeben wird, wenn die Hauptgerätenummer des Geräts im Voraus bekannt ist . Bei der dynamischen Zuweisung ( alloc_chrdev_region()
) wird nur die erste Nebengerätenummer (normalerweise 0, die Hauptgerätenummer ist nicht im Voraus bekannt) und die Anzahl der Geräte festgelegt, die über Parameter zugewiesen werden sollen, und das System weist die erforderliche Gerätenummer dynamisch zu. unregister_chrdev_region()
Geben Sie die zugewiesene (statische oder dynamische) Gerätenummer über die Funktion frei.
cdev
Initialisierung der statischen Speicherdefinition:
struct cdev my_cdev;
cdev_init(&my_cdev, &fops);
my_cdev.owner = THIS_MODULE;
Initialisierung der dynamischen Speicherdefinition:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &fops;
my_cdev->owner = THIS_MODULE;
int cdev_add(struct cdev *, dev_t, unsigned);
注册字符设备,传入 cdev 结构的指针,起始设备编号,
以及设备编号范围。cdev_del() 函数来释放 cdev 占用的内存。
kstrtoul
kstrtoul
ist eine im Linux-Kernel bereitgestellte Funktion zum Konvertieren einer Zeichenfolge in eine vorzeichenlose lange Ganzzahl ( unsigned long
).
Der Funktionsprototyp lautet wie folgt:
int kstrtoul(const char *s, unsigned int base, unsigned long *res);
s
ist die zu konvertierende Zeichenfolge.base
Es handelt sich um eine Basiszahl, die die Basis des durch die Zeichenfolge dargestellten Werts angibt. Dies kann ein Wert zwischen 2 und 36 sein. 0 bedeutet, dass die Basis automatisch anhand des Präfixes der Zeichenfolge beurteilt wird (z. B. hexadezimal)0x
.res
Ist einunsigned long
Zeiger auf eine Typvariable, die zum Empfangen des konvertierten Ergebnisses verwendet wird.
Die Funktion analysiert die Zeichenfolge s
in eine vorzeichenlose lange Ganzzahl und speichert das Ergebnis in res
der Variablen, auf die der Zeiger zeigt. Wenn die Konvertierung erfolgreich ist, gibt die Funktion 0 zurück. Wenn die Konvertierung fehlschlägt, wird ein entsprechender Fehlercode zurückgegeben.
kstrtoul
Funktionen werden im Kernel häufig verwendet, um vom Benutzerbereich übergebene Parameter oder Konfigurationselemente zu analysieren. Es bietet eine sichere und zuverlässige Möglichkeit, eine Zeichenfolge zur Verarbeitung und Verwendung im Kernel in eine vorzeichenlose lange Zeichenfolge umzuwandeln.
Zusammenfassend kstrtoul
handelt es sich um eine Funktion, die im Linux-Kernel zum Konvertieren einer Zeichenfolge in eine vorzeichenlose lange Ganzzahl verwendet wird und häufig zum Parsen von Parametern oder Konfigurationselementen verwendet wird, die vom Benutzerbereich übergeben werden. Es bietet eine sichere und zuverlässige Möglichkeit, die Konvertierung von Zeichenfolgen in Zahlen durchzuführen.