Wie verhindert der Kernel, dass ein Schadprogramm den gesamten physischen Arbeitsspeicher liest?

10

Wenn ich ein Programm schreibe, das versucht, Speicher an jeder möglichen Adresse zu lesen, und es unter einem "vollen" Unix ausführe, kann es nicht auf den gesamten physischen RAM zugreifen. Aber wie verhindert das Betriebssystem dies?

Ich bin eher mit kleinen CPU-Architekturen vertraut, bei denen jeder Assembler-Code auf alles zugreifen kann. Ich verstehe nicht, wie ein Programm (der Kernel) solche böswilligen Operationen erkennen kann.

nowox
quelle
2
Normalerweise sorgt die MMU dafür, dass Sie nicht auf Speicher außerhalb Ihrer zulässigen Bereiche zugreifen können.
ott--
1
Nun, die MMU wird von der Assembly konfiguriert. Somit kann ein Assemblycode die MMU-Konfiguration ändern und auf eine andere Speicherseite zugreifen, oder?
Nowox
Dies gilt nur, wenn Sie Ihren Code als root ausführen.
ott--
2
Sie sollten sich über Seitentabellen und die darin enthaltene Kernel-Abstraktion informieren.
Clarus
@ott: Selbst root kann die MMU nicht ändern (zumindest nicht unter Linux). Nur der Kernel tut es.
Basile Starynkevitch

Antworten:

12

Es ist nicht der Kernel, der schlechte Speicherzugriffe verhindert, sondern die CPU. Die Rolle des Kernels besteht nur darin, die CPU korrekt zu konfigurieren.

Genauer gesagt ist die MMU die Hardwarekomponente, die fehlerhafte Speicherzugriffe verhindert . Wenn ein Programm auf eine Speicheradresse zugreift, wird die Adresse von der CPU basierend auf dem Inhalt der MMU decodiert. Die MMU erstellt eine Übersetzung von virtuellen Adressen in physische Adressen: Wenn die CPU eine bestimmte virtuelle Adresse lädt oder speichert, berechnet sie die entsprechende physische Adresse basierend auf dem MMU-Inhalt. Der Kernel stellt die MMU-Konfiguration so ein, dass jedes Programm nur auf den Speicher zugreifen kann, auf den es Anspruch hat. Die Speicher- und Hardwareregister anderer Programme werden im Speicher eines Programms überhaupt nicht zugeordnet: Diese physischen Adressen haben in der MMU-Konfiguration für dieses Programm keine entsprechende virtuelle Adresse.

Bei einem Kontextwechsel zwischen verschiedenen Prozessen ändert der Kernel die MMU-Konfiguration so, dass sie die gewünschte Übersetzung für den neuen Prozess enthält.

Einige virtuelle Adressen werden überhaupt nicht zugeordnet, dh die MMU übersetzt sie in einen speziellen Wert "Keine solche Adresse". Wenn der Prozessor eine nicht zugeordnete Adresse dereferenziert, führt dies zu einem Trap: Der Prozessor verzweigt zu einer vordefinierten Position im Kernelcode. Einige Fallen sind legitim; Beispielsweise könnte die virtuelle Adresse einer Seite entsprechen, die sich im Swap-Bereich befindet. In diesem Fall lädt der Kernel-Code den Seiteninhalt aus dem Swap und wechselt dann wieder zum ursprünglichen Programm, sodass die Speicherzugriffsanweisung erneut ausgeführt wird. Andere Traps sind nicht legitim. In diesem Fall empfängt der Prozess ein Signal, das das Programm standardmäßig sofort beendet (und wenn nicht, zum Signalhandler im Programm verzweigt: In jedem Fall ist der Speicherzugriffsbefehl nicht abgeschlossen).

Gilles 'SO - hör auf böse zu sein'
quelle
Könnten Sie ein bisschen die Anweisung "Die Adresse wird von der CPU basierend auf dem Inhalt der MMU dekodiert" angeben ? Gibt es einen aktuellen Code im laufenden Programm, der Adressen dekodiert? Oder wenn eine CPU auf eine Adresse zugreift - erfolgt der Zugriff auf die MMU, die diese ordnungsgemäß übersetzt / verarbeitet (Zugriff auf den Speicher oder den Cache und Rückgabe des Ergebnisses oder Auslösen einer Kernelprozedur)? Aus Sicht des Mikrocontrollers / der Baugruppe ist die MMU ein neues Teil. Die CPU ist nicht direkt mit dem Speicher verbunden, sondern mit der MMU. Dort erfolgt die Abstraktion des virtuellen Speichers.
Xealits
3
@xealits Die Übersetzung von der virtuellen Adresse in die physische Adresse erfolgt innerhalb der MMU, einer Hardware-Schaltung. Es gibt keinen Code dafür im Programm oder im Kernel. Der Kernel wird nur in Ausnahmefällen aufgerufen, wenn das Programm versucht, auf eine virtuelle Adresse zuzugreifen, für die der MMU-Eintrag "ungültige Adresse" lautet. Der Kernel konfiguriert auch die Register und Tabellen im RAM, die die MMU verwendet.
Gilles 'SO - hör auf böse zu sein'