Detaillierte Erläuterung der häufig verwendeten Funktionen copy_from_user open read write in der Linux-Treiberentwicklung

Detaillierte Erläuterung der häufig verwendeten Funktionen copy_from_user open read write in der Linux-Treiberentwicklung

Gemeinsame Funktionen von Linux-Treibern (copy_from_user öffnen lesen schreiben)

1.öffnen

Funktionsdefinition:
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
Parameterbeschreibung:
Pfadname: Der Name der Datei, der (absolute und relative) Pfade enthalten kann
Flags: Dateiöffnungsmodus
Modus: Wird verwendet, um die Zugriffsrechte des Dateibesitzers, der Benutzergruppe der Datei und anderer Benutzer im System zu definieren. Die Dateiberechtigungen lauten: Modus&(~umask)
Funktionsbeschreibung:
Der Pfadname-Parameter zeigt auf die zu öffnende Dateipfadzeichenfolge. Die folgenden Flags können mit dem Flags-Parameter verwendet werden:

  • O_RDONLY öffnet die Datei im schreibgeschützten Modus;
  • O_WRONLY öffnet die Datei nur zum Schreiben;
  • O_RDWR öffnet die Datei im Lese- und Schreibmodus;

Die oben genannten drei Flags schließen sich gegenseitig aus, d. h. sie können nicht gleichzeitig verwendet werden, können aber mit dem ODER-Operator (|) mit den folgenden Flags kombiniert werden;

  • O_CREAT Wenn die zu öffnende Datei nicht existiert, wird die Datei automatisch erstellt;
  • O_EXCL Wenn auch O_CREAT gesetzt ist, prüft dieser Befehl, ob die Datei existiert. Wenn die Datei nicht existiert, wird sie erstellt. Andernfalls tritt beim Öffnen der Datei ein Fehler auf. Darüber hinaus schlägt das Öffnen der Datei fehl, wenn O_CREAT und O_EXCL gleichzeitig festgelegt sind und die zu öffnende Datei ein symbolischer Link ist.
  • O_NOCTTY: Wenn es sich bei der zu öffnenden Datei um ein Terminalgerät handelt, wird das Terminal nicht als Prozesssteuerungsterminal verwendet.
  • O_TRUNC Wenn die Datei existiert und im Schreibmodus geöffnet wird, löscht dieses Flag die Dateilänge auf 0 und die ursprünglich in der Datei gespeicherten Daten verschwinden.
  • O_APPEND Beim Lesen oder Schreiben einer Datei werden die Daten an das Ende der Datei angehängt.
  • O_NONBLOCK öffnet die Datei auf eine nicht blockierbare Weise, das heißt, sie kehrt sofort zum Prozess zurück, unabhängig davon, ob Daten zum Lesen oder Warten vorhanden sind.
  • O_NDELAY ist dasselbe wie O_NONBLOCK;
  • O_SYNC öffnet die Datei synchron;
  • O_NOFOLLOW Wenn die Datei, auf die der Parameter Pfadname verweist, ein symbolischer Link ist, schlägt das Öffnen der Datei fehl.
  • O_DIRECTORY Wenn die Datei, auf die der Parameter Pfadname verweist, kein Verzeichnis ist, schlägt das Öffnen der Datei fehl.

Dies ist ein Flag, das speziell für Linux 2.2 und höher gilt, um einige Systemsicherheitsprobleme zu vermeiden. Der Parametermodus hat die folgenden Kombinationen, die nur beim Erstellen einer neuen Datei wirksam werden. Darüber hinaus werden die Berechtigungen beim tatsächlichen Erstellen einer Datei durch den Umask-Wert beeinflusst, daher sollten die Dateiberechtigungen (mode-umaks) sein.

  • S_IRWXU00700-Berechtigung, was bedeutet, dass der Dateibesitzer Lese-, Schreib- und Ausführungsberechtigungen hat;
  • S_IRUSR oder S_IREAD, 00400 Berechtigungen, was bedeutet, dass der Dateibesitzer Leseberechtigung hat;
  • **S_IWUSR oder S_IWRITE, 00200 **Berechtigung, die angibt, dass der Dateibesitzer Schreibberechtigung hat;
  • S_IXUSR oder S_IEXEC, 00100-Berechtigungen, was bedeutet, dass der Dateibesitzer über Ausführungsberechtigungen verfügt;
  • S_IRWXG 00070-Berechtigungen, was bedeutet, dass die Dateibenutzergruppe über Lese-, Schreib- und Ausführungsberechtigungen verfügt;
  • S_IRGRP 00040-Berechtigung, die angibt, dass die Dateibenutzergruppe Leseberechtigung hat;
  • S_IWGRP 00020-Berechtigung, die angibt, dass die Dateibenutzergruppe Schreibberechtigung hat;
  • S_IXGRP 00010-Berechtigung, die angibt, dass die Dateibenutzergruppe über Ausführungsberechtigung verfügt;
  • S_IRWXO 00007-Berechtigung, was bedeutet, dass andere Benutzer Lese-, Schreib- und Ausführungsberechtigungen haben;
  • S_IROTH 00004-Berechtigung, die angibt, dass andere Benutzer über Leseberechtigung verfügen;
  • S_IWOTH 00002-Berechtigung, die angibt, dass andere Benutzer Schreibberechtigung haben;
  • S_IXOTH 00001-Berechtigung, die angibt, dass andere Benutzer über Ausführungsberechtigung verfügen.

