Einführung in allgemeine Funktionen von Linux (3)


gettimeofday

gettimeofdayist 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);

gettimeofdayDie Funktion akzeptiert zwei Parameter: struct timeval *tvund struct timezone *tz. tvIst ein timevalZeiger auf eine Struktur, die zum Speichern des erhaltenen Zeitwerts verwendet wird. tzist ein timezoneZeiger auf eine Struktur, die zum Abrufen von Zeitzoneninformationen verwendet wird (in neueren Systemen ist dieser Parameter veraltet und kann übergeben werden NULL).

timevalDie Struktur ist wie folgt definiert:

struct timeval {
    
    
    time_t tv_sec;  // 秒数
    suseconds_t tv_usec;  // 微秒数
};

gettimeofdayNachdem die Funktion erfolgreich ausgeführt wurde, werden die aktuellen Zeit- und Datumsinformationen in der Struktur gespeichert, tvauf die der Parameter zeigt timeval.

Hier ist ein gettimeofdayeinfaches 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 gettimeofday0 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_secund abgerufen werden.tv.tv_usec

Es ist erwähnenswert, dass gettimeofdaydie Funktion eine Zeitgenauigkeit im Mikrosekundenbereich bietet. In einigen neuen Systemen wird jedoch die Verwendung modernerer Funktionen empfohlen, z. B. , clock_gettimedie präzisere Zeitfunktionen bieten.

kmalloc

kmallocEs 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.

kmallocDer 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);
  • sizeDer Parameter gibt die Größe des zuzuordnenden Speicherblocks in Bytes an.
  • flagsParameter 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_NOWAITB. GFP_HIGHUSERusw.

kmallocDie 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 kmallocSie nach Verwendung des zugewiesenen Speichers die entsprechende kfreeFunktion verwenden sollten, um den Speicher freizugeben, um Speicherlecks zu vermeiden.

Alles in allem kmallochandelt 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_tIst 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_tTypvariablen 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 makedevkönnen Makros verwendet werden, um Haupt- und Nebengerätenummern zu einem einzigen dev_tGerätenummerntyp zu kombinieren. Zum Beispiel:

dev_t device = makedev(major_number, minor_number);

Anschließend können Sie MAJORdie MINORMakros 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_twerden 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_tdass 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_regionEs 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/ttyden 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_regionDer Prototyp der Funktion lautet wie folgt:

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, const char *name);
  • devist ein dev_tZeiger auf eine Variable vom Typ, die den zugewiesenen Bereich von Gerätenummern empfängt.
  • firstminorIst die erste Nebengerätenummer im Bereich der zuzuweisenden Gerätenummern.
  • countIst die Anzahl der Geräte innerhalb des zuzuordnenden Gerätenummernbereichs.
  • nameist ein optionaler Gerätename, der zum /proc/devicesAnzeigen von Geräteinformationen in verwendet wird.

Nach dem Aufruf alloc_chrdev_regionder Funktion weist der Kernel einen zusammenhängenden Bereich von Gerätenummern zu und speichert diese in devder 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 /devErstellung

Nachdem Sie den zugewiesenen Gerätenummernbereich nicht mehr verwendet haben, müssen Sie unregister_chrdev_regionden Bereich mithilfe einer Funktion freigeben. Zum Beispiel:

unregister_chrdev_region(*dev, count);

alloc_chrdev_regionund unregister_chrdev_regionFunktionen werden typischerweise während der Initialisierungs- und Bereinigungsphasen von Zeichengerätetreibern verwendet, um Gerätenummernbereiche zuzuweisen und freizugeben.

Zusammenfassend alloc_chrdev_regionhandelt 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

kstrtoulist 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);
  • sist die zu konvertierende Zeichenfolge.
  • baseEs 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.
  • resIst ein unsigned longZeiger auf eine Typvariable, die zum Empfangen des konvertierten Ergebnisses verwendet wird.

Die Funktion analysiert die Zeichenfolge sin eine vorzeichenlose lange Ganzzahl und speichert das Ergebnis in resder 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.

kstrtoulFunktionen 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 kstrtoulhandelt 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.

Ich denke du magst

Origin blog.csdn.net/qq_44710568/article/details/131953418
Empfohlen
Rangfolge