*seufz*
Sagen wir es mal so, wenn dein Hardwaretreiber die Hardware wirklich ansprechen möchte - und da mag es durchaus sein, dass die zu verwendenden Ressourcen eben nicht frei programmierbar sind - dann muss der Treiber in der Lage sein, einen bestimmten physischen Bereich mappen zu können. Dass er das kann, unterscheidet ihn von einem Userspace-Prozess.
Angenommen, für jede Hardware gibt es einen Treiber, dann ist jeder von einer Hardware genutzter physischer Speicher durch irgendeinen Treiber belegt. Wenn du also auf Doppelbelegungen prüfst, dann kann der Treiber schonmal per se nicht auf fremde Hardwareressourcen zugreifen - also keine Sicherheitslücke.
Wenn aber jedes Programm (oder auch jeder Treiber) jederzeit nachschauen kann, wo im physischen Speicher irgendwelche Systemteile rumliegen, dann kann er diese auch überschreiben. Das ist wiederum eine Sicherheitslücke. Oder andersrum: Es gibt Exploits für Netzwerkkartentreiber (Angriff via Netzwerk, also von remote), um Code im Kernelmodus zur Ausführung zu bringen. Basiert aber darauf, dass der (gehackte) Netzwerkkartentreiber die physischen Adressen des Kernels kennt und per DMA überschreiben lässt. (Im speziellen Falle irgendwie 4-16 Bytes je nach Zusammensetzung des Pakets und daher recht umständlich, aber geht.) Das Mapping von physisch nach irgendwo ist also zuviel Information und wird ohnehin nicht gebraucht.
Die Ressourcen, die ein Treiber möchte, sollte man ihm schon geben können, wenn sie denn noch frei sind - denn der Treiber muss ja wissen, welche Ressourcen die Hardware nun gern hätte. Genau diese Information möchtest du aber dem Bussystem entnehmen. Ich glaube nicht, dass das in jedem Fall funktioniert. (Bspw. sind manche Hersteller dafür bekannt, im PCI-Konfigspace komisches Zeugs stehen zu haben, was da nicht unbedingt hingehört.) Andererseits gibt es wieder Silicon Bugs, um die der Treiber evtl. herumarbeiten muss.
Wenn dein RAM fragmentiert ist, hast du halt Pech. Die Einstellung bleibt. Du könntest ihn dann höchstens defragmentieren - da die physischen Adressen ja im Userspace nicht vorhanden sind, reicht ein bisschen MMU-Guruguru. Im Zweifelsfall machst du, wenn das nicht geht, dein DMA halt nur mit 4K-Blöcken oder PIO als Rückfallstrategie. Das Problem ist das gleiche, wie RAM voll mit nicht-auslagerungsfähigem Speicher. Da kann man irgendwann nichts mehr tun.
Dein Ansatz, bei fragmentiertem physischem Speicher einfach die DMA-Zugriffe zu verteilen und dann virtuell einen zusätzlichen linearen Cache anzulegen, bringt wenig. Die Anwendungen müssen die Daten ohnehin im Block kriegen, da ist es auch einfach sinnvoller, es gleich im physischen Block zu reservieren und das zu übergeben. Sparst du dir einmal das Kopieren der Daten. Alternative: Ich habe nicht verstanden, was du meintest.
Ich denke, die einfachste Variante ist es, in jedem Treiber eine Rückfallstrategie zu haben. Das kann PIO sein, das kann aber auch einfach eine minimale Blockgröße von 4K sein. Oder aber - bei nichtkritischen Treibern - geht es dann einfach nicht. Wenn deine Webcam die Daten in ein System pumpt, was eh schon soweit hinüber ist, dass nichts mehr so recht geht, dann wird das auch bröckchenweise nicht unbedingt besser. Außerdem musst du deine Speicherverwaltung schon hinreichend verkorkst haben, dass du physisch jede zweite Page belegt hast und die dazwischen nicht. Die Wahrscheinlichkeit geht gegen null - das ist das gleiche wie mit Deadlocks. Eine sinnvolle Strategie ist den Kopf in den Sand zu stecken und zu sagen "passiert nicht - und wenn doch: Pech". Dann muss der User halt mal was ändern.
@taljeth: Und meine.
Gruß
Sagen wir es mal so, wenn dein Hardwaretreiber die Hardware wirklich ansprechen möchte - und da mag es durchaus sein, dass die zu verwendenden Ressourcen eben nicht frei programmierbar sind - dann muss der Treiber in der Lage sein, einen bestimmten physischen Bereich mappen zu können. Dass er das kann, unterscheidet ihn von einem Userspace-Prozess.
Angenommen, für jede Hardware gibt es einen Treiber, dann ist jeder von einer Hardware genutzter physischer Speicher durch irgendeinen Treiber belegt. Wenn du also auf Doppelbelegungen prüfst, dann kann der Treiber schonmal per se nicht auf fremde Hardwareressourcen zugreifen - also keine Sicherheitslücke.
Wenn aber jedes Programm (oder auch jeder Treiber) jederzeit nachschauen kann, wo im physischen Speicher irgendwelche Systemteile rumliegen, dann kann er diese auch überschreiben. Das ist wiederum eine Sicherheitslücke. Oder andersrum: Es gibt Exploits für Netzwerkkartentreiber (Angriff via Netzwerk, also von remote), um Code im Kernelmodus zur Ausführung zu bringen. Basiert aber darauf, dass der (gehackte) Netzwerkkartentreiber die physischen Adressen des Kernels kennt und per DMA überschreiben lässt. (Im speziellen Falle irgendwie 4-16 Bytes je nach Zusammensetzung des Pakets und daher recht umständlich, aber geht.) Das Mapping von physisch nach irgendwo ist also zuviel Information und wird ohnehin nicht gebraucht.
Die Ressourcen, die ein Treiber möchte, sollte man ihm schon geben können, wenn sie denn noch frei sind - denn der Treiber muss ja wissen, welche Ressourcen die Hardware nun gern hätte. Genau diese Information möchtest du aber dem Bussystem entnehmen. Ich glaube nicht, dass das in jedem Fall funktioniert. (Bspw. sind manche Hersteller dafür bekannt, im PCI-Konfigspace komisches Zeugs stehen zu haben, was da nicht unbedingt hingehört.) Andererseits gibt es wieder Silicon Bugs, um die der Treiber evtl. herumarbeiten muss.
Wenn dein RAM fragmentiert ist, hast du halt Pech. Die Einstellung bleibt. Du könntest ihn dann höchstens defragmentieren - da die physischen Adressen ja im Userspace nicht vorhanden sind, reicht ein bisschen MMU-Guruguru. Im Zweifelsfall machst du, wenn das nicht geht, dein DMA halt nur mit 4K-Blöcken oder PIO als Rückfallstrategie. Das Problem ist das gleiche, wie RAM voll mit nicht-auslagerungsfähigem Speicher. Da kann man irgendwann nichts mehr tun.
Dein Ansatz, bei fragmentiertem physischem Speicher einfach die DMA-Zugriffe zu verteilen und dann virtuell einen zusätzlichen linearen Cache anzulegen, bringt wenig. Die Anwendungen müssen die Daten ohnehin im Block kriegen, da ist es auch einfach sinnvoller, es gleich im physischen Block zu reservieren und das zu übergeben. Sparst du dir einmal das Kopieren der Daten. Alternative: Ich habe nicht verstanden, was du meintest.
Ich denke, die einfachste Variante ist es, in jedem Treiber eine Rückfallstrategie zu haben. Das kann PIO sein, das kann aber auch einfach eine minimale Blockgröße von 4K sein. Oder aber - bei nichtkritischen Treibern - geht es dann einfach nicht. Wenn deine Webcam die Daten in ein System pumpt, was eh schon soweit hinüber ist, dass nichts mehr so recht geht, dann wird das auch bröckchenweise nicht unbedingt besser. Außerdem musst du deine Speicherverwaltung schon hinreichend verkorkst haben, dass du physisch jede zweite Page belegt hast und die dazwischen nicht. Die Wahrscheinlichkeit geht gegen null - das ist das gleiche wie mit Deadlocks. Eine sinnvolle Strategie ist den Kopf in den Sand zu stecken und zu sagen "passiert nicht - und wenn doch: Pech". Dann muss der User halt mal was ändern.
@taljeth: Und meine.

Gruß

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

(Die Ressourcen können geändert werden und das ist auch vorgesehen)