stringtranslate.com

MMIX

MMIX (pronunciado em-mix ) es una arquitectura de computación con conjunto de instrucciones reducido (RISC) de 64 bits diseñada por Donald Knuth , con importantes contribuciones de John L. Hennessy (quien contribuyó al diseño de la arquitectura MIPS ) y Richard L. Sites ( quien fue arquitecto de la arquitectura Alpha ). Knuth ha dicho que,

MMIX es una computadora destinada a ilustrar aspectos de la programación a nivel de máquina. En mis libros El arte de la programación informática , reemplaza a MIX , la máquina estilo años 60 que anteriormente desempeñaba ese papel... Me esforcé por diseñar MMIX para que su lenguaje de máquina fuera simple, elegante y fácil de aprender. Al mismo tiempo, tuve cuidado de incluir todas las complejidades necesarias para lograr un alto rendimiento en la práctica, de modo que MMIX pudiera, en principio, construirse e incluso tal vez ser competitivo con algunas de las computadoras de propósito general más rápidas del mercado." [1 ]

Knuth comenzó el diseño de MMIX en 1999 y lanzó la versión estable del diseño en 2011. [2] El procesador está numerado como "2009" y Knuth explica que esta es la media aritmética de los números de otras arquitecturas de computadora; además de ser “MMIX” en números romanos . [3]

Arquitectura

MMIX es una computadora con conjunto de instrucciones reducido (RISC) big-endian de 64 bits , con 256 registros de propósito general de 64 bits, 32 registros de propósito especial de 64 bits, instrucciones de 32 bits de longitud fija y una dirección virtual de 64 bits. espacio . El conjunto de instrucciones MMIX comprende 256 códigos de operación, uno de los cuales está reservado para futuras ampliaciones. [ cita necesaria ] MMIX utiliza números de punto flotante IEEE 754 .

Instrucciones

Todas las instrucciones tienen un mnemotécnico asociado. Por ejemplo, la instrucción n.º 20 (32 decimal) está asociada con ADD. La mayoría de las instrucciones tienen la forma simbólica OP X,Y,Z, donde OP especifica el tipo de instrucción, X especifica el registro utilizado para almacenar el resultado de la instrucción y el resto especifica los operandos de la instrucción. Cada uno de estos campos tiene ocho bits de ancho. Por ejemplo, ADD $0,$1,3significa "Establecer $0 como la suma de $1 y 3".

La mayoría de las instrucciones pueden tomar valores inmediatos o registrar contenidos; por lo tanto, una sola instrucción mnemotécnica puede corresponder a uno de dos códigos de operación.

Los programas MMIX normalmente se construyen utilizando el lenguaje ensamblador MMIXAL. El siguiente es un programa MMIXAL simple, que imprime la cadena " ¡Hola, mundo! ":

 LOC #100 % Establecer la dirección del programa  % inicialmente a 0x100.Main GETA $255,string % Pon la dirección de la cadena  % en el registro 255. TRAP 0,Fputs,StdOut % Escribe la cadena apuntada por  % registro 255 al estándar  % archivo de salida. TRAP 0,Detener,0 % Finalizar proceso.string BYTE "¡Hola mundo!",#a,0 % Cadena a imprimir. #a es  % nueva línea, 0 termina el  % cadena.

Registros

Hay 256 registros arquitectónicos de propósito general direccionables directamente en un chip MMIX, designados por $0 a $255, y 32 registros arquitectónicos de propósito especial. Se puede acceder a los registros de propósito especial con las instrucciones GET y PUT. Dos de los registros especiales, rL y rG, determinan cuáles de los registros generales son locales y cuáles son globales. Todos los registros desde $0... ([rL] − 1) son registros locales y representan una ventana a una pila interna de registros. [4] Los registros de [rL]... ([rG] − 1) son "registros marginales", siempre devuelven 0 si se utilizan como fuente en una operación. El uso de un registro marginal como destino de una operación hará que la máquina aumente automáticamente rL para incluir ese registro. Todos los registros [rG]... $255 se denominan registros globales y no forman parte de la pila de registros.

Pila de registro local

