Wie erkennt ein Betriebssystem oder Programm den CPU-Modellnamen? [geschlossen]

Welche Art von Binärkompatibilität ist für 2 Prozessoren vorhanden, die sich einen Befehlssatz teilen? . Ich hatte auf Computer Science Stack Exchange eine Frage gestellt, auf die ich eine Antwort bekam, die besagte:

Als triviales Problem können Sie ein Programm schreiben, das versucht zu drucken, auf welchem ​​​​Prozessor es läuft, wie viele Kerne, wie viel Speicher usw. usw. Ein solches Programm sollte offensichtlich unterschiedliche Ergebnisse auf einer x86- und einer AMD-CPU liefern.

Ich konnte nicht herausfinden, wie man in einer Programmiersprache oder einem Assembler-Code ein Programm schreibt, das den Namen des Prozessors korrekt ausgibt. Ein solches Programm würde „Intel i3-3220“ auf einem Intel i3-3220-Rechner und „AMD Ryzen 5000 …“ (ich kenne den genauen Modellnamen nicht) auf einem AMD Ryzen 5000-Rechner drucken. Da beide Prozessoren binärkompatibel sind, sollte ich in der Lage sein, ein Programm zu schreiben, das auf beiden läuft, ohne neu zu kompilieren. Wenn ein Programm vorhanden ist, um den Namen des Prozessors auszugeben, muss es zuerst den Prozessor erkennen. Natürlich kann es das Betriebssystem nach dem Prozessornamen fragen, aber das ist nicht dasselbe wie das Schreiben eines Programms zur Erkennung des CPU-Modells. Ich glaube nicht, dass ein solches Programm existiert. Das Betriebssystem erkennt das CPU-Modell jedoch korrekt.

Ubuntu verwendet dasselbe Betriebssystem für AMD- und Intel-x86-64-Prozessoren. Es gibt nur eine x86-64-Bit-Version namens AMD64, die sowohl auf AMD- als auch auf Intel-x86-64-Rechnern läuft. Wie erkennt das Betriebssystem das CPU-Modell mit dem gleichen, binärkompatiblen Programm?

Die meisten, wenn nicht alle modernen Prozessoren haben ID- und Versionsregister. Dies sind normalerweise numerische Codes, sodass Sie eine Übersetzungstabelle benötigen würden, um den Prozessortyp und die Revision tatsächlich auszudrucken.
@Justme CPUID auf x86 kann den Prozessornamen/das Prozessormodell als für Menschen lesbare Zeichenfolge zurückgeben (Funktion 0x80000002 bis 0x80000004).
@Unimportant Vielen Dank für die Korrektur, daher enthalten moderne Prozessoren Erweiterungen, um vom Benutzer druckbare Zeichenfolgen bereitzustellen.
@PeterSmith Die meisten UCs, an denen ich gearbeitet habe, hatten sogar gültiges ASCII in Identifikationsregistern. Dies waren jedoch benutzerdefinierte Kerne mit benutzerdefinierten Befehlssätzen, was bedeutet, dass keine standardisierte Versionierung erforderlich war, wie Sie es von massenproduzierter Unterhaltungselektronik erwarten würden.

Antworten (3)

Die Architektur definiert, welche Ergebnisse Software erwarten kann, wenn sie auf einer Implementierung läuft, die der Architektur entspricht. Es handelt sich im Wesentlichen um einen Vertrag, der die binäre Kompatibilität zwischen verschiedenen Implementierungen und Mikroarchitekturen sicherstellt.

Im Allgemeinen macht die ISA nur einen (kleinen) Teil der Architektur aus (x86, AMD64, ARM, RV usw.). Die Architektur definiert auch Register, Fehlersuche, Ausnahmebehandlung, [..]. Jedes Design, das eine bestimmte Architektur implementiert, muss auch diese verschiedenen Elemente enthalten, um dieser Architektur zu entsprechen.

