PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mainboard / CPU-Register auslesen ...


DraconiX
2011-10-04, 20:44:59
So delle,

ich würde gerne die Temperatur eines normalen Mainboards auslesen, leider ist aller Anfang schwer. :/

Ich komme, programmiertechnisch, aus dem Embedded Bereich (Die üblichen Verdächtigen: AVR 8- und 16bitter, Xilinx Logic etc...) Dort ist die ganze Sache auch relativ unkompliziert die Daten der Register oder einer angeschlossenen Peripherie zu lesen / schreiben (I2C, TWI, One-Wire, etc...) jedoch schaue ich nun auf meinen Notepad und weiß garnicht wo ich anfangen soll.

Gibt es zur Hardwarenahen Programmierung unter C / C++ (Meinetwegen auch ASM) für Windows XP einigermaßen brauchbare und verständliche Lektüre (online?!)?

Gibt es Registerüberblicke für aktuelle CPU's? Oder ist die herrangehensweise an diese Geschichte eine völlig andere als dies bei RISC CPU´s oder Logic-Gattern der Fall ist?!

Büdde Hülfe :freak:

Demirug
2011-10-04, 23:41:40
Du solltest vielleicht noch etwas genauer spezifizieren was du möchtest. Also ob du jetzt irgendwas programmieren möchtest was von einen Datenträger bootet und dir die Werte dann anzeigt oder ob das ganze unter einem bereits installierten OS als Programm laufen soll. Falls ja spielt es eine Rolle welches.

Zu allem Überfluss ist dann natürlich auch nicht jedes Mainboard und damit auch die Temperatursensoren gleich.

Coda
2011-10-05, 09:37:38
Das Problem ist, dass du so ohne weiteres gar nicht auf die Hardware zugreifen kannst im Protected Mode.

Irgendwelche CPU-Register oder IO-Ports ansprechen ist nicht. Es muss entweder bereits eine API und Treiber dafür geben, oder du musst dir selber einen Treiber schreiben.

Wie genau das ist, weiß ich aber auch nicht, weil ich mich mit dem Thema noch nicht weiter beschäftigt habe.

Unter DOS dürfte die Sache einfacher sein.

Ectoplasma
2011-10-05, 11:50:03
Wie Coda schon sagte, du benötigst einen Treiber unter Windows. Einen zu schreiben ist zunächst etwas gewöhnungsbedürftig, aber wenn man erst das Konzept verinnerlicht hat, geht es ganz gut. Auf den Microsoftseiten findest du alle dazu nötigen Informationen und etliche Beispiele.

