Lesen oder setzen Sie Register im Motherboard

Mit Mikrocontrollern ist es ziemlich einfach, eine LED ein- und auszuschalten, indem man auf ein Register schreibt.

Diese Frage ist stattdessen ein Versuch, in ein PCI-Geräteregister in einem Desktop-Computer zu schreiben.

Auf ähnliche Weise möchte ich die Register im Motherboard lesen / schreiben, um Lüfter (ein, aus oder sogar die Geschwindigkeit) oder die Betriebs- oder Festplatten-LEDs oder Temperatursensoren zu steuern.

Ist das beispielsweise bei einem Asus-Motherboard und einem Linux-Betriebssystem möglich? Und was für ein Datenblatt sollte gelesen werden, falls vorhanden, um die Registernamen im Motherboard zu erhalten? Ich habe für ein Consumer-Motherboard nie so etwas wie das Datenblatt eines Mikrocontrollers gefunden.

Werfen Sie einen Blick auf die Datenblätter der Intel-Motherboard-Chipsätze auf deren Website.
Für Linux werfen Sie einen Blick auf "lm-Sensors".
Power-LED, fest verdrahtet. HD-LED, fest verdrahtet, Lüfter, nur wenn nicht fest verdrahtet, Temperatursensoren, nur lesen. Nichts von dem, was Sie wollen, wird normalerweise von den meisten Motherboards gpio-gesteuert.
Wenn Sie über einen PCI-Bus mit dem Motherboard kommunizieren möchten, benötigen Sie so etwas. ics.uci.edu/~harris/ics216/pci/PCI_22.pdf

Antworten (2)

Die Dokumentation ist zweifellos vorhanden. Nicht immer frei verfügbar, aber es existiert.

Es gibt immer Linux- und BSD-Quellcode, den Sie auch lesen können, wenn sie diese Peripheriegeräte unterstützen, los geht's (ja, ich weiß, das ist nicht immer leicht zu lesen).

Wenn es bereits einen Gerätetreiber für dieses Peripheriegerät gibt, lernen Sie, wie Sie mit diesem Gerätetreiber kommunizieren. lm-Sensoren wie pjc50 kommentiert ist ein Beispiel.

Wenn nicht, können Sie den Betriebssystemschutz oft mit mmap() durchbrechen und von der Anwendung aus direkt mit den Dingen sprechen. Je nachdem, was Sie zu tun versuchen (Motherboard-Testgerät, PCI-Karten-Testgerät usw.), kann dies ausreichen. Der richtige Weg, dies zu tun, besteht darin, einen Kernel-Treiber zu modifizieren oder zu schreiben und mit/durch ihn zu sprechen, um an das Peripheriegerät zu gelangen. Der Treiber kann so dünn oder dick sein, wie Sie möchten, aber zumindest die letzte Meile der Schreib-/Lesevorgänge kommt vom Kernelspace nicht Anwendung.

Beachten Sie, dass DOS immer noch für Motherboard- und andere Tests verwendet wird, da es eines der besten Bare-Metal-Betriebssysteme ist (absichtliches Oxymoron). Wenn Sie eng mit einem Motherboard-Unternehmen zusammenarbeiten, stellen Sie möglicherweise den Quellcode oder Codeschnipsel aus seinen Testprogrammen zur Verfügung, die LEDs blinken oder lesen Sie den Temperatursensor usw.

Ja, die Motherboard-Dokumentation, auch wenn Sie Zugriff haben, ist nicht dasselbe wie ein Mikrocontroller, das Publikum ist anders, es sind oft nur die Bios-Programmierer (Auftragnehmer) und interne Testleute, die die Dokumentation benötigen, und das ist es, also könnte es sich um Kritzeleien handeln ein Whiteboard.

Als PC ist das, was ein Betriebssystem benötigt, durch Konvention definiert oder auffindbar, sodass Sie keine Dokumentation benötigen, sondern nur programmgesteuert nach Dingen suchen und finden, was vorhanden ist. Je nach Bedarf, basierend auf dem, was Sie finden, gehen Sie dann auf die Website des jeweiligen Chipanbieters, um das Datenblatt (das sich wie ein Mikrocontroller liest) für diesen Teil zu erhalten. Irgendein PCI-Bridge-Chip von Intel, genau dort auf der Intel-Website. Eine USB-Bridge oder Master, gleiche Sache. Grafikkarte, nun, sie sind möglicherweise nicht so offen. Festplattencontroller, finden Sie das Datenblatt. Ethernet, finden Sie das Datenblatt und lesen Sie es. lspci ist dein Freund. lsusb ist dein Freund. Google ist dein Freund.

