¿Cómo se ve realmente el código de máquina mientras se ejecuta?

21

Cuando el hardware y la CPU ejecutan el código de la máquina, ¿cómo se ve?

¿Se vería como binario, como en las instrucciones representadas por unos y ceros, o sería algo formado por dígitos hexadecimales donde los códigos de operación son bytes presentados como números hexadecimales que pueden desglosarse en números binarios, como bytecode?

Tim apenas
fuente
24
Lo que vería son cables, puertas y registros parpadeando en el silicio. Por ejemplo, visual6502.org/JSSim
Nayuki el
44
@Nayuki ¡Creo que esta visualización es increíble y merece una respuesta!
nalzok
2
A mí no me parece nada
Gaius
3
Realmente ni siquiera existe cuando realmente se "ejecuta". Es "JIT compilado" por un dispositivo (hardware) en la CPU para microcódigo, ¡que en realidad instruye a la CPU!
xuq01
2
Una forma rápida de entender cómo se traduce una computadora es construir una desde puertas lógicas, realmente me gusta ver la hecha por Ben Eater youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Ferrybig

Respuestas:

38

La mejor respuesta que puedo dar es que, en realidad, no se "parece" a nada. La instrucción que actualmente ejecuta la CPU está representada por una serie de cables, algunos de los cuales tienen un alto voltaje, algunos de los cuales tienen un bajo voltaje.

Puede interpretar los voltajes altos y bajos como ceros y unos, pero igualmente puede interpretar grupos de altos y bajos voltajes como dígitos hexadecimales, o como una instrucción de ensamblaje como ADD $0 $1(que está más cerca de cómo la CPU lo interpreta). Estos números y mnemotécnicos son conveniencias para que los humanos los lean; internamente, no es más que voltajes en los cables.

De estas opciones, el binario es "más cercano al metal", en el sentido de que los ceros y unos se asignan directamente a los voltajes altos y bajos en los cables. Pero ninguno de los otros es incorrecto, y con frecuencia son más útiles: hay una razón por la cual la gente mira los volcados hexadecimales de los ejecutables, pero casi nunca los volcados binarios.

Draconis
fuente
Entonces, ¿podría abrir un programa en un editor hexadecimal y esos bytes representados en hexadecimal se traducen a código binario de máquina que puede ejecutarse mediante un voltaje asignado a cero y un voltaje asignado a uno?
Tim Hardly
44
@TimHardly ¡Sí! Hex es simplemente más fácil de leer. El ensamblaje, de manera similar, es aún más fácil de leer, pero puede traducirse mecánicamente a ceros y unos. Es por eso que los ensambladores son más fáciles de escribir que los compiladores.
Draconis
gracias, toda esta pregunta ha expandido mi conocimiento y aclarado mi confusión.
Tim Hardly
1
@TimHardly Un ensamblador simplemente asigna una secuencia de caracteres como "NOP" a una serie de bits como "10010000", una y otra vez, para convertir un archivo de ensamblaje en código de máquina. Los códigos de operación están determinados por la CPU, ya que es la parte que realmente los usará. Todas las computadoras que pueden ejecutar los mismos ejecutables tienen el mismo conjunto de códigos de operación; El conjunto x86 es el más común, y se usa en casi todas las PC hoy en día. Otro común es MIPS, utilizado en varias consolas de juegos.
Draconis
1
@TimHardly Si su pregunta es, ¿puede el ensamblador preguntarle a la CPU cuál es su código de operación para la instrucción NOP, la respuesta es no. El ensamblador ya tiene que saber qué byte emitir para la instrucción antes de que pueda funcionar. De hecho, un ensamblador puede generar un programa para un procesador, mientras se ejecuta en un tipo de procesador diferente.
Sr. Lister
11

"Look like" implica una metáfora. Si tomamos "cómo se verá" literalmente, se verá como una pieza de silicio grabada en su placa base. Claramente, la metafora era el objetivo. Para construir la metáfora, primero debemos ver qué es realmente. Entonces podemos construir una metáfora que sea aceptable. Esto es un poco largo, pero afortunadamente, termina con una metáfora de video para ti.

El código de la máquina se almacena en la memoria como bits. Los chips de memoria son típicamente DRAM , que almacena esos bits como voltajes en un condensador y electrones. Los dos están conectados, es difícil hablar de los voltajes sin los electrones. A veces es conveniente hablar de uno u otro, pero entiendo que a donde va uno, el otro sigue.

