(Diese Frage war ursprünglich über die CVTSI2SD
Anweisung und die Tatsache, dass ich dachte, dass es nicht auf der Pentium M CPU funktioniert, aber in Wirklichkeit ist es, weil ich ein benutzerdefiniertes Betriebssystem verwende und ich muss SSE manuell aktivieren.)Wie aktiviere ich SSE für meinen freistehenden bootfähigen Code?
Ich habe eine Pentium M CPU und ein benutzerdefiniertes Betriebssystem, die bisher keine SSE-Anweisungen verwendet, aber ich muss sie jetzt verwenden.
Der Versuch, alle SSE-Befehls führt zu einer Unterbrechung 6, illegal opcode auszuführen (was in Linux würde eine SIGILL
verursachen, aber das ist nicht Linux), auch in der Intel architectures software developer's manual bezeichnet (was ich von jetzt an als IASDM beziehen) als #UD - Ungültiger Opcode (Undefinierter Opcode).
bearbeiten: Peter Cordes tatsächlich die richtige Ursache identifiziert und wies mich auf die Lösung, die ich weiter unten wieder aufnehmen:
Wenn Sie ein altes Betriebssystem laufen lassen, die nicht XMM regs unterstützt Speicher Bei Kontextwechsel wird das SSE-Aktivierungsbit in einem der Maschinensteuerregister nicht gesetzt.
Tatsächlich erwähnt die IASDM dies:
Wenn ein Betriebssystem nicht ausreichend System-Level-Support für SSE vorsah, kann eine SSE oder SSE2 Befehle ausführt auch #UD erzeugen.
Peter Cordes wies mich auf die SSE OSDev wiki, die beschreibt, wie SSE zu ermöglichen, indem sowohl CR0
und CR4
Steuerregister:
clear the CR0.EM bit (bit 2) [ CR0 &= ~(1 << 2) ]
set the CR0.MP bit (bit 1) [ CR0 |= (1 << 1) ]
set the CR4.OSFXSR bit (bit 9) [ CR4 |= (1 << 9) ]
set the CR4.OSXMMEXCPT bit (bit 10) [ CR4 |= (1 << 10) ]
Beachten Sie, dass, um in diese Register schreiben zu können, Wenn Sie sich im geschützten Modus befinden, müssen Sie sich in der Berechtigungsstufe 0 befinden. The answer to this question erklärt, wie Sie es testen: Wenn im geschützten Modus, also Bit 0 (PE
) in CR0
auf 1 gesetzt ist, können Sie testen Bits 0 und 1 aus dem CS
Selektor, der bo sein sollte th 0.
Schließlich muss das benutzerdefinierte Betriebssystem XMM-Register während Kontextwechsel ordnungsgemäß behandeln, indem sie sie bei Bedarf speichern und wiederherstellen.
'CVTSI2SD-Konvertieren Dword-Ganzzahl in skalare Doppelpräzision FP-Wert ' gehört zum SSE2-Befehlssatz, und dies wird in den Intel Software Developer Handbüchern bestätigt. –
"Noch erkennt der Pentium M CVTSI2SD" Quelle nicht? – harold
Ich habe ein Programm, das es verwendet und es auf einem echten Pentium M abstürzt. Auch das Intel Benutzerhandbuch (von denen ich eine Papierkopie habe) enthält diese Anweisung nicht. – anol