procesador ingles cortex arquitectura cpu arm cpu-architecture

cpu - ingles - ¿Cómo se diferencian las instrucciones de los datos?



arquitectura arm pdf (6)

Mientras leía el documento básico de ARM, tengo esta duda. ¿Cómo diferencia la CPU los datos de lectura del bus de datos, ya sea para ejecutarlo como una instrucción o como datos sobre los que puede operar?

Consulte el extracto del documento -

"Los datos ingresan al núcleo del procesador a través del bus de datos. Los datos pueden ser una instrucción para ejecutar o un elemento de datos".

Gracias de antemano por iluminarme! /SRA


Cada código de operación constará de una instrucción de N bytes, que luego espera que los subsecuentes M bytes sean datos (punteros de memoria, etc.). Entonces, la CPU usa cada código de operación para determinar cuántos de los siguientes bytes son datos.

Ciertamente, para los procesadores antiguos (por ejemplo, los viejos tipos de 8 bits como 6502 y similares) no había diferenciación. Normalmente señalaría el contador del programa al comienzo del programa en la memoria y eso haría referencia a los datos de otro lugar en la memoria, pero el programa / datos se almacenaron como simples valores de 8 bits. El procesador en sí no pudo diferenciar entre los dos.

Era perfectamente posible apuntar el contador del programa a lo que se había considerado como datos, y de hecho recuerdo un viejo tutorial de la universidad donde mi profesor hizo exactamente eso, y tuvimos que señalarle el error. Su respuesta fue "¡pero eso es información! ¡No puede ejecutar eso! ¿No es así?", En ese momento llené nuestros datos con códigos de operación válidos para demostrar que, de hecho, podría hacerlo.


Creo que se debe a que los datos se almacenan en el programa y el soporte del sistema operativo para informar a la CPU si se trata de código o datos.

Todo el código se coloca en diferentes segmentos de la imagen (junto con datos estáticos como cadenas de caracteres constantes) en comparación con el almacenamiento de las variables. El sistema operativo (y la unidad de administración de memoria) necesitan saber esto porque pueden cambiar el código de la memoria simplemente descartándolo y volviéndolo a cargar desde el archivo de disco original (al menos así es como lo hace Windows).

Entonces, creo que la CPU ''sabe'' si la memoria es datos o código. Sin duda, las CPU actuales también tienen instrucciones para leer esta memoria de forma diferente para ayudar a la CPU a procesarla lo más rápido posible (por ejemplo, el código puede no almacenarse en caché, los datos siempre se accederán aleatoriamente en lugar de en una transmisión)

Todavía es posible apuntar el contador de su programa a los datos, pero el sistema operativo puede indicarle a la CPU que lo evite: consulte el bit NX y la configuración de "Protección de ejecución de datos" de Windows (panel de control del sistema)


Se sabe que cada lectura del procesador es una búsqueda de datos o una búsqueda de instrucciones. Todos los procesadores antiguos y nuevos conocen sus capturas de instrucciones de las recuperaciones de datos. Desde el exterior puede o no ser capaz de decir, generalmente no excepto para los procesadores de arquitectura de Harvard, por supuesto, que el ARM no lo es. He estado trabajando con el mpcore (ARM11) últimamente y hay bits en la interfaz externa que le dicen un poco sobre qué tipo de lectura es, sobre todo para conectar un caché externo, combinar eso con el conocimiento de si tiene el mmu y la caché L1 activada y puede indicar los datos de la instrucción, pero esa es la excepción a la regla. Desde la perspectiva del bus de memoria, no son solo bits de datos que no conoce los datos de las instrucciones, pero la lógica que inició ese ciclo de memoria y está esperando el resultado, sabía antes de comenzar el ciclo qué tipo de recuperación era y qué iba a hacer. con esa información cuando lo consigue.


El diseño original de ARM tenía una tubería de tres etapas para ejecutar instrucciones:

  1. FETCH la instrucción en la CPU
  2. DECODE las instrucciones para configurar la CPU para su ejecución
  3. EJECUTAR la instrucción.

La lógica interna de la CPU asegura que sabe si está obteniendo datos en la etapa 1 (es decir, una búsqueda de instrucciones), o en la etapa 3 (es decir, una búsqueda de datos debido a una instrucción de "carga").

Los procesadores ARM modernos tienen un bus separado para obtener instrucciones (por lo que la tubería no se detiene mientras se obtienen datos) y una tubería más larga (para permitir velocidades de reloj más rápidas), pero la idea general sigue siendo la misma.


Respuesta simple - no es así. Las instrucciones del código de máquina son solo números binarios, al igual que los datos. Respuesta más complicada: su procesador puede (o no) proporcionar segmentación de memoria, lo que significa que intentar ejecutar lo que se ha especificado como datos provoca una trampa de algún tipo. Este es uno de los significados de una "falla de segmentación": el procesador intentó ejecutar algo que no estaba etiquetado como código ejecutable.


Entonces, creo que la CPU ''sabe'' si la memoria es datos o código. Sin duda, las CPU actuales también tienen instrucciones para leer esta memoria de forma diferente para ayudar a la CPU a procesarla lo más rápido posible (por ejemplo, el código puede no almacenarse en caché, los datos siempre se accederán aleatoriamente en lugar de en una transmisión)