In Ihrer speziellen Frage zur CPU-Identifizierung definiert die Architektur Methoden zur Bestimmung der Implementierungs-ID, optionaler Architekturfunktionen usw. Jonathans Antwort deckt die CPUIDAnweisung in x86 (_64) ab und zeigt die Binärkompatibilität bei Ausführung auf verschiedenen Implementierungen der Architektur. Hier ist eine Antwort auf SO, die die Verwendung von Registerzugriffen beschreibt, um ähnliche Informationen in einer ARM64 (AArch64)-Implementierung zu finden. (Übrigens ist der unterschiedliche Zugriff auf diese Informationen in diesen beiden Beispielen (x86, ARM) ein gutes Beispiel für den konzeptionellen Unterschied zwischen einer CISC- und einer RISC-Architektur.)

Für x86 können Sie die CPUID- Anweisung verwenden. Damit können Sie verschiedene Informationen über die CPU abfragen. Es ist direkt in die CPU integriert (und ist kein Betriebssystemdienst).

Diese CPUID-Anweisung funktioniert also sowohl für Intel x86-64 als auch für AMD x86-64? Kann ich ein Programm in Binärform haben, das sowohl auf Intel- als auch auf AMD-Prozessoren ausgeführt werden kann und die richtige (aber unterschiedliche) Ausgabe erzeugt?
@ShashankVM Ja. Das ist die Absicht der CPUID-Anweisung – die Ausgabe enthält die Zeichenfolge des CPU-Herstellers (z. B. AuthenticAMD, GenuineIntel, CentaurHauls, usw.) sowie andere Ergebnisse, die decodiert werden können, um andere nützliche Informationen zu erhalten.
@nanofarad danke. Gut zu wissen, dass diese Funktionalität von CPUID die binäre Kompatibilität von Intel- und AMD x86-64-Prozessoren nicht beeinträchtigt
@ShashankVM: Es unterbricht die Binärkompatibilität. Binäre Kompatibilität bedeutet, dass Sie das gleiche Ergebnis erhalten, unabhängig davon, auf welcher CPU Sie es ausführen. Aber Sie erhalten nicht das gleiche Ergebnis. Auf der einen CPU steht „AMD“, auf der anderen „Intel“.
@JörgWMittag Ist das nicht eine zu strenge Verwendung des Begriffs "Binärkompatibilität"? ISTM, dass dies trotz des unterschiedlichen Ergebnisses der Absicht der Kompatibilität entspricht .
Es sind alle möglichen Prozessorerweiterungen erhältlich; Die andere Funktion von CPUID besteht darin, eine maschinenlesbare Beschreibung der verfügbaren Befehlssätze zu geben, sodass Ihr Programm mehrere verschiedene binäre Implementierungen eines Algorithmus für verschiedene Prozessoren enthalten und zur Laufzeit eine auswählen kann.
Mit anderen Worten, binäre Kompatibilität mit was ?
@ShashankVM Re "Kann ich ein Programm in Binärform haben, das sowohl auf Intel- als auch auf AMD-Prozessoren ausgeführt werden kann und die richtige (aber unterschiedliche) Ausgabe erzeugt?" - Sie können ein Programm haben, das wiederholt auf demselben System ausgeführt wird und eine korrekte, aber unterschiedliche Ausgabe erzeugt - zum Beispiel den Zeitstempelzähler lesen.
@pcj50 binäre Kompatibilität von Intel x86-64 mit AMD x86-64
@JörgWMittag: Dem stimme ich nicht zu. Wenn zwei Systeme dieselbe Binärdatei erfolgreich ausführen (obwohl die Definition von "Erfolg" nicht trivial ist), sind sie in Bezug auf die in dieser Binärdatei verwendeten Anweisungen binärkompatibel. Oder anders ausgedrückt, würden Sie zwei Computer mit derselben CPU als binär inkompatibel bezeichnen, wenn sie aufgrund anderer Hardware unterschiedliche Ergebnisse für eine bestimmte Binärdatei liefern würden?

In RISC-V gibt es das Maschinenimplementierungs-ID-Register (mimpid), das eine eindeutige Codierung der Quelle und Version der Prozessorimplementierung bereitstellt.

Quelle: The RISC-V Instruction Set Manual Volume II: Privileged Architecture Version 1.7