Arquitectura ARM

Un ARMv7 se utilizaba para alimentar las versiones más antiguas de los populares ordenadores de placa única Raspberry Pi, como esta Raspberry Pi 2 de 2015.

Un ARMv7 también se utiliza para alimentar la familia CuBox de ordenadores de placa única.
Ver también: Comparación de los núcleos ARMv7-A

La arquitectura ARM de 32 bits, como ARMv7-A (que implementa AArch32; véase la sección sobre ARMv8-A para saber más sobre ella), era la arquitectura más utilizada en los dispositivos móviles a partir de 2011.

Desde 1995, el Manual de referencia de la arquitectura ARM ha sido la principal fuente de documentación sobre la arquitectura y el conjunto de instrucciones del procesador ARM, distinguiendo las interfaces que todos los procesadores ARM deben soportar (como la semántica de las instrucciones) de los detalles de implementación que pueden variar. La arquitectura ha evolucionado con el tiempo, y la versión siete de la arquitectura, ARMv7, define tres «perfiles» de arquitectura:

  • Perfil A, el perfil «Aplicación», implementado por los núcleos de 32 bits de la serie Cortex-A y por algunos núcleos no ARM
  • Perfil R, el perfil «Tiempo real», implementado por los núcleos de la serie Cortex-R
  • Perfil M, el perfil «Microcontrolador», implementado por la mayoría de los núcleos de la serie Cortex-M
  • Aunque los perfiles de arquitectura se definieron primero para ARMv7, ARM definió posteriormente la arquitectura ARMv6-M (utilizada por los Cortex M0/M0+/M1) como un subconjunto del perfil ARMv7-M con menos instrucciones.

    Modos de CPUEditar

    Excepto en el perfil M, la arquitectura ARM de 32 bits especifica varios modos de CPU, dependiendo de las características de la arquitectura implementada. En cualquier momento, la CPU puede estar en un solo modo, pero puede cambiar de modo debido a eventos externos (interrupciones) o programáticamente.

    • Modo de usuario: El único modo no privilegiado.
    • Modo FIQ: Un modo privilegiado en el que se entra siempre que el procesador acepta una petición de interrupción rápida.
    • Modo IRQ: Un modo privilegiado al que se entra siempre que el procesador acepta una interrupción.
    • Modo supervisor (svc): Un modo privilegiado al que se entra siempre que la CPU se reinicia o cuando se ejecuta una instrucción SVC.
    • Modo Abort: Un modo privilegiado al que se entra siempre que se produce una excepción de aborto de prefetch o de datos.
    • Modo indefinido: Un modo privilegiado al que se entra siempre que se produce una excepción de instrucción indefinida.
    • Modo sistema (ARMv4 y superior): El único modo privilegiado al que no se entra por una excepción. Sólo se puede entrar en él ejecutando una instrucción que escriba explícitamente en los bits de modo del Registro de Estado del Programa Actual (CPSR) desde otro modo privilegiado (no desde el modo de usuario).
    • Modo monitor (extensiones de seguridad ARMv6 y ARMv7, ARMv8 EL3): Se introduce un modo monitor para soportar la extensión TrustZone en los núcleos ARM.
    • Modo Hyp (ARMv7 Virtualization Extensions, ARMv8 EL2): Un modo de hipervisor que admite los requisitos de virtualización de Popek y Goldberg para el funcionamiento no seguro de la CPU.
    • Modo hilo (ARMv6-M, ARMv7-M, ARMv8-M): Un modo que puede especificarse como privilegiado o no privilegiado. También se puede especificar en el registro CONTROL si se utiliza el puntero de pila principal (MSP) o el puntero de pila de proceso (PSP) con acceso privilegiado. Este modo está diseñado para tareas de usuario en el entorno RTOS, pero se suele utilizar en bare-metal para el super-loop.
    • Modo Handler (ARMv6-M, ARMv7-M, ARMv8-M): Un modo dedicado al manejo de excepciones (excepto los RESET que se manejan en el modo Thread). El modo Handler siempre utiliza MSP y funciona en nivel privilegiado.

    Set de instruccionesEditar

    La implementación original (y posterior) de ARM estaba cableada sin microcódigo, como el procesador 6502 de 8 bits mucho más simple utilizado en los anteriores microordenadores Acorn.

    La arquitectura ARM de 32 bits (y la de 64 bits en su mayor parte) incluye las siguientes características RISC:

    • Arquitectura de carga/almacenamiento.
    • No hay soporte para accesos a memoria no alineados en la versión original de la arquitectura. ARMv6 y posteriores, excepto algunas versiones de microcontroladores, soportan accesos no alineados para instrucciones de carga/almacenamiento de media palabra y de una sola palabra con algunas limitaciones, como la no garantía de atomicidad.
    • Archivo de registro uniforme de 16 × 32 bits (incluyendo el contador de programa, el puntero de pila y el registro de enlace).
    • Ancho de instrucción fijo de 32 bits para facilitar la decodificación y el pipelining, a costa de una menor densidad de código. Más tarde, el conjunto de instrucciones Thumb añadió instrucciones de 16 bits y aumentó la densidad de código.
    • Ejecución de un solo ciclo de reloj en la mayoría de los casos.
    • Para compensar el diseño más simple, en comparación con procesadores como el Intel 80286 y el Motorola 68020, se utilizaron algunas características de diseño adicionales:

      • La ejecución condicional de la mayoría de las instrucciones reduce la sobrecarga de bifurcación y compensa la falta de un predictor de bifurcación en los primeros chips.
      • Las instrucciones aritméticas alteran los códigos de condición sólo cuando se desea.
      • Se puede utilizar el cambiador de barril de 32 bits sin penalización de rendimiento con la mayoría de las instrucciones aritméticas y los cálculos de direcciones.
      • Cuenta con potentes modos de direccionamiento indexado.
      • Un registro de enlace admite rápidas llamadas a funciones de hoja.
      • Un sencillo, pero rápido, subsistema de interrupción de 2 niveles de prioridad ha conmutado los bancos de registros.

      Instrucciones aritméticasEditar

      ARM incluye operaciones aritméticas de enteros para sumar, restar y multiplicar; algunas versiones de la arquitectura también soportan operaciones de división.

      ARM soporta multiplicaciones de 32 bits × 32 bits con un resultado de 32 bits o de 64 bits, aunque los núcleos Cortex-M0 / M0+ / M1 no soportan resultados de 64 bits. Algunos núcleos ARM también soportan multiplicaciones de 16 bits × 16 bits y 32 bits × 16 bits.

      Las instrucciones de división sólo se incluyen en las siguientes arquitecturas ARM:

      • Las arquitecturas ARMv7-M y ARMv7E-M siempre incluyen instrucciones de división.
      • La arquitectura ARMv7-R siempre incluye instrucciones de división en el conjunto de instrucciones Thumb, pero opcionalmente en su conjunto de instrucciones de 32 bits.
      • La arquitectura ARMv7-A incluye opcionalmente las instrucciones de división. Las instrucciones podrían no estar implementadas, o estar implementadas sólo en el conjunto de instrucciones Thumb, o estar implementadas en los conjuntos de instrucciones Thumb y ARM, o estar implementadas si se incluyen las extensiones de virtualización.

      RegistersEdit

      Registros en los modos de la CPU
      usr sys svc abt und irq fiq
      R1
      R2
      R3
      R4
      R6
      R7
      R8 R8_fiq
      R9 R9_fiq
      R10 R10_fiq
      R11 R11_fiq
      R12 R12_fiq
      R13 R13_svc R13_abt R13_und R13_irq R13_fiq
      R14 R14_svc R14_abt R14_und R14_irq R14_fiq
      R15
      CPSR
      SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq

      Los registros R0 a R7 son los mismos en todos los modos de la CPU; nunca están en el banco.

      Los registros R8 a R12 son los mismos en todos los modos de la CPU excepto en el modo FIQ. El modo FIQ tiene sus propios registros R8 a R12.

      Los registros R13 y R14 están en el banco en todos los modos privilegiados de la CPU excepto en el modo sistema. Es decir, cada modo al que se puede entrar por una excepción tiene sus propios R13 y R14. Estos registros generalmente contienen el puntero de la pila y la dirección de retorno de las llamadas a funciones, respectivamente.

      Alias:

      • R13 también se denomina SP, el puntero de la pila.
      • R14 también se denomina LR, el registro de enlace.
      • R15 también se denomina PC, el contador de programa.
        • El Registro de Estado del Programa Actual (CPSR) tiene los siguientes 32 bits.

          • M (bits 0-4) son los bits de modo del procesador.
          • T (bit 5) es el bit de estado del Pulgar.
          • F (bit 6) es el bit de desactivación de FIQ.
          • I (bit 7) es el bit de desactivación de IRQ.
          • A (bit 8) es el bit de desactivación de datos imprecisos.
          • E (bit 9) es el bit de endianización de datos.
          • IT (bits 10-15 y 25-26) son los bits de estado if-then.
          • GE (bits 16-19) son los bits de mayor o igual que.
          • DNM (bits 20-23) son los bits de no modificar.
          • J (bit 24) es el bit de estado Java.
          • Q (bit 27) es el bit de desbordamiento pegajoso.
          • V (bit 28) es el bit de desbordamiento.
          • C (bit 29) es el bit de acarreo/borrado/extensión.
          • Z (bit 30) es el bit de cero.
          • N (bit 31) es el bit negativo/menos que.

          Ejecución condicionalEditar

          Casi todas las instrucciones ARM tienen una característica de ejecución condicional llamada predicación, que se implementa con un selector de código de condición de 4 bits (el predicado). Para permitir la ejecución incondicional, uno de los códigos de cuatro bits hace que la instrucción se ejecute siempre. La mayoría de las demás arquitecturas de CPU sólo tienen códigos de condición en las instrucciones de bifurcación.

          Aunque el predicado ocupa cuatro de los 32 bits de un código de instrucción, y por tanto reduce significativamente los bits de codificación disponibles para los desplazamientos en las instrucciones de acceso a la memoria, evita las instrucciones de bifurcación cuando se genera código para pequeñas declaraciones if. Aparte de eliminar las instrucciones de bifurcación en sí, esto preserva el pipeline de búsqueda/decodificación/ejecución a costa de sólo un ciclo por instrucción omitida.

          Un algoritmo que proporciona un buen ejemplo de ejecución condicional es el algoritmo euclidiano basado en la sustracción para calcular el máximo común divisor. En el lenguaje de programación C, el algoritmo se puede escribir como:

          int gcd(int a, int b) { while (a != b) // We enter the loop when a<b or a>b, but not when a==b if (a > b) // When a>b we do this a -= b; else // When a<b we do that (no if(a<b) needed since a!=b is checked in while condition) b -= a; return a;}

          El mismo algoritmo se puede reescribir de una manera más cercana a las instrucciones objetivo de ARM como:

          loop: // Compare a and b GT = a > b; LT = a < b; NE = a != b; // Perform operations based on flag results if(GT) a -= b; // Subtract *only* if greater-than if(LT) b -= a; // Subtract *only* if less-than if(NE) goto loop; // Loop *only* if compared values were not equal return a;

          y codificado en lenguaje ensamblador como:

          ; assign a to register r0, b to r1loop: CMP r0, r1 ; set condition "NE" if (a != b), ; "GT" if (a > b), ; or "LT" if (a < b) SUBGT r0, r0, r1 ; if "GT" (Greater Than), a = a-b; SUBLT r1, r1, r0 ; if "LT" (Less Than), b = b-a; BNE loop ; if "NE" (Not Equal), then loop B lr ; if the loop is not entered, we can safely return

          que evita las bifurcaciones alrededor de las cláusulas then y else. Si r0 y r1 son iguales entonces no se ejecutará ninguna de las instrucciones SUB, eliminando la necesidad de una bifurcación condicional para implementar la comprobación while en la parte superior del bucle, por ejemplo si se hubiera utilizado SUBLE (menor o igual).

          Una de las formas en que el código Thumb proporciona una codificación más densa es eliminar el selector de cuatro bits de las instrucciones no ramificadas.

          Otras característicasEditar

          Otra característica del conjunto de instrucciones es la capacidad de plegar desplazamientos y rotaciones en las instrucciones de «procesamiento de datos» (aritmética, lógica y movimiento registro-registro), de modo que, por ejemplo, la sentencia C

          a += (j << 2);

          podría representarse como una instrucción de una sola palabra y un solo ciclo:

          ADD Ra, Ra, Rj, LSL #2

          Esto hace que el programa típico de ARM sea más denso de lo esperado, con menos accesos a la memoria; así el pipeline se utiliza de forma más eficiente.

          El procesador ARM también tiene características poco vistas en otras arquitecturas RISC, como el direccionamiento relativo al PC (de hecho, en el ARM de 32 bits el PC es uno de sus 16 registros) y los modos de direccionamiento pre y post-incremento.

          El conjunto de instrucciones del ARM ha aumentado con el tiempo. Algunos de los primeros procesadores ARM (antes del ARM7TDMI), por ejemplo, no tienen ninguna instrucción para almacenar una cantidad de dos bytes.

          Tuberías y otros problemas de implementaciónEditar

          El ARM7 y las implementaciones anteriores tienen una tubería de tres etapas; las etapas son fetch, decodificación y ejecución. Los diseños de mayor rendimiento, como el ARM9, tienen pipelines más profundos: El Cortex-A8 tiene trece etapas. Otros cambios en la implementación para obtener un mayor rendimiento incluyen un sumador más rápido y una lógica de predicción de bifurcación más amplia. La diferencia entre los núcleos ARM7DI y ARM7DMI, por ejemplo, era un multiplicador mejorado; de ahí la «M» añadida.

          CoprocesadoresEditar

          La arquitectura ARM (anterior a ARMv8) proporciona una forma no intrusiva de ampliar el conjunto de instrucciones mediante «coprocesadores» que pueden direccionarse utilizando instrucciones MCR, MRC, MRRC, MCRR y similares. El espacio del coprocesador se divide lógicamente en 16 coprocesadores con números del 0 al 15, estando el coprocesador 15 (cp15) reservado para algunas funciones de control típicas como la gestión de las cachés y el funcionamiento de la MMU en los procesadores que disponen de una.

          En las máquinas basadas en ARM, los dispositivos periféricos suelen estar unidos al procesador mapeando sus registros físicos en el espacio de memoria ARM, en el espacio del coprocesador, o conectándose a otro dispositivo (un bus) que a su vez se une al procesador. Los accesos al coprocesador tienen menor latencia, por lo que algunos periféricos -por ejemplo, un controlador de interrupciones XScale- son accesibles de ambas maneras: a través de la memoria y a través de los coprocesadores.

          En otros casos, los diseñadores de chips sólo integran el hardware utilizando el mecanismo del coprocesador. Por ejemplo, un motor de procesamiento de imágenes podría ser un pequeño núcleo ARM7TDMI combinado con un coprocesador que tiene operaciones especializadas para soportar un conjunto específico de primitivas de transcodificación de HDTV.

          DepuraciónEdición

          Esta sección necesita citas adicionales para su verificación. Por favor, ayude a mejorar este artículo añadiendo citas a fuentes fiables. El material sin fuente puede ser cuestionado y eliminado. (Marzo 2011) (Aprende cómo y cuándo eliminar este mensaje de la plantilla)

          Todos los procesadores ARM modernos incluyen facilidades de depuración por hardware, lo que permite a los depuradores de software realizar operaciones como la detención, el paso y el punto de interrupción del código a partir del reinicio. Estas facilidades están construidas usando el soporte JTAG, aunque algunos núcleos más nuevos soportan opcionalmente el propio protocolo de dos hilos «SWD» de ARM. En los núcleos ARM7TDMI, la «D» representaba el soporte de depuración JTAG, y la «I» representaba la presencia de un módulo de depuración «EmbeddedICE». Para las generaciones de núcleos ARM7 y ARM9, EmbeddedICE sobre JTAG era un estándar de depuración de facto, aunque no estaba garantizado desde el punto de vista de la arquitectura.

          La arquitectura ARMv7 define las facilidades básicas de depuración a nivel de arquitectura. Entre ellas se encuentran los puntos de interrupción, los puntos de vigilancia y la ejecución de instrucciones en un «modo de depuración»; instalaciones similares también estaban disponibles con EmbeddedICE. Se admite tanto la depuración en modo «halt» como en modo «monitor». El mecanismo de transporte real utilizado para acceder a las instalaciones de depuración no se especifica arquitectónicamente, pero las implementaciones generalmente incluyen soporte JTAG.

          Hay una arquitectura de depuración ARM «CoreSight» separada, que no es arquitectónicamente requerida por los procesadores ARMv7.

          Puerto de acceso a la depuración

          El puerto de acceso a la depuración (DAP) es una implementación de una interfaz de depuración ARM.Hay dos implementaciones diferentes soportadas, el puerto de depuración JTAG de cable serie (SWJ-DP) y el puerto de depuración de cable serie (SW-DP).CMSIS-DAP es una interfaz estándar que describe cómo varios software de depuración en un PC anfitrión pueden comunicarse a través de USB al firmware que se ejecuta en un depurador de hardware, que a su vez habla a través de SWD o JTAG a una CPU ARM Cortex habilitada para CoreSight.

          Instrucciones de mejora DSPEditar

          Para mejorar la arquitectura ARM para el procesamiento de señales digitales y aplicaciones multimedia, se añadieron instrucciones DSP al conjunto. Estas se significan con una «E» en el nombre de las arquitecturas ARMv5TE y ARMv5TEJ. Las variantes E también implican T, D, M e I.

          Las nuevas instrucciones son comunes en las arquitecturas de los procesadores de señales digitales (DSP). Incluyen variaciones de la multiplicación-acumulación con signo, la suma y la resta saturadas y el recuento de ceros a la izquierda.

          Extensiones SIMD para multimediaEdit

          Introducido en la arquitectura ARMv6, fue un precursor de Advanced SIMD, también conocido como Neon.

          JazelleEdit

          Artículo principal: Jazelle

          Jazelle DBX (Direct Bytecode eXecution) es una técnica que permite que el bytecode de Java se ejecute directamente en la arquitectura ARM como un tercer estado de ejecución (y conjunto de instrucciones) junto a los existentes ARM y Thumb-mode. La compatibilidad con este estado está indicada por la «J» en la arquitectura ARMv5TEJ y en los nombres de los núcleos ARM9EJ-S y ARM7EJ-S. La compatibilidad con este estado es necesaria a partir de ARMv6 (excepto para el perfil ARMv7-M), aunque los núcleos más nuevos sólo incluyen una implementación trivial que no proporciona aceleración por hardware.

          ThumbEdit

          Para mejorar la densidad del código compilado, los procesadores desde el ARM7TDMI (lanzado en 1994) cuentan con el conjunto de instrucciones Thumb, que tienen su propio estado. (La «T» en «TDMI» indica la característica Thumb.) Cuando está en este estado, el procesador ejecuta el conjunto de instrucciones Thumb, una codificación compacta de 16 bits para un subconjunto del conjunto de instrucciones ARM. La mayoría de las instrucciones Thumb están directamente mapeadas en instrucciones ARM normales. El ahorro de espacio proviene de hacer implícitos algunos de los operandos de las instrucciones y de limitar el número de posibilidades en comparación con las instrucciones ARM ejecutadas en el estado del conjunto de instrucciones ARM.

          En Thumb, los opcodes de 16 bits tienen menos funcionalidad. Por ejemplo, sólo las ramas pueden ser condicionales, y muchos opcodes están restringidos a acceder sólo a la mitad de todos los registros de propósito general de la CPU. Los opcodes más cortos proporcionan una mayor densidad de código en general, aunque algunas operaciones requieren instrucciones adicionales. En situaciones en las que el puerto de memoria o la anchura del bus están limitados a menos de 32 bits, los opcodes Thumb más cortos permiten un mayor rendimiento en comparación con el código ARM de 32 bits, ya que puede ser necesario cargar menos código de programa en el procesador a través del ancho de banda de memoria limitado.

          A diferencia de las arquitecturas de procesador con instrucciones de longitud variable (16 o 32 bits), como el Cray-1 y el Hitachi SuperH, los conjuntos de instrucciones ARM y Thumb existen independientemente el uno del otro. El hardware integrado, como la Game Boy Advance, suele tener una pequeña cantidad de RAM accesible con una ruta de datos completa de 32 bits; se accede a la mayoría a través de una ruta de datos secundaria de 16 bits o más estrecha. En esta situación, suele tener sentido compilar el código Thumb y optimizar a mano algunas de las secciones más intensivas para la CPU utilizando instrucciones ARM completas de 32 bits, colocando estas instrucciones más amplias en la memoria accesible por el bus de 32 bits.

          El primer procesador con un decodificador de instrucciones Thumb fue el ARM7TDMI. Todas las familias ARM9 y posteriores, incluida la XScale, han incluido un decodificador de instrucciones Thumb. Incluye instrucciones adoptadas del Hitachi SuperH (1992), que fue licenciado por ARM. Las familias de procesadores más pequeñas de ARM (Cortex M0 y M1) implementan sólo el conjunto de instrucciones Thumb de 16 bits para obtener el máximo rendimiento en las aplicaciones de menor coste.

          Thumb-2Edit

          La tecnología Thumb-2 se introdujo en el núcleo ARM1156, anunciado en 2003. Thumb-2 amplía el limitado conjunto de instrucciones de 16 bits de Thumb con instrucciones adicionales de 32 bits para dar al conjunto de instrucciones más amplitud, produciendo así un conjunto de instrucciones de longitud variable. Uno de los objetivos declarados de Thumb-2 era lograr una densidad de código similar a la de Thumb con un rendimiento similar al del conjunto de instrucciones de ARM en la memoria de 32 bits.

          Thumb-2 amplía el conjunto de instrucciones de Thumb con manipulación de campos de bits, ramas de tabla y ejecución condicional. Al mismo tiempo, el conjunto de instrucciones ARM se amplió para mantener una funcionalidad equivalente en ambos conjuntos de instrucciones. Un nuevo «Lenguaje Ensamblador Unificado» (UAL) permite generar instrucciones Thumb o ARM a partir del mismo código fuente; las versiones de Thumb vistas en los procesadores ARMv7 son esencialmente tan capaces como el código ARM (incluyendo la capacidad de escribir manejadores de interrupción). Esto requiere un poco de cuidado, y el uso de una nueva instrucción «IT» (if-then), que permite ejecutar hasta cuatro instrucciones sucesivas en función de una condición comprobada, o de su inversa. Cuando se compila en código ARM, esto se ignora, pero cuando se compila en Thumb genera una instrucción real. Por ejemplo:

          ; if (r0 == r1)CMP r0, r1ITE EQ ; ARM: no code ... Thumb: IT instruction; then r0 = r2;MOVEQ r0, r2 ; ARM: conditional; Thumb: condition via ITE 'T' (then); else r0 = r3;MOVNE r0, r3 ; ARM: conditional; Thumb: condition via ITE 'E' (else); recall that the Thumb MOV instruction has no bits to encode "EQ" or "NE".

          Todos los chips ARMv7 soportan el conjunto de instrucciones Thumb. Todos los chips de las series Cortex-A, Cortex-R y ARM11 soportan tanto el «estado del conjunto de instrucciones ARM» como el «estado del conjunto de instrucciones Thumb», mientras que los chips de la serie Cortex-M sólo soportan el conjunto de instrucciones Thumb.

          Entorno de Ejecución Thumb (ThumbEE)Edit

          ThumbEE (erróneamente llamado Thumb-2EE en alguna documentación de ARM), que se comercializó como Jazelle RCT (Runtime Compilation Target), se anunció en 2005, apareciendo por primera vez en el procesador Cortex-A8. ThumbEE es un cuarto estado del conjunto de instrucciones, que introduce pequeños cambios en el conjunto de instrucciones ampliado Thumb-2. Estos cambios hacen que el conjunto de instrucciones sea especialmente adecuado para el código generado en tiempo de ejecución (por ejemplo, mediante la compilación JIT) en entornos de ejecución gestionados. ThumbEE es un objetivo para lenguajes como Java, C#, Perl y Python, y permite que los compiladores JIT produzcan código compilado más pequeño sin afectar al rendimiento.

          Las nuevas características proporcionadas por ThumbEE incluyen comprobaciones automáticas de punteros nulos en cada instrucción de carga y almacenamiento, una instrucción para realizar una comprobación de límites de matrices, e instrucciones especiales que llaman a un controlador. Además, debido a que utiliza la tecnología Thumb-2, ThumbEE proporciona acceso a los registros r8-r15 (donde se mantiene el estado de Jazelle/DBX Java VM). Los manejadores son pequeñas secciones de código frecuentemente llamado, comúnmente usado para implementar lenguajes de alto nivel, como la asignación de memoria para un nuevo objeto. Estos cambios provienen de la reutilización de un puñado de opcodes, y de saber que el núcleo está en el nuevo estado ThumbEE.

          El 23 de noviembre de 2011, Arm Holdings desaprobó cualquier uso del conjunto de instrucciones ThumbEE, y ARMv8 elimina el soporte para ThumbEE.

          Punto flotante (VFP)Edit

          La tecnología VFP (Vector Floating Point) es una extensión del coprocesador de la unidad de punto flotante (FPU) a la arquitectura ARM (implementada de forma diferente en ARMv8 – coprocesadores no definidos allí). Proporciona un cálculo de punto flotante de precisión simple y doble de bajo coste que cumple totalmente con la norma ANSI/IEEE Std 754-1985 para la aritmética binaria de punto flotante. VFP proporciona un cálculo en coma flotante adecuado para un amplio espectro de aplicaciones, como PDAs, smartphones, compresión y descompresión de voz, gráficos tridimensionales y audio digital, impresoras, decodificadores y aplicaciones de automoción. La arquitectura VFP estaba pensada para soportar la ejecución de instrucciones cortas en «modo vectorial», pero éstas operaban en cada elemento vectorial de forma secuencial y, por tanto, no ofrecían el rendimiento del verdadero paralelismo vectorial de una sola instrucción y múltiples datos (SIMD). Por ello, este modo vectorial fue eliminado poco después de su introducción, para ser sustituido por el mucho más potente Advanced SIMD, también conocido como Neon.

          Algunos dispositivos como el ARM Cortex-A8 tienen un módulo VFPLite recortado en lugar de un módulo VFP completo, y requieren aproximadamente diez veces más ciclos de reloj por operación de flotación. La arquitectura anterior al ARMv8 implementaba el punto flotante/SIMD con la interfaz del coprocesador. Otras unidades de punto flotante y/o SIMD que se encuentran en los procesadores basados en ARM utilizando la interfaz del coprocesador incluyen FPA, FPE, iwMMXt, algunas de las cuales fueron implementadas en software por trapping pero podrían haber sido implementadas en hardware. Proporcionan algunas de las mismas funciones que VFP, pero no son compatibles con el opcode. FPA10 también proporciona precisión extendida, pero implementa el redondeo correcto (requerido por IEEE 754) sólo en precisión simple.

          VFPv1 Obsoleto VFPv2 Una extensión opcional del conjunto de instrucciones ARM en las arquitecturas ARMv5TE, ARMv5TEJ y ARMv6. VFPv2 tiene 16 registros FPU de 64 bits. VFPv3 o VFPv3-D32 Implementado en la mayoría de los procesadores Cortex-A8 y A9 ARMv7. Es compatible con VFPv2, excepto que no puede atrapar excepciones de punto flotante. VFPv3 tiene 32 registros FPU de 64 bits como estándar, añade instrucciones VCVT para convertir entre escalar, flotante y doble, añade el modo inmediato a VMOV para que las constantes puedan cargarse en los registros FPU. VFPv3-D16 Como el anterior, pero con sólo 16 registros FPU de 64 bits. Implementado en los procesadores Cortex-R4 y R5 y en el Tegra 2 (Cortex-A9). VFPv3-F16 No es común; admite la coma flotante de media precisión (16 bits) IEEE754-2008 como formato de almacenamiento. VFPv4 o VFPv4-D32 Implementado en los procesadores Cortex-A12 y A15 ARMv7, Cortex-A7 tiene opcionalmente VFPv4-D32 en el caso de una FPU con Neon. VFPv4 tiene 32 registros FPU de 64 bits como estándar, añade soporte de media precisión como formato de almacenamiento e instrucciones de multiplicación-acumulación fusionadas a las características de VFPv3. VFPv4-D16 Como el anterior, pero sólo tiene 16 registros FPU de 64 bits. Implementado en los procesadores Cortex-A5 y A7 en el caso de una FPU sin Neon. VFPv5-D16-M Implementado en Cortex-M7 cuando existe la opción de núcleo de punto flotante de precisión simple y doble.

          En Debian GNU/Linux, y derivados como Ubuntu y Linux Mint, armhf (ARM hard float) se refiere a la arquitectura ARMv7 incluyendo la extensión de hardware adicional de punto flotante VFP3-D16 (y Thumb-2) anterior. Los paquetes de software y las herramientas de compiladores cruzados utilizan los sufijos armhf frente a arm/armel para diferenciarlos.

          Edición SIMD avanzada (Neon)

          La extensión SIMD avanzada (también conocida como Neon o «MPE» Media Processing Engine) es un conjunto de instrucciones SIMD combinado de 64 y 128 bits que proporciona una aceleración estandarizada para aplicaciones de procesamiento de medios y señales. Neon se incluye en todos los dispositivos Cortex-A8, pero es opcional en los Cortex-A9. Neon puede ejecutar la descodificación de audio MP3 en CPUs que funcionen a 10 MHz, y puede ejecutar el códec de voz GSM adaptive multi-rate (AMR) a 13 MHz. Cuenta con un amplio conjunto de instrucciones, archivos de registro independientes y hardware de ejecución independiente. Neon admite datos enteros de 8, 16, 32 y 64 bits y de coma flotante de precisión simple (32 bits), así como operaciones SIMD para el procesamiento de audio y vídeo, así como el procesamiento de gráficos y juegos. En Neon, la SIMD admite hasta 16 operaciones al mismo tiempo. El hardware de Neon comparte los mismos registros de coma flotante que se utilizan en VFP. Dispositivos como los ARM Cortex-A8 y Cortex-A9 soportan vectores de 128 bits, pero se ejecutan con 64 bits a la vez, mientras que los dispositivos Cortex-A15 más recientes pueden ejecutar 128 bits a la vez.

          Una peculiaridad de Neon en los dispositivos ARMv7 es que borra todos los números subnormales a cero, y como resultado el compilador GCC no lo utilizará a menos que -funsafe-math-optimizations, que permite perder denormales, esté activado. El Neon «mejorado» definido desde ARMv8 no tiene esta peculiaridad, pero a partir de GCC 8.2 sigue siendo necesario el mismo indicador para activar las instrucciones Neon. Por otro lado, GCC sí considera seguro Neon en AArch64 para ARMv8.

          El ProyectoNe10 es el primer proyecto de código abierto de ARM (desde su inicio; mientras adquirían un proyecto anterior, ahora conocido como Mbed TLS). La biblioteca Ne10 es un conjunto de funciones comunes y útiles escritas tanto en Neon como en C (por compatibilidad). La biblioteca fue creada para permitir a los desarrolladores utilizar las optimizaciones de Neon sin tener que aprender Neon, pero también sirve como un conjunto de ejemplos de código intrínseco y ensamblador de Neon altamente optimizado para rutinas comunes de DSP, aritmética y procesamiento de imágenes. El código fuente está disponible en GitHub.

          Tecnología ARM HeliumEdit

          Helium es la extensión vectorial M-Profile (MVE). Añade más de 150 instrucciones escalares y vectoriales.

          Extensiones de seguridadEditar

          TrustZone (para el perfil Cortex-A)Editar

          Las extensiones de seguridad, comercializadas como tecnología TrustZone, están en ARMv6KZ y arquitecturas de perfil de aplicación posteriores. Proporciona una alternativa de bajo coste a la adición de otro núcleo de seguridad dedicado a un SoC, proporcionando dos procesadores virtuales respaldados por el control de acceso basado en hardware. Esto permite que el núcleo de la aplicación cambie entre dos estados, denominados mundos (para reducir la confusión con otros nombres de dominios de capacidad), con el fin de evitar que la información se filtre del mundo más fiable al mundo menos fiable. Este cambio de mundo es generalmente ortogonal a todas las demás capacidades del procesador, por lo que cada mundo puede operar independientemente del otro mientras se utiliza el mismo núcleo. La memoria y los periféricos son entonces conscientes del mundo operativo del núcleo y pueden utilizarlo para proporcionar control de acceso a los secretos y al código en el dispositivo.

          Típicamente, un sistema operativo rico se ejecuta en el mundo menos fiable, con un código más pequeño especializado en seguridad en el mundo más fiable, con el objetivo de reducir la superficie de ataque. Las aplicaciones típicas incluyen la funcionalidad DRM para controlar el uso de los medios de comunicación en los dispositivos basados en ARM, y la prevención de cualquier uso no aprobado del dispositivo.

          En la práctica, ya que los detalles de implementación específicos de las implementaciones propietarias de TrustZone no se han divulgado públicamente para su revisión, no está claro qué nivel de garantía se proporciona para un modelo de amenaza determinado, pero no son inmunes a los ataques.

          Open Virtualization es una implementación de código abierto de la arquitectura del mundo de confianza para TrustZone.

          AMD ha licenciado e incorporado la tecnología TrustZone en su tecnología de procesadores seguros. Habilitado en algunos productos, pero no en todos, las APU de AMD incluyen un procesador Cortex-A5 para manejar el procesamiento seguro. De hecho, el núcleo Cortex-A5 TrustZone se había incluido en productos anteriores de AMD, pero no se habilitó por falta de tiempo.

          Samsung Knox utiliza TrustZone para fines tales como la detección de modificaciones en el kernel.

          TrustZone para ARMv8-M (para el perfil Cortex-M)Edit

          La extensión de seguridad, comercializada como TrustZone para la tecnología ARMv8-M, se introdujo en la arquitectura ARMv8-M. Aunque contiene conceptos similares a TrustZone para ARMv8-A, tiene un diseño arquitectónico diferente, ya que el cambio de mundo se realiza utilizando instrucciones de bifurcación en lugar de utilizar excepciones. También admite la gestión de interrupciones intercaladas seguras desde cualquier mundo, independientemente del estado de seguridad actual. En conjunto, estas características proporcionan llamadas de baja latencia al mundo seguro y un manejo de interrupciones sensible. ARM proporciona una pila de referencia de código de mundo seguro en forma de Trusted Firmware para M y PSA Certified.

          Protección de páginas sin ejecutarEditar

          A partir de ARMv6, la arquitectura ARM admite la protección de páginas sin ejecutar, que se denomina XN, por eXecute Never.

          Extensión de dirección física grande (LPAE)

          La extensión de dirección física grande (LPAE), que amplía el tamaño de la dirección física de 32 bits a 40 bits, se añadió a la arquitectura ARMv7-A en 2011. El tamaño de la dirección física es mayor, 44 bits, en Cortex-A75 y Cortex-A65AE.

          ARMv8-R y ARMv8-MEdit

          Las arquitecturas ARMv8-R y ARMv8-M, anunciadas después de la arquitectura ARMv8-A, comparten algunas características con ARMv8-A, pero no incluyen ninguna instrucción AArch64 de 64 bits.

          ARMv8.1-Medida

          La arquitectura ARMv8.1-M, anunciada en febrero de 2019, es una mejora de la arquitectura ARMv8-M. Trae nuevas características que incluyen:

          • Una nueva extensión del conjunto de instrucciones vectoriales. La extensión vectorial de perfil M (MVE), o Helium, es para aplicaciones de procesamiento de señales y aprendizaje automático.
          • Mejoras en el conjunto de instrucciones adicionales para bucles y ramas (Low Overhead Branch Extension).
          • Instrucciones para el soporte de punto flotante de media precisión.
          • Mejora en el conjunto de instrucciones para la gestión de TrustZone para la unidad de punto flotante (FPU).
          • Nuevo atributo de memoria en la Unidad de Protección de la Memoria (MPU).
          • Mejoras en la depuración, incluyendo la Unidad de Monitorización del Rendimiento (PMU), la Extensión de Depuración Sin Privilegios, y soporte adicional de depuración centrado en los desarrollos de aplicaciones de procesamiento de señales.
          • Extensión de Fiabilidad, Disponibilidad y Capacidad de Servicio (RAS).

          .

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *