2012-03-17 17 views
5

En C cada byte es direccionable individualmente. Supongamos que un entero (digamos que usa 4 bytes) tiene una dirección 0xaddr (que es de 32 bits, suponiendo que tenemos un procesador de 32 bits con bus de direcciones de 32 bits y bus de datos de 32 bits) y supongamos que el valor del entero es 0x12345678. Ahora, si estoy obteniendo este valor de la memoria, ¿cómo lo hace el procesador? ¿El procesador coloca 0xaddr (que es una dirección de 32 bits) en las líneas de dirección y luego busca datos de 8 bits, por ejemplo 0x12. ¿Y luego el procesador marcará 0xaddr+1 en líneas de dirección y luego buscará otros datos de 8 bits 0x34 y así sucesivamente para los 4 bytes de un número entero? ¿O el procesador simplemente coloca 0xaddr y lee los 4 bytes a la vez utilizando su bus de datos completo de 32 bits?¿Cómo se obtienen los datos de la RAM?

+0

Depende. ¿De qué procesador exacto estás hablando? IIRC el 8086 tenía un bus de datos de 16 bits. Muchos modelos más nuevos (Pentium y superiores) tenían un FSB de 64 bits. – harold

+0

@harold: ¿puedes decirme por qué es diferente para diferentes procesadores? Estoy preguntando en general y no específicamente a ningún procesador. ¿Cómo se hará, digamos que fo 8086, que tiene un bus de datos de 16 bits, y cómo para el bus de datos de 32 bits y para el 64? gracias – mezda

+0

es mucho más complejo que un simple bus de datos, también hay caché –

Respuesta

5

This is a well known article por el cable de la biblioteca GNU C que describe el acceso a la memoria (particularmente en x86 - PC actual - sistemas).Entra en muchos más detalles de los que posiblemente pueda necesitar.

El artículo completo se extiende por muchas partes:

  1. Introduction
  2. CPU Caches
  3. Virtual Memory
  4. NUMA Support
  5. Programmers
  6. More Programmers
  7. Performance Tools
  8. Future
  9. Appendices

una cosa que me gustaría añadir a la respuesta de gbulmer es que en muchos sistemas recibiendo un flujo de datos es más rápido de lo que cabría esperar de conseguir una sola palabra. en otras palabras, seleccionar de dónde quiere leer lleva algo de tiempo, pero uno tiene esa selección, leyendo desde ese punto, y luego los siguientes 32 o 64 bits o lo que sea, y luego el siguiente ... es más rápido que cambiar a algún lugar desconectado y leyendo otro valor.

y lo que domina la programación moderna no es el comportamiento de recuperar de la memoria en la placa base, sino si los datos están en una memoria caché de la CPU.

4

Si busca en la web "Arquitectura de computadora", es probable que obtenga algunas respuestas a sus preguntas.

Para su pregunta específica, una computadora de 32 bits, con un bus de datos y direcciones de 32 bits, para un caso simple, sin hardware ofuscante. Leerá 32 bits de una memoria de 32 bits de ancho.

Este es el tipo de hardware que existía desde finales de 1970 como minicompuestos (por ejemplo, DEC VAX) y todavía existe como microprocesadores (x86, ARM, Cortex-A8, MIPS32) y algunos microcontroladores (por ejemplo, ARM, Cortex M3, PIC32, etc.). El caso más simple: El bus de direcciones es un conjunto de señales (cables) que llevan señales de dirección a la memoria, más unas pocas señales para comunicar si la memoria debe leerse o escribirse (datos dirección), y si las señales en la dirección y los cables de dirección de datos son válidos. En el caso de su ejemplo, podría haber 32 cables para llevar el patrón de bits de la dirección.

El bus de datos es un segundo conjunto de cables que comunican el valor hacia y desde la memoria. La memoria podría afirmar una señal para decir que los datos son válidos, pero podría ser lo suficientemente rápido como para que todo "simplemente funcione".

Cuando el procesador pone la dirección en las señales de dirección, dice que quiere leer desde la memoria (la dirección de datos es 'leer'), la memoria recuperará el valor almacenado en esa dirección y lo colocará en las señales del bus de datos. El procesador (después de los retardos y señales adecuados) tomará muestras de los cables del bus de datos, y ese es el valor que usa.

El procesador puede leer los 32 bits completos y extraer un byte (si eso es todo lo que requiere la instrucción) internamente, o el bus de direcciones externo puede proporcionar señales adicionales para que el sistema de memoria externo pueda crear el byte apropiado , byte doble o byte de cuatro valores. Durante muchos años, las versiones de la arquitectura del procesador ARM solo podían leer los 32 bits completos, y las piezas más pequeñas, por ejemplo, un byte, se extraían internamente.

Puede ver un ejemplo de este tipo de señal establecida en http://www.cpu-world.com/info/Pinouts/68000.html Ese chip solo tiene un bus de direcciones de 24 bits y un bus de datos de 16 bits. Tiene dos señales (UDS y LDS) que indican si se están utilizando las señales de datos superiores, las señales de datos inferiores o ambas.

Encontré una explicación razonablemente detallada en research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf Lo encontré buscando "ciclo de bus de memoria 68000".

Puede que sea útil buscar MIPS, ARM o x86 para ver su ciclo de bus.

Cuestiones relacionadas