Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: OsDevNewbie am 22. May 2013, 21:44
-
Hallo,
ich wollte mal fragen, welche Geräte denn alle PCI benutzen (also z.B. ATA, USB, etc.). Ich versuche nämlich einen PCI-Treiber zu schreiben, um damit dann auf das CD-ROM Laufwerk oder die Festplatte zuzugreifen. Geht das überhaupt so?
-
Alle Geräte sind PCI-Geräte. Ausnahmen bestätigen die Regel und sind Legacy-Devices.
Mit einem PCI-Treiber kannst du nicht auf die Festplatte zugreifen. Aber du kannst den PCI-Treiber verwenden, um den Festplattentreiber (bzw. IDE-/SATA-Controllertreiber) zu schreiben.
-
Alle Geräte sind PCI- oder USB-Geräte. Ausnahmen bestätigen die Regel und sind Legacy-Devices.
Hab da mal einen wichtigen Fix eingebaut und vermute, dass immer noch was fehlt. ;)
-
Stimmt, wobei man jetzt argumentieren könnte, dass der USB selbst auch wieder ein PCI-Gerät ist. :evil:
Auf dem PC gibt es zusätzlich noch einen Haufen ACPI-Geräte und Sensoren werden z.B. via I²C angebunden.
-
Wenn man keinen Wert auf Korrektheit legt, kann man das. Der USB-Hostcontroller ist üblicherweise ein PCI-Gerät, aber nicht mein USB-Stick.
-
Der USB-Hostcontroller ist üblicherweise ein PCI-Gerät, aber nicht mein USB-Stick.
Ich habe auch nicht geschrieben, dass man mit einem PCI-Treiber auf deinen USB-Stick zugreifen kann. :-D Aber ohne PCI-Treiber kannst du keinen USB-Hostcontrollertreiber schreiben und ohne den wiederum kommst du nicht an deinen USB-Stick. (Die Legacy-Emulation mal ausgenommen.)
Fassen wir zusammen: Die meisten Geräte im PC brauchen mindestens einen PCI-Treiber, um benutzbar zu sein.
-
Mit einem PCI-Treiber kannst du nicht auf die Festplatte zugreifen. Aber du kannst den PCI-Treiber verwenden, um den Festplattentreiber (bzw. IDE-/SATA-Controllertreiber) zu schreiben.
Irgendwie verstehe ich das nicht ganz, kannst du das bitte genauer erklären?
-
Das ist vielleicht etwas schlecht ausgedrückt: Deine Festplatte hängt am SATA-Controller, und dieser ist wiederum via PCI(e) ans System angebunden. Wenn du nun deinen SATA-Controller ansprechen willst brauchst du einen PCI-Treiber. Damit kannst du dem Controller sagen was er tuen soll (vereinfacht gesagt).
-
Wenn man keinen Wert auf Kompatibilität legt und den PCI-Treiber eh nur benutzt, um an Port- und Speicheradressen und den Interrupt zu kommen bzw. eine Liste der angeschlossenen Geräte zu bekommen, kann man die Werte auch erst einmal hartkodieren, spätestens, wenn man das Betreibssystem auf mehr als einem Rechner laufen lassen will, gibt es dann aber wahrscheinlich Probleme.
-
Also ist es damit dann möglich, dem SATA-Controller zu sagen er soll die Daten in den Speicher laden, also das DMA-System von PCI nutzen? Ich habe nämlich gehört, dass dies mit fragmentierten Speicherbereichen arbeiten kann.
Noch einen Wunsch zu diesem Artikel hier (http://www.lowlevel.eu/wiki/PCI):
Es ist ja alles gut beschrieben, aber wie kann ich jetzt auf diese Geräte zugreifen bzw. ihnen Befehle senden?
-
Also ist es damit dann möglich, dem SATA-Controller zu sagen er soll die Daten in den Speicher laden, also das DMA-System von PCI nutzen? Ich habe nämlich gehört, dass dies mit fragmentierten Speicherbereichen arbeiten kann.
DMA arbeitet mit physischen Speicheradressen. Der Treiber muss virtuelle Adressen zuerst umwandeln oder gleich physische Speicherbereiche anfordern. Der physische Speicher muss zusammenhängend sein, eventuell reichen auch eine einzelne 4KB-Pages.
-
Also ist es damit dann möglich, dem SATA-Controller zu sagen er soll die Daten in den Speicher laden, also das DMA-System von PCI nutzen? Ich habe nämlich gehört, dass dies mit fragmentierten Speicherbereichen arbeiten kann.
Du meinst Scatter-Gather-Transfers. Nicht jedes Gerät kann das. Wenn dein SATA-Treiber erstmal funktioniert, kannst du darüber nachdenken, solche Transfers einzubauen - bis dahin solltest du das lassen. Ansonsten gilt das, was Dimension dazu gesagt hat.
Noch einen Wunsch zu diesem Artikel hier (http://www.lowlevel.eu/wiki/PCI):Es ist ja alles gut beschrieben, aber wie kann ich jetzt auf diese Geräte zugreifen bzw. ihnen Befehle senden?
Vom PCI-Treiber erfährst du die Port- und Speicheradressen, an denen das Gerät deine Kommunikation erwartet. Wie diese Kommunikation aussieht, hängt vom Gerät ab, dafür gibt es dann Extra-Spezifikationen.
PCI ist die Grundlage für Treiber, die PCI-Hardware ansteuern wollen. Nicht mehr und nicht weniger.
Gruß,
Svenska
-
Busmaster IDE hatte von Anfang an Scatter/Gather-Listen, dass die unterstützt werden kann man also zumindest für Platten ohne weiteres annehmen. Für die Interfaces sollte man das sowieso, wenn irgendeine Hardware das dann nicht kann, muss der Treiber es eben in mehrere Requests aufspalten.
-
PCI ist die Grundlage für Treiber, die PCI-Hardware ansteuern wollen. Nicht mehr und nicht weniger.
Also brauche ich dann einen PCI-Treiber für einen SATA-Treiber oder für einen IDE-Treiber?
-
Hallo,
noch eine Frage, wo finde ich denn diese Spezifikationen für die einzelnen Geräte?
Danke für die bisherige Hilfe.
-
Bei ein paar Standardgeräten sind sie in unserem Wiki verlinkt. Ansonsten entweder auf der Homepage des Herstellers, oder durch per Google aufgespürte - öhm, ich sag mal, dezentrale Sicherheitskopien nicht offensichtlich für die Öffentlichkeit gedachter Dokumente, oder einfach gar nicht. Sortiert von selten nach häufig.
Existierende Open-Source-Treiber lesen kann eine Lösung sein, wenn es keine Dokumentation gibt, aber da muss man sich natürlich an die jeweilige Lizenz halten oder extrem aufpassen, dass man nichts kopiert bzw. direkt nachschreibt.