Rückgabewert:
Wenn alle zu prüfenden Berechtigungen die Prüfung bestehen, wird der Wert 0 zurückgegeben, was auf Erfolg hinweist. Wenn eine Berechtigung verweigert wird, wird -1 zurückgegeben.

Fehlercode:
EEXIST: Die durch den Parameter Pfadname referenzierte Datei existiert bereits, aber die Flags O_CREAT und O_EXCL werden verwendet.
EACCESS: Die Datei, auf die der Parameter Pfadname verweist, verfügt nicht über die für den Test erforderlichen Berechtigungen.
EROFS: Die auf Schreibberechtigung zu testende Datei liegt in einem schreibgeschützten Dateisystem vor.
EFAULT: Der Parameter-Pfadname-Zeiger überschreitet den zugänglichen Speicherplatz.
EINVAL Der Parametermodus ist falsch;
ENAMETOOLONG Der Parameterpfadname ist zu lang;
ENOTDIR Der Parameterpfadname ist kein Verzeichnis;
ENOMEM Nicht genügend Kernelspeicher;
ELOOP Der Parameterpfadname hat zu viele symbolische Links.
EIO E/A-Zugriffsfehler.

#enthalten
#enthalten
#enthalten
#enthalten
hauptsächlich()
{
    int fd,Größe;
    char s[]=”Linux-Programmierer!\n”,buffer[80];
    fd = öffnen("/tmp/temp", O_WRONLY | O_CREAT);
    schreibe(fd,s,sizeof(s));
    schließen(fd);
    fd = öffnen ("/tmp/temp", O_RDONLY);
    Größe=lesen(fd,Puffer,Größevon(Puffer));
    schließen(fd);
    printf("%s",Puffer);
}

2.lesen

Funktionsdefinition:
ssize_t read(int fd, void * buf, size_t count);

Funktionsbeschreibung:
read() überträgt count Bytes aus der Datei, auf die der Parameter fd zeigt, in den Speicher, auf den der Zeiger buf zeigt.

Rückgabewert:
Der Rückgabewert ist die Anzahl der tatsächlich gelesenen Bytes. Wird 0 zurückgegeben, bedeutet dies, dass das Dateiende erreicht wurde oder keine weiteren Daten zum Lesen vorhanden sind. Wenn der Zählparameter 0 ist, hat read() keine Wirkung und gibt 0 zurück.

Beachten:
Wenn beim Lesen die Daten in fd kleiner sind als die zu lesenden Daten, führt dies zu einer Blockierung.
Die Verwendung von Lesen ist einfacher als Schreiben, daher werde ich hier nicht ins Detail gehen. Da die Kompetenz des Autors begrenzt ist, möchte ich Sie bitten, etwaige Fehler im Artikel darauf hinzuweisen, um zu vermeiden, dass alle in die Irre geführt werden.

3.schreiben

Funktionsdefinition:
ssize_t write (int fd, const void * buf, size_t count);

Funktionsbeschreibung:
write() schreibt count Bytes aus dem Speicher, auf den der Parameter buf zeigt, in die Datei, auf die der Parameter zeigt.