Im Gegensatz zu lspci gibt es möglicherweise keine vorhandenen Befehlszeilenprogramme, die den Schutz des Betriebssystems durchdringen und es Ihnen ermöglichen, an allem herumzustochern, was Sie wollen. Je nachdem, was und wo es ist, müssen Sie möglicherweise ein Programm schreiben, und hier kommt mmap() ins Spiel.

Das Schreiben von Code für Linux ist ganz anders als das Schreiben von Code für einen Mikrocontroller . In einem modernen Betriebssystem rufen Sie über das Betriebssystem einen Treiber an, der dann mit einer bestimmten Hardware kommuniziert – und nicht all diese Arbeit direkt selbst erledigen.

Ein kleiner Mikrocontroller kann ein Datenblatt von 600 Seiten haben ... Datenblätter werden nicht über einen ganzen Computer erstellt, weil es zehntausend Seiten oder mehr umfassen würde und für jede einzelne Hardwareänderung anders wäre. Darüber hinaus enthalten einige im Inneren verwendete ICs, wie z. B. die GPU, geistiges Eigentum , was bedeutet, dass der Anbieter nicht teilen möchte, wie es funktioniert. Sie erstellen die Treiber. Aber im Laufe der Zeit haben sich viele der Kernfunktionen des Computers auf bestimmte Adressen standardisiert, z. B. COM1 ist 0x3F8 und LPT1 ist 0x3BC. (UEFI ist eine ganz andere Geschichte.) Probieren Sie unter Linux diese aus, um Geräteadressen zu finden. Denken Sie daran, dass das BIOS des Computers viele dieser Adressen festlegt, aber moderne Betriebssysteme müssen das BIOS überhaupt nicht verwenden.

Die einzige Art, wie ein Computer und ein Mikrocontroller entfernt vergleichbar sind, ist auf der Ebene der Assembler-Sprache . Und selbst dann gibt es viele Unterschiede zwischen ihnen, aber zumindest teilen sie physische Register, E/A-Adressen und Anweisungen. Für Linux würde die Programmierung in Assembler wahrscheinlich mit NASM erfolgen . Die Suche im Internet taucht häufig auf, z. B. Accessing Sound Card Directly in NASM (no OS) . Sogar ein ganzes Betriebssystem ( MenuetOS ) wurde in Assembler geschrieben, verwendet jedoch eine etwas andere Syntax (FASM). Trotzdem könnte es interessant sein zu sehen, wie sie auf Dinge zugreifen, nur aus Neugier. Für Benutzer von MS Windows siehe MASM32 und GoASM .

Assembler kann heute noch für alles verwendet werden, von der Anwendungsprogrammierung bis zur Betriebssystementwicklung, aber es ist ziemlich antiquiert. Erwarten Sie eine sehr steile Lernkurve, wenn Sie sich für Assembler entscheiden ... nicht, weil Assembler von Natur aus schwierig ist, sondern weil Sie wahrscheinlich ein Betriebssystem verwenden möchten , und das fügt Assembler eine enorme Menge an Mehrdeutigkeiten und Komplikationen hinzu. Ebenso arbeitet der MenuetOS-Entwickler seit 2005 an seinem Betriebssystem. C und andere höhere Sprachen verbergen viel von dieser Komplexität, daher finden die meisten Leute dies vorzuziehen.

Aber es hört sich so an, als ob Sie einen Treiber schreiben möchten. Fahrer können auf die Hardware zugreifen. Viele Informationen können gefunden werden, indem Sie nach how+to+write+driver+Linux suchen, wie hier , aber was Sie wahrscheinlich wollen, ist eher wie Writing Device Drivers in Linux . Was viel zu lang ist, um es hier zu platzieren. Es genügt zu sagen, dass ein gutes (modernes) Buch über das Schreiben von Gerätetreibern unter Linux die beste Wahl wäre.