Zusätzlich könnte das hier (http://www.geekhideout.com/iodll.shtml) dir noch weiter helfen.

DraconiX
2011-10-05, 20:00:46
Erstmal vielen Dank euch für die Hilfe!

Du solltest vielleicht noch etwas genauer spezifizieren was du möchtest. Also ob du jetzt irgendwas programmieren möchtest was von einen Datenträger bootet und dir die Werte dann anzeigt oder ob das ganze unter einem bereits installierten OS als Programm laufen soll. Falls ja spielt es eine Rolle welches.

Zu allem Überfluss ist dann natürlich auch nicht jedes Mainboard und damit auch die Temperatursensoren gleich.


Es soll auf einem bestehenden System laufen (teilweise Win2K und WinXP), ein Pferd von hinten aufzäumen muß nun auch nicht sein :freak: - Nein, im Grunde möchte ich nur ein Programm schreiben welches mir die Sensoren ausließt (ich gehe mal pauschal von einem WINBOND W8378xx, als Sensor / HW Monitor Chip, aus) - diese dann regelmäßig an einen Cortex weiterschickt, welcher diese dann verarbeitet - Damit möchte ich 25 Thin-Clients überwachen.

Das Problem ist, dass du so ohne weiteres gar nicht auf die Hardware zugreifen kannst im Protected Mode.

Irgendwelche CPU-Register oder IO-Ports ansprechen ist nicht. Es muss entweder bereits eine API und Treiber dafür geben, oder du musst dir selber einen Treiber schreiben.

Wie genau das ist, weiß ich aber auch nicht, weil ich mich mit dem Thema noch nicht weiter beschäftigt habe.

Unter DOS dürfte die Sache einfacher sein.

Hmm, ok danke dir schonmal - also muß ich mir quasi einen "Treiber" schreiben, welcher es mir erlaubt von der Softwareebene durch die Betriebssystemschicht auf die CPU / Peripherie zuzugreifen... Ist schon recht umständlich gelöst :redface:


Wie Coda schon sagte, du benötigst einen Treiber unter Windows. Einen zu schreiben ist zunächst etwas gewöhnungsbedürftig, aber wenn man erst das Konzept verinnerlicht hat, geht es ganz gut. Auf den Microsoftseiten findest du alle dazu nötigen Informationen und etliche Beispiele.

Zusätzlich könnte das hier (http://www.geekhideout.com/iodll.shtml) dir noch weiter helfen.

Ok, ich schau mich dann mal bei MSDN um. Und danke für den Link, werde mir das auch mal in Ruhe durchlesen und mir die DLL zu Gemüte führen.

Stay tuned...

DraconiX
2011-10-06, 21:02:08
Ich werfe mal die zwei Begriffe in den Raum: ACPI, SMBUS....

Coda
2011-10-08, 16:17:09
Hmm, ok danke dir schonmal - also muß ich mir quasi einen "Treiber" schreiben, welcher es mir erlaubt von der Softwareebene durch die Betriebssystemschicht auf die CPU / Peripherie zuzugreifen... Ist schon recht umständlich gelöst :redface:
Das ist nicht umständlich sondern die Garantie, dass dir nicht jedes Programm das System runterreißen kann.

Gast
2011-10-09, 03:18:42
Ich werfe mal die zwei Begriffe in den Raum: ACPI, SMBUS....

Ich schmeisse ein WMI hinterher....

Wuzel
2011-10-10, 16:56:35
Wenn du es direkt von 'Hand zu Fuß' erledigen willst...

Ab Win2k gibt es einen Standard SMBus Treiber. Das ganze Geraffel zum anschnubeln ist - soweit ich noch weiß, im WDK drin.

Problem sind die Chips selber, man muss schauen das man die Dokus dazu bekommt, sonst wird es ....mühselig....

Die Seite kennst du schon? http://smbus.org/specs/

DraconiX
2011-10-22, 15:18:40
So delle, hab nun mal ein wenig mit C# und sowieso Windowsprogrammierung rumgespielt... ist ja doch ein anderes Ding als µC :freak:

Über WMI kann ich mittlerweile so einiges Auslesen, jedoch gerade die WMI_TemperatureProbe Klasse funktioniert nicht, bzw. zeigt nichts an. Sprich Windows kann sie nicht auslesen...

Desweiteren macht er sowieso auf verschiedenen Systemen unterschiedliche Sachen... hier mal unter Win7:

http://www.abload.de/img/win7pfpm.png

und unter XP:

http://www.abload.de/img/winxpkelz.png

DraconiX
2011-10-29, 20:16:34
Ach Mensch, ich raufe mir echt langsam die Haare raus :/

WMI Temperaturprobe und ACP Thermalzone wird in Win7 nicht mehr unterstützt... unter XP war es auch nur halbherzig. Also Thema WMI damit beendet.

Also ich versuchte nun mit Visual Studio Express und WDK einen Treiber zu schreiben, aber echt... das ist ja der Hammer. Ich weiß bis jetzt nur das es ein Fintek F71889F Chip ist, dieser hängt an der Adresse 0x0a00 - jedoch weiß ich um gottes willen nicht wie ich daran komme :/

Desweiteren stieß ich auf die Lib WinRing0, diese ist jedoch schon wieder vom Netz genommen wurden, ich finde leider keine Dokus und Dateien mehr dazu :/ Da hätte ich echt das Rad nicht neu erfinden müssen.

Wahnsinn was man für Aufwand betreiben muß nur um an die Temperatur zu kommen.

DraconiX
2011-10-31, 11:26:46
Sooo eine ecke weiter gekommen, ich nutze nun gerade die OpenLibSys. Funktioniert soweit auch ganz brauchbar, jedoch kann ich leider die CPUID nicht auslesen. Irgendwas mache ich falsch, dies läuft sowohl nicht unter Win7 und WinXP:

Test
Status OK!! OpenLibSys File Found!
DLL Running!! No DLL Error
[CPIUD Standart]
[TSC]
index 63-32 31-0
00000000: 00000E09 07B5F57C
[MSR]
index 63-32 31-0
00000010: 00000E09 07C0E392

[CPUID]
index EAX EBX ECX EDX
00000000: 00000000 00000000 00000000 00000000
00000001: 00000000 00000000 00000000 00000000
00000002: 00000000 00000000 00000000 00000000
00000003: 00000000 00000000 00000000 00000000
00000004: 00000000 00000000 00000000 00000000
00000005: 00000000 00000000 00000000 00000000
00000006: 00000000 00000000 00000000 00000000
00000007: 00000000 00000000 00000000 00000000
00000008: 00000000 00000000 00000000 00000000
00000009: 00000000 00000000 00000000 00000000
0000000A: 00000000 00000000 00000000 00000000
[CPIUD Extendet]
80000000: 00000000 00000000 00000000 00000000
80000001: 00000000 00000000 00000000 00000000
80000002: 00000000 00000000 00000000 00000000
80000003: 00000000 00000000 00000000 00000000
80000004: 00000000 00000000 00000000 00000000
80000005: 00000000 00000000 00000000 00000000
80000006: 00000000 00000000 00000000 00000000
80000007: 00000000 00000000 00000000 00000000
80000008: 00000000 00000000 00000000 00000000

[PCI]
Bus Dev Fnc VendorDevice
00h 00h 00h 8086h 27ACh
00h 02h 00h 8086h 27AEh
00h 02h 01h 8086h 27A6h
00h 1Bh 00h 8086h 27D8h
00h 1Ch 00h 8086h 27D0h
00h 1Ch 01h 8086h 27D2h
00h 1Dh 00h 8086h 27C8h
00h 1Dh 01h 8086h 27C9h
00h 1Dh 02h 8086h 27CAh
00h 1Dh 03h 8086h 27CBh
00h 1Dh 07h 8086h 27CCh
00h 1Eh 00h 8086h 2448h
00h 1Fh 00h 8086h 27B9h
00h 1Fh 02h 8086h 27C4h
00h 1Fh 03h 8086h 27DAh
02h 00h 00h 1969h 1062h
03h 00h 00h 168Ch 002Bh
0Ah 09h 00h 1180h 0822h
0Ah 09h 01h 1180h 0592h
[PCI Confguration Space Dump] HostBridge
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------
00| 86 80 AC 27 06 01 90 20 03 00 00 06 00 00 00 00
10| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20| 00 00 00 00 00 00 00 00 00 00 00 00 4D 10 64 90
30| 00 00 00 00 E0 00 00 00 00 00 00 00 00 00 00 00
40| 01 90 D1 FE 01 40 D1 FE 01 00 00 E0 01 80 D1 FE
50| 00 00 30 00 1B 00 00 00 00 00 00 00 00 00 00 00
60| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90| 10 11 11 00 10 03 11 00 FF 03 00 00 40 1A 79 00
A0| 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
B0| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
C0| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
D0| 00 00 00 00 00 00 00 00 00 00 00 00 09 01 00 00
E0| 09 00 09 71 23 25 4A A1 0E 00 00 00 00 00 00 00
F0| 00 00 00 00 00 00 00 00 86 0F 05 00 10 00 00 00

hier der Source:

eax = 0; ebx = 0; ecx = 0; edx = 0;

uint maxCpuid = 0x0000000a, maxCpuidEx = 0x80000008;

Console.WriteLine("[CPIUD Standart]");

ols.CpuidPx(0x00000000, ref eax, ref ebx, ref ecx, ref edx, (UIntPtr)1);
ols.
for (index = 0x00000000; index <= maxCpuid; index++)
{
ols.CpuidPx(index, ref eax, ref ebx, ref ecx, ref edx, (UIntPtr)1);
//ols.Cpuid(index, ref eax, ref ebx, ref ecx, ref edx);
str += index.ToString("X8") + ": "
+ eax.ToString("X8") + " " + ebx.ToString("X8") + " "
+ ecx.ToString("X8") + " " + edx.ToString("X8") + "\r\n";
}
Console.Write(str);

PatkIllA
2011-10-31, 12:52:25
Bietet Speedfan nicht auch eine API an, um an Temperaturen zu kommen?

DraconiX
2011-10-31, 13:15:21
Bietet Speedfan nicht auch eine API an, um an Temperaturen zu kommen?

Ja schon, läuft dann über Memory Mapping, dazu muß dann aber Speedfan auch im Hintergrund laufen, das wollte ich mir ersparen. ;(

PatkIllA
2011-10-31, 13:39:56
Aus Neugierde.
wie machst du das eigentlich mit der für 64 Bit Windows nötigen Treibersignierung?

DraconiX
2011-10-31, 13:52:16
Aus Neugierde.
wie machst du das eigentlich mit der für 64 Bit Windows nötigen Treibersignierung?

OpenLibSys bzw. WinRing0.dll bringt einen signierten Treiber mit.

DraconiX
2011-10-31, 15:59:05
So delle... nach ein bissle friemelei: Die CPUID!
Nun fehlt nur noch der MSR und voila hab ich meine Temperaturen :freak:

[CPUID Test]
Status: OK - Info: enter WinRing0 from WinRing3
Status: Running - Info: No DLL Error

[CPIUD Standart]
index EAX EBX ECX EDX
00000000: 0000000B 756E6547 6C65746E 49656E69
00000001: 000106E5 00100800 0098E3FD BFEBFBFF
00000002: 55035A01 00F0B2E4 00000000 09CA212C
00000003: 00000000 00000000 00000000 00000000
00000004: 1C004121 01C0003F 0000003F 00000000
00000005: 00000040 00000040 00000003 00001120
00000006: 00000003 00000002 00000001 00000000
00000007: 00000000 00000000 00000000 00000000
00000008: 00000000 00000000 00000000 00000000
00000009: 00000000 00000000 00000000 00000000
0000000A: 07300403 00000044 00000000 00000603
0000000B: 00000001 00000002 00000100 00000000

[CPIUD Extendet]
index EAX EBX ECX EDX
80000000: 80000008 00000000 00000000 00000000
80000001: 00000000 00000000 00000001 28100000
80000002: 65746E49 2952286C 726F4320 4D542865
80000003: 37692029 55504320 20202020 20202020
80000004: 30373820 20402020 33392E32 007A4847
80000005: 00000000 00000000 00000000 00000000
80000006: 00000000 00000000 01006040 00000000
80000007: 00000000 00000000 00000000 00000100
80000008: 00003024 00000000 00000000 00000000

DraconiX
2011-11-01, 07:00:47
Sooo nun scheitere ich an der dümmsten Sachen überhaupt :freak:

Ich habe nun dem MSR von Register 0x0000019c (CPU Thermal Sensor) ausgelesen.

Daraus kann ich folgendes lesen: 0x883900000 interessant für mich ist nur der 3. und 4. bit (bzw. 5. und 6. ist ja high to low) also 0x00xx0000.

Nun liegt mir der Wert z.b. 0x39 vor, aber leider als string. Ich muß nun diesen Wert (0x39 = 57) von meinen TJunction (bei mir ist der 100) abziehen. also (100 - 57) ergibt dann meine Core Temperatur von 43°C.

Jedoch komme ich vom als String formatierten hex wert (Str 39) nicht direkt zu einem hex Wert :freak: Also bräuchte ich irgendwie sowas wie StrToHex aber ohne Hex Konvertierung da es ja schon ein hex wert ist.

Coda
2011-11-01, 12:09:43
CPUID, nicht CPIUD. Und Standard, nicht Standart.

Draconix @ Gast
2011-11-01, 15:39:05
CPUID, nicht CPIUD. Und Standard, nicht Standart.

Für Rechtschreibprüfungen bleibt keine Zeit und ist völlig unrelevant :)

DraconiX
2011-11-01, 17:56:02
So, habe es nun ganz unsauber gelöst: :freak:

eax = 100 - ((eax >> 16) - 0x8800);

http://www.abload.de/img/winring0eugz.png

Vielen Dank für eure Anregungen. ;)

DraconiX
2011-11-06, 19:05:53
Alles ist Super, alles wir gut :D

http://www.abload.de/img/cpuidfertigtmjim.png

Ectoplasma
2011-11-07, 17:56:29
Sehr schön :up:

Und nu tu mal den Quellcode raus :D

DraconiX
2011-11-08, 07:15:50
Sehr schön :up:

Und nu tu mal den Quellcode raus :D

kommt am Wochenende, wenn ich wieder daheim bin. ;)