La pila de registros locales proporciona a cada subrutina sus propios registros locales rL, designados por $0 a $(rL − 1) . Cada vez que se llama a una subrutina, una cantidad de registros locales se empujan hacia abajo en la pila (desplazando el inicio de la ventana). Los argumentos de la subrutina llamada se dejan en los registros locales restantes. Cuando una subrutina finaliza, muestra los registros previamente ingresados. Debido a que la pila interna sólo puede contener un número finito de registros, puede ser necesario almacenar una parte de la pila en la memoria. [4] Esto se implementa con los registros especiales rO y rS que registran qué parte de la pila de registros locales está en la memoria y qué parte todavía está en los registros físicos locales. La pila de registros proporciona un enlace rápido de subrutinas.

Registros especiales

Los 32 registros arquitectónicos físicos especiales son los siguientes:

  1. rB, el registro de arranque (viaje)
  2. Al disparar, rB ← $255 y $255 ← rJ. Guardando así a rJ en un registro general.
  3. rD, el registro de dividendos
    La división de enteros sin signo utiliza esto como la mitad izquierda de la entrada de 128 bits que se dividirá por el otro operando.
  4. rE, el registro épsilon
    Se utiliza para comparaciones flotantes con respecto a épsilon.
  5. rH, el registro himult
    Se utiliza para almacenar la mitad izquierda del resultado de 128 bits de la multiplicación de enteros sin signo.
  6. rJ, el registro de salto de retorno
    Se utiliza para guardar la dirección de la siguiente instrucción por PUSH y por POP para regresar de un PUSH.
  7. rM, el registro de máscara multiplex
    Utilizado por la instrucción multiplex.
  8. rR, el registro restante
    Se establece en el resto de la división de números enteros.
  9. rBB, el registro de arranque (trampa)
    Al capturar, rBB ← $255 y $255 ← rJ. Guardando así a rJ en un registro general.
  10. rC, el contador de ciclos
    Incrementado en cada ciclo.
  11. rN, el número de serie
    Una constante que identifica este procesador MMIX en particular.
  12. rO, el desplazamiento de la pila de registros
    Se utiliza para implementar la pila de registros.
  13. rS, el puntero de la pila de registros
    Se utiliza para implementar la pila de registros.
  14. rI, el contador de intervalos
    Disminuido en cada ciclo. Provoca una interrupción cuando es cero.
  15. rT, el registro de dirección trampa
    Se utiliza para almacenar la dirección del vector de viaje.
  16. rTT, el registro de dirección de trampa dinámica
    Se utiliza para almacenar la dirección del vector de trampa.
  17. rK, el registro de máscara de interrupción
    Se utiliza para habilitar y deshabilitar interrupciones específicas.
  18. rQ, el registro de solicitud de interrupción
    Se utiliza para registrar interrupciones a medida que ocurren.
  19. rU, el contador de uso
    Se utiliza para llevar un recuento de las instrucciones ejecutadas.
  20. rV, el registro de traducción virtual
    Se utiliza para traducir direcciones virtuales a direcciones físicas. Contiene el tamaño y el número de segmentos, la ubicación raíz de la tabla de páginas y el número del espacio de direcciones.
  21. rG, el registro de umbral global
    Todas las referencias a registros generales con un número mayor o igual a rG se refieren a registros globales.
  22. rL, el registro de umbral local
    Todas las referencias a registros generales con un número menor que rL se refieren a registros locales.
  23. rA, el registro de estado aritmético
    Se utiliza para registrar, habilitar y deshabilitar excepciones aritméticas como desbordamiento y división por cero.
  24. rF, el registro de ubicación de fallas
    Se utiliza para almacenar la dirección de la instrucción que provocó una falla.
  25. rP, el registro de predicción
    Utilizado por intercambio condicional (CSWAP).
  26. rW, el registro donde se interrumpió (viaje)
    Se utiliza, en caso de disparo, para almacenar la dirección de la instrucción posterior a la que fue interrumpida.
  27. rX, el registro de ejecución (viaje)
    Se utiliza, en caso de disparo, para almacenar la instrucción que fue interrumpida.
  28. rY, el operando Y (viaje)
    Se utiliza, durante el disparo, para almacenar el operando Y de la instrucción interrumpida.
  29. rZ, el operando Z (viaje)
    Se utiliza, en caso de disparo, para almacenar el operando Z de la instrucción interrumpida.
  30. rWW, el registro donde se interrumpe (trampa)
    Se utiliza, al atrapar, para almacenar la dirección de la instrucción posterior a la que fue interrumpida.
  31. rXX, el registro de ejecución (trampa)
    Se utiliza, al atrapar, para almacenar la instrucción que fue interrumpida.
  32. rYY, el operando Y (trampa)
    Se utiliza, al capturar, para almacenar el operando Y de la instrucción interrumpida.
  33. rZZ, el operando Z (trampa)
    Se utiliza, al capturar, para almacenar el operando Z de la instrucción interrumpida.

