Das Kefk Network Wiki befindet sich im Testbetrieb.
ARM-Architektur
Aus Kefk.
Die ARM-Architektur ist ein Kern-Design für eine Familie von 32-Bit Mikroprozessoren, die dem RISC-Konzept folgen.
Inhaltsverzeichnis |
Entstehung
Das ARM-Design wurde 1983 vom englischen Computerhersteller Acorn Computers Ltd. als Entwicklungsprojekt gestartet. Das Team, unter der Leitung von Roger Wilson und Steve Furber, begann die Entwicklung eines leistungsfähigen Prozessors für einen Nachfolger der bis dahin auf dem 6502 basierenden Computer.
Anstatt, wie die Konkurrenz, auf Prozessoren der Firmen Intel oder Motorola zurückzugreifen, entwickelte man einen eigenen Prozessor, den ARM (Acorn Risc Machine), mit 32 Bit und einer geplanten Taktfrequenz von 4 MHz. Die Tests mit den Prototypen verliefen derart erfolgreich, dass die späteren Serienprozessoren (ARM2), die in den neu entwickelten Rechnern (Acorn Archimedes) verbaut wurden, direkt mit 8 MHz getaktet wurden. Tests ergaben, dass diese Rechner bei praktisch gleicher Taktfrequenz etwa achtmal schneller waren als die Konkurrenten Commodore Amiga und Atari ST.
Nachdem der ARM2 1989 zum ARM3 (mit Cache und höherer Taktfrequenz) weiterentwickelt worden war und immer mehr Firmen Interesse an diesen Prozessoren bekundet hatten, gründete Acorn im Jahre 1990 zusammen mit Apple und VLSI Technology die Firma Advanced RISC Machines Ltd. (ARM) mit Sitz in Großbritannien.
Eigenschaften
Die Architektur zeichnet sich durch einen effizienten Befehlssatz aus, erlaubt eine kompakte Umsetzung in einem ASIC-Design und ist gut geeignet für Optimierungen im Bereich der Ausführungsgeschwindigkeit und der Stromaufnahme.
Eine bedeutende Implementierung ist der als StrongARM bekannte Mikroprozessor.
Der Hersteller Intel ist neben anderen Marktteilnehmern Lizenznehmer der Firma Advanced RISC Machines Ltd. und darf somit auf der ARM-Architektur basierende Prozessoren herstellen. Darüberhinaus darf Intel (neben z. B. Motorola/Freescale oder NXP), im Gegensatz zu den meisten anderen Lizenznehmern, Änderungen und Erweiterungen am ARM Core durchführen. So vertrieb Intel bis 2006 unter dem Namen XScale eine in Lizenz gefertigte ARM-CPU und weitere ebenfalls als XScale bezeichnete und per Bus angebundene Peripherie-Halbleiter. Dazu gehören die PXA250, PXA260 und PXA270 Prozessoren, die häufig in PDAs und Smartphones zum Einsatz kommen, vor allem für Windows CE; die aktuelle Generation heisst "Monahan".
Die GNU Compiler Collection kann Code für ARM erzeugen. Der Linux-Kernel läuft auf dieser CPU-Klasse.
Einsatzgebiet
Aufgrund ihrer geringen Leistungsaufnahme kommen ARM-Prozessoren in vielen eingebetteten Systemen, wie Mobiltelefonen, PDAs und Routern zum Einsatz, z. B. im iPod, sowie vermutlich auch im iPhone von Apple oder den neueren PDAs von ASUS. Die Rechner der Acorn-Archimedes- und Risc-PC-Reihe von Acorn verwendeten ebenfalls ARM-CPUs. Der Nintendo DS und das GP2X verwenden ebenfalls ARM-Prozessoren. Nachfolgemodelle dieser Desktop-Rechner sind unter anderem von der Firma Castle Technology unter dem Namen IYONIX pc erhältlich.
Befehlssatz und Programmiermodell
Die ARM-CPU ist eine RISC-Architektur und kennt als solche drei Kategorien von Befehlen:
- Befehle zum Zugriff auf den Speicher (Load/Store)
- arithmetische oder logische Befehle auf Werte in Registern
- Befehle zum Ändern des Programmflusses (Sprünge, Subprogrammaufrufe)
Die ARM verfügt über einen 3-Register-Befehlssatz, alle arithmetisch/logischen Befehle akzeptieren also ein Zielregister und zwei Operandenregister.
Beispiel:
ADD r0, r1, r2 ; r0 := r1 + r2
Die ARM ist sowohl Little-Endian als auch Big-Endian kompatibel, kann also mit beiden „Byte Alignments“ umgehen, was angesichts des Einsatzzwecks als Standard-CPU in Kommunikationsgeräten ein deutlicher Vorteil ist. Der Standardmodus der ARM ist little endian.
Registersatz und Ausführungs-Modi
Die ARM verfügt, wie viele RISC-CPUs, über eine große Anzahl von Registern (halb so viele wie beim PowerPC). Dem Programmierer stehen 15 „general purpose“-Register zur Verfügung (r0–r14), wobei im Register r13 standardmäßig der Stackpointer gehalten wird und das Register r14 als „Link Register“ benutzt wird, in dem die Rücksprungadresse bei Prozeduraufrufen (mit BL „branch with link“) gespeichert wird, um später zurück in den Programmzähler geschrieben zu werden (Rückkehr zum aufrufenden Programmcode). Das Register r15 fungiert als Programmzähler (Program Counter, PC). Zusätzlich zu diesen direkt veränderbaren Registern gibt es das Status-Register (CPSR, Current Program Status Register), das die Statusbits und andere Informationen, wie z. B. den momentanen Ausführungsmodus, enthält.
Die ARM verfügt über mehrere Ausführungs-Modi, die über bestimmte Ereignisse betreten werden und teilweise dem ausgeführten Code zusätzliche Privilegien einräumen. Im einzelnen sind das:
- User Mode: Normaler User-Code
- System Mode: Privilegierte Betriebssystem-Tasks.
- Supervisor Mode (SVC): Eintritt durch Aufruf eines Supervisor-Calls (Software-Interrupts)
- Interrupt Mode (IRQ): Eintritt durch Auftreten eines äußeren Interrupt-Requests während der Befehlsverarbeitung. Code, der im Interrupt-Modus läuft, kann nicht durch Interrupts unterbrochen werden. Die ARM verfügt über einen "level sensitive" Interruptcontroller.
- Fast-Interrupt-Mode (FIQ): Eintritt durch Auftreten eines äußeren Fast-Interrupt-Requests. Fast Interrupts können normale Interrupt-Routinen unterbrechen und werden daher meist nur für besonders zeitkritische Ereignisse benutzt (siehe Echtzeitsysteme).
- Memory Abort (ABT): Wird durch einen äußeren Baustein, z. B. den Speicher, signalisiert. Tritt auf, wenn eine Datenanforderung nicht erfüllt werden kann (weil eine Speicherseite ausgelagert wurde).
- Undefined Instruction Exception (UND): Eintritt durch Auftreten einer unbekannten Instruktion. Wird häufig zur Emulation eines floating-point-Coprozessors verwendet.
R13, R14 und das Statusregister werden für die Interrupt- und Exception-Modi gespiegelt (sogenannte Schattenregister), so dass Ausnahmebehandlungsroutinen sich nicht um die Sicherung des User-Stackpointers oder Link-Registers zu kümmern brauchen. Für die Fast Interrupts werden sogar R8–R14 gespiegelt, und stehen so dem Programmierer einer Interrupt-Service-Routine direkt zur Verfügung, ohne dass er den Inhalt dieser Register vorher sichern müsste.
Befehlsbreite und Adressierungsarten
Der Load/Store-Befehl des ARM unterstützt die üblichen Adressierungsmodi. Bei der unmittelbaren Adressierung und der absoluten Adressierung gibt es jedoch einige Einschränkungen, die im folgenden näher erklärt werden sollen:
Sämtliche Befehle im ARM-Befehlssatz sind 32 Bit lang. Dies bedeutet auf der einen Seite, dass jede Instruktion mit einem Speicherzugriff geladen werden kann, wodurch sich das Design der Pipeline und die Instruction Fetch-Unit vereinfachen. Auf der anderen Seite können 32-Bit-Adressen oder 32-Bit-Werte nicht in einem 32 Bit breiten Befehl angegeben werden. Statt dessen hilft man sich folgendermaßen:
- Es können keine 32-Bit-Werte direkt im Befehl codiert werden. Statt dessen werden für Direktwerte 8 Adressbits und 4 Shift-Bits angegeben.
- Andere Direktwerte müssen im Speicher gehalten und vor dem eigentlichen Befehl in ein Register geladen werden, welches dann als Operand angegeben wird.
- Der Sprungbefehl enthält einen 24-Bit-Offset, so dass im Bereich von ± 32 MB von der aktuellen Stelle im Programm aus gesprungen werden kann (wobei der Programmzähler der aktuellen Instruktion immer um 8 Byte vorauseilt).
- Der Programmzähler kann als Zielregister bei datenverarbeitenden Instruktionen angegeben werden. In diesem Fall wird automatisch auch das 'saved program status register' zurück in das CPSR (aktuelle Statusregister) kopiert – das ist die Standard-Methode, um aus einer Exception zurückzukehren.
- Der Programmzähler kann als Zielregister bei Load-Operationen angegeben werden. So können ebenfalls 32-Bit-Sprungadressen angegeben werden.
- Bei den Load/Store-Befehlen kann ein 12-Bit-Offset auf eine Basisadresse addiert werden, welche aus einem Register gelesen wird. So kann ein Wert innerhalb von 4 kB ab der aktuellen Stelle des Programms (der Programmzähler kann auch als Basisregister verwendet werden) geladen werden. So lässt sich z. B. ein 32-Bit-Sprung durch den Assembler umsetzen, indem die absolute Sprungadresse hinter dem Ende der Funktion gespeichert wird. Diese kann dann durch eine PC-relativen Load-Befehl mit Ziel Program-Counter durch einen einzigen Befehl angesprungen werden. Vorher wird durch Store-Multiple-Befehl der komplette Registersatz (inklusive PC = Rücksprungadresse) auf dem Stack gespeichert.
- Alle Variablen, die außerhalb der 4 kB um die aktuelle Stelle im Programm liegen, können nur geladen werden, indem zuerst ihre Adresse in ein Register geladen wird und dieses in nachfolgenden Zugriffen als Basisregister verwendet wird.
Besonderheiten des Befehlssatzes
Der ARM-Befehlssatz verfügt über einige Besonderheiten, die zur Effizienz der Architektur beitragen:
- Sämtliche Befehle können bedingt ausgeführt werden. Damit entfällt die Notwendigkeit für Programmsprünge in vielen Standardsituationen, z. B. If-else-Abfragen (man vermeidet Programmsprünge, weil diese die Pipeline des Prozessors leeren, und dadurch Wartezyklen entstehen). Zum kodieren der Bedingung, werden die ersten 4-bit eines jedes Befehles verwendet.
Beispiel:
SUBS r0, r0, r1 ; r0 := r0 -r1 (setzt Bedingungsbits) ADDGE r2, r2, r3 ; if (r0 >= r1) then r2 := r2 + r3; ADDLT r2, r2, r4 ; else r2 := r2 + r4;
- Die ARM verfügt über einen Barrel-Shifter im B-Pfad der ALU, sämtliche Befehle, die mit dem zweiten Operanden arbeiten, erlauben also auch die Angabe eines 4-bit-weiten Shift- oder Roll-Faktors.
- Neuere ARM-CPUs kennen SIMD-Befehle.
Thumb-Befehlssatz
Bei Programmen, die aus dem gleichen Speicher wie die Daten geladen werden müssen, gibt es oft ein Geschwindigkeitsproblem. Wenn der Speicher aufgrund langsamerer Zugriffszeiten der Flaschenhals des Systems darstellt, ist die Komprimierung des Befehlssatzes eine Möglichkeit, die Performance des Gesamtsystems drastisch zu erhöhen. Ein Maß dafür ist die Code-Dichte.
Um diese zu erhöhen, hat ARM Ltd. den Thumb-Befehlssatz entwickelt, der nur aus 16 Bit breiten Befehlen besteht und im wesentlichen zum normalen 32 Bit breiten ARM-Befehlssatz äquivalent ist. Obwohl man oft mehr Assembler-Befehle benötigt, um ein Programm zu schreiben, wird die Code-Größe in der Praxis um etwa 30-40 % reduziert. Als weiterer Vorteil können problemlos 16-Bit-Speicherbausteine an der ARM betrieben werden, ohne dass das Laden von Befehlen zwei Speicherzyklen in Anspruch nimmt. Aus 32-Bit-Speicherbausteinen wird die ARM stets zwei Instruktionen auf einmal laden.
Die geringere Programmgröße wird allerdings oft durch eine geringere Ausführungsgeschwindigkeit erkauft. Zum einen sind viele Thumb-Befehle weniger leistungsfähig als die entsprechenden ARM-Befehle (und es werden mehr Thumb-Anweisungen benötigt). Des Weiteren gibt es in diesem 16Bit-Befehlssatz keine bedingte Befehlsausführung außer den bedingten Sprüngen. Durch die dadurch vermehrt auftretenden Programmsprünge kommt es häufiger zu einer Entleerung der Pipeline. Zumindest wenn der Speicher mit 32 Bit angesprochen wird, ist der 16-Bit-Befehlssatz schon deshalb oft langsamer als der ARM-Befehlssatz. Der Hersteller NXP gibt in den Datenblättern seiner LPC2000-Controller einen Geschwindigkeitsverlust von 30 % an.
Es besteht die Möglichkeit, ARM- und Thumbcode miteinander zu vermischen. Häufig ist in großen Teilen eines Programmes die Ausführungsgeschwindigeit sekundär. Hier bietet es sich an, diese Programmteile unter Verwendung der Thumb-Anweisungen zu schreiben, wogegen die kritischen Bereiche mit ARM-Anweisungen implementiert werden. Diese Technik nennt sich 'Thumb Interworking'.
Coprozessor-Befehle
Die ARM ist als Mikroprozessor-Kern in Eingebetteten Systemen gedacht, in denen meist keine Fließkomma-Arithmetik benötigt wird. Der ARM wurde jedoch speziell im Hinblick auf Erweiterbarkeit um Coprozessoren entwickelt und besitzt ein eigenes Coprozessor-Interface und Befehle für optionale Coprozessoren.
Modelle
- 1987: ARM2
- 1989: ARM3
- 1991: ARM6
- 1993: ARM7
- 1995: ARM8
- 1997: ARM9
- 1998: ARM10
- 2002: ARM11
- 2005: ARM Cortex
ARM7TDMI (1993)
Die ARM7TDMI ist das momentane Low-End-Modell der ARM-Familie und wird und wurde vor allem als Komponente in System on Chips für Mobiltelefone und andere portable Kommunikationsgeräte verwendet. Anwendung findet er auch im Game Boy Advance und Nintendo DS (als Subprozessor). Die Kürzel im Modellnamen stehen für Thumb Instruction Set, Debug Port, 64-Bit-Result Multiplizierer und EmbeddedICE Modul.
Die ARM7TDMI besitzt eine dreistufige Pipeline und einen gemeinsamen Datenbus für Instruktionen und Daten.
ARM9TDMI (1997)
Die ARM9 ist eine Weiterentwicklung der StrongARM- und ARM8-Architektur. Der wesentliche Unterschied der ARM9 gegenüber der ARM7 ist ein getrennter Datenbus jeweils für Instruktionen und Daten (Harvard-Architektur). Meist werden diese an separate Caches für Daten und Instruktionen angeschlossen. Des weiteren besitzt die ARM9 eine 5-stufige Pipeline und kann so höhere Taktraten erreichen und weist eine bessere CPI (Cycles per Instruction) auf. Außerdem besitzt die ARM9 eine größere Instruction Pipeline. Wird die ARM9 ohne Caches an einem externen Speicher mit nur einem Datenbus betrieben, schrumpft der Geschwindigkeitsvorteil gegenüber der ARM7.
Erweiterungen für ARM-Kerne
ARM Ltd. verkauft neben den ARM-CPU Kernen auch Erweiterungen als synthetisierbare Makrozellen für den System-on-Chip-Entwurf, unter anderem Memory Management Unit, Floating-Point Coprozessor, Signalprozessor-Erweiterung (Piccolo).
Lizenznehmer
- Analog Devices
- Apple
- Atmel
- Conexant
- Freescale (ehemals Motorola)
- HTC Corporation
- HP
- IBM
- Infineon
- Intel
- Luminary Micro
- Motorola
- NEC
- NetSilicon
- Nintendo
- NXP (ehemals Philips)
- Oki
- Palm
- Samsung
- Sony
- STMicroelectronics
- Texas Instruments
- Toshiba
Quellenangaben
Literatur
- Steve Furber: ARM System-on-Chip Architecture, Addison Wesley Verlag 2000. ISBN 0-201-67519-6
Weblinks
| Dieses Dokument entstammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Es ist dort zu finden unter dem Stichwort ARM-Architektur, die Liste der bisherigen Autoren befindet sich in der Versionsliste; die Originalfassung kann dort auch bearbeitet werden. Alle Texte der Wikipedia und ihre Derivate stehen unter der GNU-Lizenz für freie Dokumentation. |
