Ich studiere ARM-Familien,
Im obigen Bild steht geschrieben, dass der Code von unterstütztem ARM7 auf ARM9 und andere migriert werden kann.
ARM7 verwendet die Von-Neumann-Architektur (einzelner Bus für Daten und Anweisungen) und eine dreistufige Pipeline (dh Abrufen, Decodieren und Ausführen). ARM9 und andere verwenden die Harvard-Architektur (separater Bus für Daten und Anweisungen) und 5-Stufen (Abrufen, Decodieren, Ausführen, Speichern und Schreiben (für ARM9)). Außerdem unterstützt ARM7 keine Speicherverwaltungseinheit, andere jedoch schon.
Wie kann der Code kompatibel sein, wenn die Prozessoren unterschiedliche Architekturen und Pipelines verwenden? Wird es keinen Einfluss von Architekturen auf die Codes geben?
Ich gehe davon aus, dass ARM9, ARM10, ARM11 dieselbe Architektur haben, Code kompatibel sein kann, ARM7 sich jedoch von anderen Prozessoren unterscheidet. Daher müssen vor der Migration aufgrund unterschiedlicher Architekturen einige Änderungen am Code vorgenommen werden. Ich frage mich, ob es richtig ist oder nicht.
Ein Prozessor wird als Code-kompatibel mit einem anderen bezeichnet, wenn sein Befehlssatz kompatibel ist. Das ist alles, was dazu gehört.
Jetzt können Befehlssätze unabhängig von ihrer Pipeline-Architektur kompatibel gemacht werden. Es ist richtig, dass das Pipelining Auswirkungen auf die Anweisungen haben kann, wenn Sie nur auf die Ausführungsgeschwindigkeit und den Kern-Siliziumbereich abzielen, aber es gibt immer Problemumgehungen, wenn Sie eine gewisse Kompatibilität mit einem vorhandenen Prozessor sicherstellen müssen. Es mag den Kern verkomplizieren, aber es gibt immer einen Weg. Sehen Sie sich an, wie sich die Architektur vom 8086 zu den neuesten Pentiums entwickelt hat. Aber auch alter Code kann noch ausgeführt werden.
In Bezug auf die Von Neumann / Harvard-Unterschiede kann auch festgestellt werden, dass es nur minimale Auswirkungen hat, wenn die Code- und Datenbusse tatsächlich zu denselben physischen Speicherblöcken mit denselben Adressen führen (was bei allen ARM-Implementierungen der Fall ist, die ich gesehen habe, außer vielleicht für Speicherzonen von Peripheriegeräten). Es kann Auswirkungen auf Sonderfälle geben, wie z. B. die Notwendigkeit, bestimmte Anweisungen aufzurufen, wenn der Code selbstmodifizierend ist, aber in normalen Fällen werden Sie dies nicht bemerken.
In Bezug auf die Speicherverwaltung ist das eine andere Geschichte. Dies wirkt sich auf die OS-Ebene aus. Die MMU ist wie ein zusätzliches Peripheriegerät, dessen Konfiguration sich auf das Speicherlayout auswirkt, aber den Befehlssatz nicht ändert. Ein Algorithmus wird auf dieselbe Weise codiert, unabhängig davon, ob es eine MMU gibt oder nicht.
Die Idee, dass "Code migriert werden kann", bedeutet, dass die Anweisungen das gleiche Endergebnis erzeugen. Die Architektur oder Anzahl der Pipeline-Stufen haben darauf keinen Einfluss. zB der Code für die Anweisung:
add r0,r1,r2
Wird auf beiden Maschinen gleich sein und das gleiche Ergebnis liefern: r0 ist am Ende die Summe von r1 und r2. Die Latenz kann länger sein. zB auf einem ARM7 dauert es 3 Zyklen und auf einem ARM 9 dauert es 5 Zyklen. Dies gilt jedoch für alle Anweisungen, sodass das Nettoergebnis dasselbe ist.
Die Echtzeit hängt von der Taktrate ab. Daher kann der ARM9 schneller sein, obwohl er 5 Takte benötigt, da zB der ARM7 mit 100 MHz und der ARM9 mit 3 GHz laufen kann.
Die MMU auf dem ARM9 ist nach einem Reset „transparent“, sodass Sie nicht bemerken, dass sie vorhanden ist. Zumindest solange Sie es nicht programmieren, wird der ARM7-Code nicht funktionieren, da es keinen Code geben sollte, um die MMU zu berühren.
Eine Harvard-Architektur bedeutet nicht, dass Code anders ausgeführt wird. Tatsächlich müssen Sie die Anweisung noch decodieren, bevor Sie wissen, welche Daten abgerufen/geschrieben werden sollen. Es ermöglicht nur, dass die nächste Anweisung ankommt und gleichzeitig mit dem Lesen/Schreiben der Daten decodiert wird.
Nachdem ich das alles gesagt habe, erinnere ich mich, dass es ein Problem mit der Verzweigungsanweisung gab, aber das könnte gewesen sein, als ich Assembler auf einen A53-Kern übertragen habe.
pop {r4, pc}
, als die Verzweigungsvorhersage deaktiviert war, und spekulatives Laden von einer Adresse, die das System aufhängte , da die Daten nach der Funktion als decodiert wurden a Ladeanweisung. (Und die MMU wurde nicht so konfiguriert, dass spekulative Ladevorgänge aus diesem Adressbereich nicht zugelassen werden.)ARM9 und andere verwenden die Harvard-Architektur (separater Bus für Daten und Anweisungen)
Das ist ungenau. Eine CPU mit Harvard-Architektur hat getrennte Speicher für Code und Daten; dies ist bei keiner Implementierung der ARM-Architektur der Fall. In einigen Implementierungen gibt es getrennte Busse für Befehle und Daten, aber sie sind immer mit demselben Speicher verbunden.
Wird es keinen Einfluss von Architekturen auf Codes geben?
Die Pipeline ist ein Implementierungsdetail. Es wirkt sich nicht auf das CPU-Modell des Programmierers aus – unter fast allen Umständen wird derselbe Code auf beiden Implementierungen auf dieselbe Weise ausgeführt. (Die Ausnahmen sind alle ungewöhnlich, wie selbstmodifizierender Code.)
LDR
ein Anweisungswort eingeben oder zu einigen Bytes springen, die Sie gerade gespeichert haben, aber nicht, dass Sie je nach Zugriffsart unterschiedliche Bytes erhalten würden. Diese Frage kam neulich für MIPS auf (meistens als Anfängerverwirrung ), und ich war mir nicht 100% sicher, dass es unmöglich war, ein MIPS mit separaten Adressräumen zu erstellen.Alles, worauf sich "Architektur" bezieht, ist, wie die CPU mit dem Speicher verdrahtet ist - die meisten Befehle und ihre Codierungen und die Register sind zwischen den beiden Chips gleich - die einzige Möglichkeit, mit dem Unterschied zwischen einer Harvard in Schwierigkeiten zu geraten und andere Architekturen, oder die Anzahl der Pipe-Stufen könnte sein, wenn Sie Code in den Speicher schreiben und ihn dann ausführen ... Sie müssen nur vorsichtig sein, Caches ungültig zu machen
Einige Dinge wie Ausnahmen und dergleichen können anders sein
isync
oder etwas, weil die geteilten Caches nicht kohärent sind. (Im Gegensatz zu x86, wo der Befehls-Cache separat ist, aber leider mit den Daten-Caches kohärent sein muss, was Transistoren und Strom kostet, um den Icache und die Pipeline nach Speicheradressen zu durchsuchen, um zu erkennen, wann die Pipeline geleert werden muss.)
Oldtimer
Oldtimer
Oldtimer
Oldtimer
Wayne Konrad
Oldtimer