Al igual que los programas que se ejecutan en casi todas las demás CPU, los programas MMIX se pueden interrumpir de varias formas. El hardware externo, como los temporizadores, es una fuente común de interrupciones preventivas . Muchas instrucciones provocan una interrupción en determinados casos excepcionales; como las excepciones de falla de la página de protección de memoria utilizadas para implementar la memoria virtual y el manejo de excepciones de punto flotante . MMIX tiene 2 tipos de interrupciones: "disparos" y "trampas". La principal diferencia entre "viajes" y "trampas" es que las trampas envían el control a un programa "controlador de trampas" en el sistema operativo (trampas), pero los viajes envían el control a un programa "controlador de viajes" en la aplicación del usuario (tripping). Los usuarios también pueden forzar la ejecución de cualquier controlador de interrupciones con instrucciones explícitas de interrupción de software TRIP y TRAP, similares a algunos tipos de trampas en otros sistemas informáticos. En particular, una llamada al sistema desde un programa de usuario al sistema operativo utiliza una instrucción TRAP. [1] : 38 

Implementaciones de hardware

En octubre de 2015 , no existen implementaciones de hardware conocidas de la arquitectura del conjunto de instrucciones MMIX. Sin embargo, el proyecto fpgammix [5] implementa MMIX en Verilog , lo que hace posible la implementación mediante una matriz de puertas programables en campo .

Herramientas de software

La arquitectura del conjunto de instrucciones MMIX está respaldada por una serie de herramientas de software para la investigación de arquitectura de computadoras y el desarrollo de software.

Simuladores y ensamblador

Compilador

La colección de compiladores GNU incluye un back-end MMIX para sus compiladores C / C++ , aportado por Hans-Peter Nilsson y parte de la distribución principal de GCC desde finales de 2001. A partir de noviembre de 2017 , el back-end MMIX para GCC continúa estando activo. desarrollado y mantenido por voluntarios.

En teoría, las herramientas anteriores podrían usarse para compilar, construir y arrancar un kernel completo de FreeBSD , Linux u otro sistema operativo similar en hardware MMIX, si dicho hardware existiera.

Ver también

Referencias

  1. ^ ab Knuth, Donald E. (octubre de 1999), MMIXware: una computadora RISC para el tercer milenio, Apuntes de conferencias en el tutorial de informática, vol. 1750, Heidelberg: Springer-Verlag, ISBN 3-540-66938-8(Errata)
  2. ^ "Inicio MMIX: un mensaje de Don Knuth". mmix.cs.hm.edu . Consultado el 23 de mayo de 2021 .
  3. ^ Knuth, Donald (9 de febrero de 1999). MMIX: Una computadora RISC para el nuevo milenio (offset 7:36). Conferencia de Stanford. Archivado desde el original el 11 de diciembre de 2021. ( Cray-1 + IBM 801 + RISC II + Clipper C300 + AMD 29k + Motorola 88k + IBM 601 + Intel i960 + Alpha 21164 + POWER2 + MIPS R4000 + Hitachi Super H4 + StrongARM 110 + SPARC 64) / 14 = 28126/14 = 2009
  4. ^ ab Knuth, Donald (2005). "Sección 1.4.2'". MMIX: una computadora RISC para el nuevo milenio . El arte de la programación informática. Vol. 1, Fasc. 1. Addison Wesley. p. 58.
  5. ^ maestro (24 de agosto de 2008). "fpgammix". Repo.or.cz. ​Consultado el 25 de mayo de 2014 .
  6. ^ "MMIXware". Cs-faculty.stanford.edu . Consultado el 25 de mayo de 2014 .
  7. ^ "MMIX". Malgil.com. 2002-03-06 . Consultado el 25 de mayo de 2014 .
  8. ^ Instrucciones de instalación para herramientas GCC + MMIX
  9. ^ https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/MMIX-Options.html §3.17.26. MMIX
  10. ^ "§9.28 Funciones dependientes de MMIX". Fuenteware.org . Consultado el 20 de noviembre de 2017 .

Otras lecturas

enlaces externos