El viaje del código de máquina comienza con una "búsqueda". Se aplica un patrón particular de voltajes a los cables del chip RAM que indica que este conjunto particular de bits debe enviarse a la CPU. ¿Por qué? No sé, no me importa. Por lo general, esa señal se envía porque la CPU terminó la última instrucción y está pidiendo una nueva como respuesta instintiva, como un perro que pide un segundo regalo después de que le dio el primero. Este proceso comienza con una patada primordial en los pantalones causada por una inestabilidad natural en la CPU. Cuando una fuente de alimentación aplica un voltaje constante al chip, los aumentos de voltaje eventualmente conducen a que la CPU ponga los voltajes correctos en los chips RAM para obtener las primeras instrucciones (estoy agitando un poco la capa de BIOS, porque no es importante a la historia. Búscalo).

La memoria moderna transmite datos en paralelo. Esto significa que los bits que componen el código de la máquina se dividen en "carriles" (32 o 64 son comunes), que es la forma lógica de decir los cables 32/64 de la RAM a la CPU. El voltaje en esas líneas aumenta y disminuye según sea necesario para transmitirlo a la CPU.

Una vez que está en la CPU, puede hacer su trabajo. Este es el ámbito de la microarquitectura , y puede complicarse porque es literalmente una industria de mil millones de dólares. Esos voltajes afectan a los transistores, que afectan a otros voltajes, en formas que podríamos describir como "agregar bits" o "multiplicación". En realidad, son solo voltajes que representan esos bits, de la misma manera que podríamos garabatear la cadena de 5 caracteres "2 + 2 = 4" en una hoja de papel y decir que hicimos matemáticas. El lápiz de grafito no es el número dos. Es solo la representación física que estamos usando para ese número.

Entonces eso es lo que hace el sistema real, a un nivel tremendamente alto. Me he saltado bien ... casi todo ... pero es lo suficientemente decente como para poder volver a tu pregunta real. ¿Cómo se vería [metafóricamente]?

De hecho, creo que Martin Molin pudo haber construido la mejor metáfora, con su máquina de mármol . El código de la máquina está codificado (a mano) en algunas tiras de Lego Technics en el medio como clavijas, en lugar de voltajes en un condensador. Esto se parece más a EPROM que a DRAM, pero ambos contienen datos. Las canicas son como los electrones, movidas por voltajes (o gravedad, en el caso de las canicas). Y a medida que los electrones se mueven, aplican fuerza a las puertas que hacen cosas.

Su máquina es simple, en comparación con una CPU moderna, pero no es tan mala, en lo que respecta a las metáforas. Y es pegadizo!

Cort Ammon - Restablece a Monica
fuente
1
La máquina de mármol es demasiado simple para esto en el video. Una CPU necesita estado.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Verdadero. Supongo que si la máquina de mármol tuviera algunas puertas que le permitieran tirar las palancas automáticamente en lugar de que Marin tuviera que voltearlas, estaría más cerca.
Cort Ammon - Restablece a Monica el
¡Gracias! Similar a la pregunta que hice en la respuesta anterior, ¿el código de ensamblado ensamblado se consideraría un código de máquina que se traduce en voltajes y cosas así?
Tim Hardly
@TimHardly Usando los únicos significados para "ensamblado", "Ensamblado" y "Código de máquina", el producto del ensamblaje de ensamblaje se define como código de máquina (así que sí, puede considerarse que es eso =)). Algo que podría ayudar es que tanto el código de ensamblaje como el de máquina se consideran conceptos "lógicos", más cercanos al concepto matemático de "2 + 2 = 4" y más alejados del grafito en el papel en el que se escribe esa ecuación. El código de ensamblaje / máquina es el código de ensamblaje / máquina ya sea que se esté almacenando en un disco magnético, escrito en una hoja de papel o almacenado en condensadores en DRAM.
Cort Ammon - Restablece a Monica el
1
Si puedo volverme filosófico, el código máquina es código máquina porque lo tratamos como código máquina. Lo consideramos como un código de máquina. Puedo apuntar una CPU a los bytes que describen un sonido en formato .wav, y de hecho los ejecutará como código de máquina. Es probable que la ejecución resultante no haga nada útil (porque el sonido no fue construido para ser código de máquina), y puede detenerse, pero podría ejecutarse.
Cort Ammon - Restablece a Monica el
10

