Historia de la arquitectura ARM
Dirigido por Roger Wilson y Steve Furber, el equipo comenzó a desarrollar una nueva arquitectura similar al procesador avanzado MOS Technology 6502. Acorn tenía muchas computadoras basadas en la arquitectura 6502, por lo que diseñar un chip similar significaba que tenía una gran ventaja para la empresa.
El equipo desarrolló una versión prototipo de ARM1 en 1985, y el primer ARM2 verdaderamente producido en masa se produjo en masa al año siguiente. ARM2 tiene un bus de datos de 32 bits y un espacio de direccionamiento de 26 bits y proporciona un rango de direccionamiento de 64 Mbytes y 16 registros de 32 bits. Uno de los registros se utiliza como contador de programa (longitud de palabra), y sus primeros 6 bits y sus últimos 2 bits se utilizan para almacenar indicadores de estado del procesador. El ARM2 era probablemente el microprocesador de 32 bits más simple y práctico del mundo, con sólo 30.000 transistores (en comparación con los 68.000 de Motorola seis años después). Es compacto porque no contiene microcódigo (ver microcódigo) (lo que significa que tiene sólo entre 1/3 y 1/4 del tamaño del 68000) y, a diferencia de la mayoría de las CPU actuales, no contiene ningún caché. Esta característica optimizada hace que consuma muy poca energía, pero puede funcionar mejor que Intel 80286. El procesador posterior ARM3 tiene un caché de 4 KB y tiene un mejor rendimiento.
A finales de los años 80, Apple comenzó a cooperar con Acorn para desarrollar una nueva versión del núcleo ARM. Debido a la importancia de este proyecto, Acorn incluso fundó una nueva empresa en 1990 llamada Advanced RISC Machines Ltd. Debido a esto, a ARM a veces se le llama máquina RISC avanzada, en lugar de máquina Acorn RISC. Debido a que su empresa matriz ARM Holdings plc cotizó en la Bolsa de Valores de Londres y en NASDAQ en 1998[1], la avanzada máquina RISC se convirtió en un producto de ARM Ltd.
Este proyecto luego ingresó a ARM6, la primera versión lanzada. en 1991. Luego, Apple Computer utilizó el ARM610 de la arquitectura ARM6 como base para su PDA Apple Newton. En 1994, Acorn utilizó el ARM 610 como CPU en su PC Risc.
Después de estos cambios, la mayoría de los componentes del kernel siguen teniendo el mismo tamaño. ARM2 tenía 30.000 transistores, pero ARM6 sólo creció a 35.000. El concepto principal es que el núcleo ARM se puede combinar con algunas piezas seleccionadas a través de ODM para crear una CPU completa, y se puede fabricar en fábricas existentes para lograr una alta eficiencia a bajo costo.
El modelo de negocio de ARM es vender su núcleo de propiedad intelectual (núcleo IP) y autorizar a los fabricantes a producir microcontroladores y procesadores centrales basados en el núcleo en función del diseño. La implementación más exitosa es ARM7TDMI, que ha vendido casi cientos de millones de dispositivos con microcontroladores integrados.
DEC compró los derechos de esta arquitectura (lo que causará confusión aquí es que también dejó que DEC Alpha desarrollara StrongARM. A 233 MHz, esta CPU consume solo un vatio de energía (los chips posteriores consumen menos). Este diseño se trasladó posteriormente para abordar las quejas de Intel, por lo que Intel aprovechó la oportunidad para reforzar su antigua línea i960 con la arquitectura StrongARM, que luego Intel desarrolló su propia implementación de alto rendimiento llamada XScale, que luego vendió a Marvell. >
La arquitectura más común que admite teléfonos inteligentes, PDA y otros dispositivos portátiles es ARMv4. La versión del esquema se muestra en la siguiente columna.
El documento de diseño
enfatiza métodos de diseño simples y rápidos, pero el circuito completo no es un microcódigo, al igual que el procesador 6502 de 8 bits utilizado en las primeras microcomputadoras Acorn.
La arquitectura ARM incluye las siguientes características RISC:
Arquitectura de lectura/almacenamiento
No admite accesos a memoria con direcciones no alineadas (ahora compatible con el kernel ARMv6) .
Conjunto de instrucciones ortogonales (cualquier instrucción de acceso puede acceder a datos en cualquier modo de direccionamiento). Conjunto de instrucciones ortogonales)
Una gran cantidad de archivos de registro de 16 × 32 bits.
La longitud fija del código de operación de 32 bits reduce el consumo causado por la cantidad de códigos y reduce la carga de decodificación y canalización.
La mayoría se ejecutan dentro de un ciclo de CPU.
Para mejorar este método de diseño simple, en comparación con procesadores de la misma época como Intel 80286 y Motorola 68020, se han agregado algunos diseños especiales:
La mayoría de las instrucciones pueden tener condicional la ejecución reduce la carga sobre las sucursales y compensa las deficiencias del predictor de sucursales.
Las instrucciones aritméticas sólo cambian los códigos de condición cuando es necesario.
La palanca de cambios de barril de 32 bits se puede utilizar para realizar la mayoría de instrucciones aritméticas y realizar cálculos sin pérdida de rendimiento.
Potente modo de direccionamiento de índices.
Subsistema de interrupción de doble prioridad simplificado pero rápido con conjunto de registros conmutables.
Un aspecto interesante del diseño ARM es que se utiliza un código de condición de 4 bits antes de cada instrucción para indicar si la ejecución de cada instrucción es condicional.
Esto reduce en gran medida la cantidad de bits de codificación utilizados en las instrucciones de acceso a la memoria. En otras palabras, evita la creación de instrucciones de rama para declaraciones pequeñas como if. Hay un ejemplo estándar con referencia al algoritmo del máximo común divisor de Euclides:
En el lenguaje de programación C, el bucle es:
int gcd (int i, int j)
p>{
Y (I!= j)
Si (i gtj)
I-= j;
Otro
j-= I;
Devolver I;
}
En lenguaje ensamblador ARM, el bucle es:
p>Loop CMP Ri, Rj; establece la condición en NE (no igual a) si (i!= j)
; ,
; o LT (menor que) si (I
Subgate Ri, Ri, Rj; si GT (mayor que), I = I-j;
SUBLT Rj, Rj, Ri; si LT (menor que), j = j-I;
bucle BNE; si NE (no igual a), continúe haciendo el bucle
Esto evita la brecha entre las cláusulas then y else.
Otra característica del conjunto de instrucciones es que funciones como el desplazamiento y la rotación se pueden combinar en instrucciones de procesamiento de datos (aritméticas, lógicas y de movimiento entre registros), por lo que para Por ejemplo, una descripción en lenguaje C
a =(j lt; lt2);
En ARM, se puede simplificar a una instrucción que solo requiere una palabra y un ciclo
p>Agregue Ra, Ra, Rj, LSL #2
Este resultado puede hacer que los programas ARM de propósito general sean más compactos y utilicen la canalización de manera más eficiente sin accesos frecuentes a la memoria, a pesar de la velocidad de ejecución de ARM. generalmente se considera lento, pero aún puede funcionar bien en comparación con diseños de CPU más complejos.
Los procesadores ARM también tienen algunas características que no se ven comúnmente en otras arquitecturas RISC, como el direccionamiento relativo de PC (de hecho, la PC es una de ellas). de los 16 registros en ARM) y modos de direccionamiento previo o posterior al incremento.
Otras consideraciones son que los procesadores ARM aumentarán su conjunto de instrucciones con el tiempo (por ejemplo, algunos de los primeros procesadores ARM (anteriores a ARM7TDMI). Es posible que no tenga instrucciones para leer dos bytes.
Por lo tanto, estrictamente hablando, al generar código para estos procesadores, no se pueden manejar tipos de datos que usan short volátil en objetos de lenguaje C.
ARM7 y la mayoría de los diseños anteriores tienen un proceso de tres etapas: buscar instrucciones, decodificar instrucciones y ejecutar instrucciones. Los diseños de alto rendimiento como ARM9 tienen cinco etapas de canalización. Otras formas de mejorar el rendimiento incluyen sumadores más rápidos y circuitos lógicos de predicción de ramificaciones más amplios.
Esta arquitectura proporciona una forma no intrusiva de ampliar el conjunto de instrucciones mediante el uso de "coprocesadores", que pueden direccionarse a través de las instrucciones MCR, MRC, MRRC y MCRR en el software. El espacio del coprocesador se divide lógicamente en 16 coprocesadores, numerados del 0 al 15. El coprocesador número 15 (CP15) está reservado para algunas funciones de control comunes, como realizar operaciones utilizando caché y unidades de administración de memoria (si están incluidas en el procesador).
En las máquinas basadas en ARM, los periféricos generalmente se crean mapeando los registros físicos del dispositivo en el espacio de almacenamiento de ARM, el espacio del coprocesador, o conectándolos a otro dispositivo que a su vez está conectado al procesador (como bus) para conectarse al procesador. Los coprocesadores tienen una latencia de acceso más baja, por lo que algunos periféricos (como el controlador de interrupciones XScale) están diseñados para acceder a ellos de diferentes maneras (a través de la memoria y el coprocesador). Los procesadores ARM más nuevos tienen un modo de instrucción de 16 bits llamado Thumb, probablemente relacionado con el hecho de que cada instrucción ejecutada condicionalmente consume 4 bits. En el modo Thumb, los códigos de operación más pequeños tienen menos funcionalidad. Por ejemplo, solo las ramas pueden ser condicionales y muchos códigos de operación no pueden acceder a todos los registros de la CPU. Sin embargo, los códigos de operación más cortos proporcionan una mejor densidad de codificación en general (nota: esto significa que el código ocupa espacio en la memoria), incluso si algunas operaciones requieren más instrucciones. Especialmente cuando el puerto de memoria o el ancho del bus están limitados a menos de 32 bits, los códigos de operación Thumb más cortos pueden utilizar el ancho de banda de memoria limitado de manera más eficiente, proporcionando un mejor rendimiento que el código de 32 bits. El hardware integrado típico tiene sólo un pequeño rango de direccionamiento de ruta de datos de 32 bits y otro rango de direccionamiento aún más estrecho de 16 bits (como el Game Boy Advance). En este caso, lo que normalmente funciona es compilar en código Thumb y usar el conjunto de instrucciones de 32 bits (no Thumb) para optimizar algunas áreas del programa relacionadas con la CPU para que puedan caber en la memoria con un ancho de bus limitado de 32 bits.
El primer procesador que utiliza la tecnología Thumb es ARM7TDMI. Todos los ARM9 y versiones superiores, incluido XScale, cuentan con tecnología Thumb. ARM también ha desarrollado una tecnología, Jazelle DBX (Direct Bytecode Execution), que les permite acelerar la ejecución del código de bytes de Java en algunas arquitecturas. Al igual que otros modos de ejecución, se puede proporcionar cierta ejecución acelerada de código de bytes al llamar a algún software especial que no admite código de bytes. Puede ejecutarse entre los modos ARM y Thumb existentes.
El primer procesador que utiliza la tecnología Jazelle es ARM926EJ-S: Jazelle está marcado con la letra inglesa "J" en el nombre de la CPU. Se utiliza para permitir a los fabricantes de teléfonos móviles acelerar la ejecución de juegos y aplicaciones Java ME, lo que impulsa el desarrollo continuo de esta tecnología. La tecnología Thumb-2 apareció por primera vez en el núcleo ARM1156 y se publicó en 2003. Thumb-2 amplía el conjunto de instrucciones limitado de Thumb de 16 bits y hace que el conjunto de instrucciones esté más disponible con instrucciones adicionales de 32 bits. Por lo tanto, el objetivo esperado de Thumb-2 es lograr una densidad de codificación cercana a Thumb, pero lograr un rendimiento cercano al conjunto de instrucciones ARM en memoria de 32 bits.
Thumb-2 también deriva una variedad de instrucciones de los conjuntos de instrucciones ARM y Thumb, incluidas funciones como operaciones de campo de bits, ramas de tablas y ejecución condicional. ThumbEE, también conocida como Thumb-2EE, es conocida en la industria como tecnología Jazelle RCT. Se lanzó en 2005 y apareció por primera vez en el procesador Cortex-A8.
ThumbEE proporciona cierta extensibilidad de Thumb-2, lo que hace que el conjunto de instrucciones sea particularmente adecuado para la generación de código en tiempo de ejecución en el entorno de ejecución (como la compilación justo a tiempo). Thumb-2EE está diseñado específicamente para lenguajes como Limbo, Java, C#, Perl y Python, lo que permite a los compiladores justo a tiempo generar código compilado más pequeño sin afectar el rendimiento.
ThumbEE proporciona nuevas funciones, incluida la comprobación automática de punteros no válidos cada vez que se accede a una instrucción, e instrucciones que pueden realizar comprobaciones de rango de matriz y bifurcarse a controladores que contienen pequeñas cantidades de código llamado con frecuencia, normalmente utilizado para la implementación. de características del lenguaje de alto nivel, como la asignación de memoria para nuevos objetos. VFP es una tecnología derivada de la arquitectura ARM en coprocesadores. Proporciona capacidades de operación de punto flotante de precisión simple y doble de bajo costo y es totalmente compatible con el estándar de operación de punto flotante binario ANSI/IEEE Std 754-1985. VFP proporciona la mayoría de las aplicaciones adecuadas para operaciones de punto flotante, como PDA, teléfonos inteligentes, compresión y descompresión de voz, gráficos 3D y efectos de sonido digitales, impresoras, decodificadores y aplicaciones automotrices. La arquitectura VFP también admite la ejecución paralela de instrucciones de vector corto SIMD (Instrucciones únicas y datos múltiples). En aplicaciones como el procesamiento de imágenes y señales, esto resulta muy útil para reducir el tamaño de la codificación y mejorar la eficiencia de la salida.
En los procesadores basados en ARM, otros coprocesadores SIMD o de punto flotante visibles incluyen FPA, FPE e iwMMXt. Proporcionan una funcionalidad similar a VFP, pero no son compatibles a nivel de código de operación.