Rückgabewert:
Wenn alles gut geht, gibt write() die Anzahl der tatsächlich geschriebenen Bytes zurück. Wenn ein Fehler auftritt, wird -1 zurückgegeben und der Fehlercode in errno gespeichert.
(1) Der Rückgabewert der Funktion write() ist normalerweise ungleich 0. Nur in folgender Situation wird 0 zurückgegeben: Der dritte Parameter in write(fp, p1+len, (strlen(p1)-len) ist 0. In diesem Fall tut write() nichts und gibt nur 0 zurück. Die Beschreibung des Rückgabewerts von write() im man-Handbuch lautet wie folgt:
(2) Wenn die Funktion write() Daten von buf nach fd schreibt und die Daten in buf nicht alle auf einmal gelesen werden können, wird sich der Lesepositionszeiger (also der zweite Parameter buf) beim zweiten Lesen der Daten in buf nicht automatisch bewegen. Der Programmierer muss dies programmgesteuert steuern, anstatt einfach die erste Adresse von buf in den zweiten Parameter einzutragen. Beispielsweise kann die Leseposition im folgenden Format verschoben werden: write(fp, p1+len, (strlen(p1)-len). Auf diese Weise schreibt die zweite Schreibschleife Daten von p1+len nach fp und dasselbe gilt für den Rest, bis (strlen(p1)-len 0 wird.

Das folgende Beispiel veranschaulicht die Verwendung der Schreibfunktion:

#enthalten 
#enthalten 
#enthalten 
int main()
{
  char *p1 = "Dies ist ein AC-Testcode";
  flüchtige int len ​​= 0;
 
  int fp = öffnen("/home/test.txt", O_RDWR|O_CREAT);
  für(;;)
  {
     int n;
 
     wenn ((n=write(fp, p1+len, (strlen(p1)-len)))== 0) //wenn ((n=write(fp, p1+len, 3)) == 0) 
     { //strlen(p1) = 21
         printf("n = %d \n", n);
         brechen;
     }
     Länge+=n;
  }
  gebe 0 zurück;
}

(3) Innerhalb des maximalen Datenbereichs, der auf einmal geschrieben werden kann (anscheinend BUFSIZ, 8192), sollte der dritte Parameter count vorzugsweise der Größe der Daten in buf entsprechen, um Fehler zu vermeiden. (Nach einem weiteren Test stellte ich fest, dass die maximale Anzahl an Daten, die gleichzeitig geschrieben werden können, nicht 8192 beträgt. Ich habe versucht, 81920000 auf einmal zu schreiben, und das Ergebnis war auch in Ordnung. Es scheint, dass die maximale Anzahl an Daten, die gleichzeitig geschrieben werden können, nicht 8192 beträgt. Es gibt jedoch tatsächlich einen Parameter namens BUFSIZ im Kernel, und seine spezifische Bedeutung muss noch untersucht werden.)

4.In Benutzer kopieren

Funktionsdefinition:
unsigned long copy_to_user(void *to, const void *from, unsigned long n)
Parameterbeschreibung:
an: Zieladresse (Benutzerbereich)
von: Quelladresse (Kernel Space)
n: Die Anzahl der zu kopierenden Datenbytes
Funktionsbeschreibung:
Lesen Sie Daten vom Kernelspeicher in den Benutzerspeicher
Rückgabewert:
Bei Erfolg wird 0 zurückgegeben. Bei einem Fehler wird die Anzahl der Datenbytes zurückgegeben, die nicht erfolgreich kopiert wurden.

5.vom_Benutzer kopieren

Funktionsdefinition:
unsigned long copy_from_user(void *to, const void *from, unsigned long n);
Parameterbeschreibung:
an: Zieladresse (Kernelspace)
von: Quelladresse (Benutzerbereich)
n: Die Anzahl der zu kopierenden Datenbytes
Funktionsbeschreibung:
Lesen Sie Daten vom Benutzerbereich in den Kernelbereich
Rückgabewert:
Bei Erfolg wird 0 zurückgegeben. Bei einem Fehler wird die Anzahl der Datenbytes zurückgegeben, die nicht erfolgreich kopiert wurden.

Oben sind die Details der häufig verwendeten Funktionen von Linux-Treibern (copy_from_user öffnen, lesen, schreiben) aufgeführt. Weitere Informationen zu häufig verwendeten Funktionen von Linux-Treibern finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! , ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Überwachung sowie Betrieb und Wartung von Linux-Diensten
  • Eine detaillierte Einführung in die Grundlagen des Linux-Scriptings
  • Einführung in die Containerfunktion of() in der Linux-Kernel-Programmierung
  • Implementierungsschritte zum Entwickeln von Linux C++-Programmen in VS2019
  • Linux Advanced Learning Manual (Teil 2)
  • Linux Advanced Learning Manual (Teil 1)
  • Lernhandbuch - Linux-Grundlagen

<<:  MySQL-Datenbankgrundlagen - Prinzip der Join-Operation

>>:  Detaillierte Erklärung der Größe des Boxmodells, abhängig von seinen Polsterungs-, Rand- und Rahmenwerten

Artikel empfehlen

Schritte zur Lösung des Zeitzonenproblems in MySQL 8.0

Softwareversion Windows: Windows 10 MySQL: mysql-...

Detaillierte Erklärung des Typschutzes in TypeScript

Inhaltsverzeichnis Überblick Typzusicherungen in ...

Zusammenfassung der Erfahrungen beim Website-Erstellen

<br />Welche Grundsätze sollten beachtet wer...

Vue implementiert die Countdown-Komponente für zweite Kills

In diesem Artikel wird der spezifische Code von V...

Lernen Sie MySQL auf einfache Weise

Vorwort Die Datenbank war schon immer meine Schwa...

HTML-Code zum Hinzufügen von Symbolen zum transparenten Eingabefeld

Ich habe vor Kurzem eine Website mit Anwaltsempfe...

Designtheorie: Zehn Tipps zur Inhaltspräsentation

<br /> Der Entwurf einer persönlichen Schrei...

js verwendet Cookies, um die Seitenvorgänge des Benutzers zu speichern

Vorwort Während des Entwicklungsprozesses stoßen ...

Details zum Like-Operator in MySQL

1. Einleitung Beim Filtern unbekannter oder teilw...

MySQL-Installationsinformationen unter Linux-Server anzeigen

Sehen Sie sich die Installationsinformationen von...

Detaillierter Installationsprozess der MySQL 8.0 Windows-ZIP-Paketversion

Der Installationsprozess von MySQL 8.0 Windows Zi...

So implementieren Sie Datenpersistenz mit dem Vuex-Drittanbieterpaket

Zweck: Ermöglichen Sie die gleichzeitige lokale S...

Verwendung von Linux-Netzwerkkonfigurationstools

Dieser Artikel stellt RHEL8-Netzwerkdienste und N...