Mira este video , en particular 1:00 a 1:17. Eso es exactamente lo que parece cuando un programa se ejecuta en una computadora. Las dos filas de luces muestran el contenido actual del registro de direcciones y el registro de datos. El PDP-11 no tiene un registro de instrucciones, pero si hubiera una y hubiera luces en el frente para mostrar su contenido, se vería más o menos igual. 16 luces, algunas de ellas encendidas, otras apagadas.

Si realmente le gustaban las luces intermitentes, podría tener más luces para mostrar el contenido actual de los seis registros, el puntero de la pila, el contador del programa ... para otras 32768 luces, podría tener una luz para cada bit del caché. Incluso podría tener una luz para cada bit de memoria ... pero eso realmente sería una gran cantidad de luces.

Este es un PDP11-70 que se ejecuta a 15,2 MHz, y cada instrucción tarda aproximadamente 1,5 microsegundos en ejecutarse. El ojo humano puede detectar cambios de hasta 1/10 de segundo, y en ese momento, el PDP-11 puede ejecutar 60,000 instrucciones. Básicamente, todo es borroso.

JavaLatte
fuente
Wow, ese es un buen ejemplo, he visto a otros como ellos, algo en ese sentido donde puedes ver luces y otras cosas. youtube.com/watch?v=yOyaJXpAYZQ
Tim Hardly
6

Los diseñadores de hardware que implementan y prueban (y prueban y prueban) el procesador realmente usan modelos visuales para ver qué están haciendo sus diseños. La mayoría (si no todas) las herramientas de simulación HDL generan vistas de onda de todos los registros y cables para permitir una depuración fácil. La captura de pantalla a continuación (tomada de aquí ) muestra estas ondas del simulador VCS para un procesador RISC-V que ejecuta algunas instrucciones.

DVE Waves para RISC-V

Este es un ejemplo bastante simple que muestra un pequeño subconjunto de la lógica involucrada en un diseño de procesador completo. Puede abrir estas vistas para todo el procesador y ver cómo se propagan los datos a través de la lógica. Si desea ver el código de la máquina en ejecución, como mencionó, puede mirar las ondas para el registro de instrucciones o el bus que utiliza el procesador para leer las instrucciones de la memoria. La mayoría de los visores de ondas tienen opciones de visualización flexibles para buses y registros que le permiten mostrar sus valores como etiquetas binarias, hexadecimales, octales e incluso como etiquetas de enumeración. En algunos, incluso puede definir sus propias funciones para asignar patrones de bits a los valores mostrados.

Vale la pena señalar que esto es solo una representación de una simulación del procesador. No hay forma de obtener este tipo de vistas para un chip procesador ya fabricado.

jtst
fuente
2

Imagine a un ciego tropezando por un callejón en construcción. En todas partes hay agujeros y grietas, por lo que, naturalmente, debería caerse. No este ciego, ya que tiene un rollo de papel con instrucciones, cuándo esperar, cuándo moverse, dónde moverse y cómo manipular su entorno para llegar al final del camino. Eso es lo que es una asamblea, una lista de instrucciones seguidas a ciegas: solo tienen sentido para este callejón y para este ciego. En teoría, incluso puede reconstruir un modelo 3D solo a partir de las instrucciones (Descompilación).

Cada cambio en la plataforma, hace necesario volver a compilar las instrucciones para el ciego. Debes conocer el hardware (el diseño del sitio de construcción), las instrucciones de intención humana (Código de alto nivel) como "Quiero que saltes sobre todas las cercas que encuentres en una fila hasta que no tengas 12 cercas detrás de ti" y el habilidades de los ciegos (CPU). ¿Tiene memoria a corto plazo, la capacidad de hacer varias cosas a la vez?

Tomar toda esta información y forjar un desplazamiento coherente de instrucciones es el trabajo del compilador.

Entonces, ¿puedo describir cómo se ve un programa? No. ¿Pero podemos describir cómo se sentiría ejecutarlo? Sí, se sentiría como un salto y una carrera, como un espejo sin ver algo, siguiendo una lista precisa de instrucciones, donde sea que lo lleve.

Pica
fuente