Warum werden `copy_from_user()` und `copy_to_user()` benötigt, wenn der Kernel in denselben virtuellen Adressraum wie der Prozess selbst abgebildet wird?

Warum werden `copy_from_user()` und `copy_to_user()` benötigt, wenn der Kernel in denselben virtuellen Adressraum wie der Prozess selbst abgebildet wird?

Warum werden copy_from_user()sie copy_to_user()benötigt, wenn der Kernel in denselben virtuellen Adressraum abgebildet wird wie der Prozess selbst?

Nachdem ich zu Lernzwecken einige (Spielzeug-)Kernelmodule entwickelt hatte, wurde mir schnell klar, dass copy_from_user()diese copy_to_user()zum Kopieren von Daten aus/in Benutzerbereichspuffer erforderlich waren, da andernfalls Fehler im Zusammenhang mit ungültigen Adressen zu Abstürzen führten.

Wenn aber 0x1fffffeine virtuelle Adresse auf einen Benutzerspeicherpuffer verweist, warum ist diese Adresse dann im Kernel nicht gültig? Der Kernel befindet sich im selben virtuellen Adressraum und 0x1fffffwäre daher demselben physischen Speicher zugeordnet.

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Antwort1

Die Adressraumzuordnung ist auf einigen (nicht allen!) Architekturen gleich, aber selbst auf Architekturen mit gleicher Zuordnung sind die Schutzebenen unterschiedlich. copy_from_userusw. dienen drei Hauptzwecken:

  • Sie prüfen, ob die Berechtigungen für den Speicher, aus dem gelesen oder in den geschrieben werden soll, es dem im Benutzerbereich ausgeführten Prozess erlauben, aus dem Speicher zu lesen oder in ihn zu schreiben. Dadurch wird sichergestellt, dass Prozesse den Kernel nicht dazu verleiten können, auf Speicher zuzugreifen, auf den der Prozess nicht zugreifen dürfen sollte.
  • Sie ermöglichen eine spezifische Fehlerbehandlung, sodass Schutzfehler den Kernel nicht zum Absturz bringen, beispielsweise wenn die angeforderten Adressen derzeit nicht zugeordnet sind (denken Sie an Nullseiten oder ausgelagerte Seiten).
  • Sie stellen sicher, dass der Kernel seinen eigenen Schutz nicht überwindet.z.B SMAPoder kernelspezifische Adressräume (S/390).

Einige Architekturen verwenden Speicherlayouts, die es diesen Funktionen ermöglichen, Abkürzungen zu nehmen,z.Bmithilfe einer direkten Zuordnung des physischen Speichers, aber Sie können nicht davon ausgehen, dass dies der Fall ist, und es werden ohnehin nicht alle Situationen behandelt (ausgelagerte Seiten sind im physischen Speicher nicht vorhanden).

verwandte Informationen