desktop

Tamaño del bus de datos

Buenas a todos,

soy nuevo en el foro y me ha surgido una duda que me gustaría resolver. Estoy estudiando sobre los buses de la memoria como el bus de datos, el de control, el de direccionamiento... Por lo que he leído, en los micros de 64bits aparte de los registros, el tamaño de palabra y el bus de datos también son de 64 bits. Si el bus de datos es de 64bits entiendo que cada vez que guarde información en la RAM guardará una palabra de 64bits en cada localidad direccionable de esta. Sin embargo, trabajando con punteros en c, creo uno que apunte a una cadena y muestro la dirección donde esta almacenada, luego incrementos en 1 el puntero y la dirección se incrementa en 1 y ahora apunta al siguiente carácter por lo que entiendo que cada localidad direccionable de la RAM es de un 1byte (1 carácter). Alguien podría aclararme esta duda?

PD: No se si ha quedado claro o lo he liado demasiado. Cualquier cosa podeis preguntarme.

Muchas gracias.
 
Bienvenido!
Primero que nada, hay hilos en el foro donde se habla de lo mismo, es allí donde deberias hacer tu consulta, por otro lado hay abundante bibliografía sobre el tema en toda la red y no solamente en inglés hay mucho sobre eso en la lengua de Cervantes.

El procesador lee la cantidad de posiciones necesarias para completar el ancho de palabra que utilice (32 o 64bits). La memoria es la misma para ambas plataformas.
 
Buenas Pandacba,

Antes que nada muchas gracias por la pronta respuesta.
Con respecto a lo de la información en internet he buscado muchísima bibliografía sobre el tema en google antes de preguntar en el foro y he encontrado info pero todos los esquemas y ejemplos que he encontrado utilizaban buses de datos de 8 bits y no me terminaba de aclarar la duda en el caso de micros potentes. Podrías por favor indicarme en que parte del foro debería hacer la pregunta o encontrar mayor información para ampliar tu respuesta?

Gracias.
 
Hola, para almacenar un carácter sólo se necesita 1 byte. Ahora sí almacenamos un número con coma flotante de doble precisión utiliza 8bytes.
El hecho que un procesador pueda direccionar 64 bits de lo que sea, (bus o datos) no implica que todas las palabras tengan esa amplitud.
 
Muchas gracias por tu respuesta.

He hecho la prueba también con un double y deduzco por los resultados que cada localidad direccionable de la RAM es de 1byte no? Hago la prueba con un double, luego le sumo 1 al puntero y muestro de nuevo la dirección de memoria y ha aumentado en 8, por lo que ha ocupado 8 localidades de 1byte cada una.
 
... en los micros de 64bits aparte de los registros, el tamaño de palabra y el bus de datos también son de 64 bits. Si el bus de datos es de 64bits entiendo que cada vez que guarde información en la RAM guardará una palabra de 64bits en cada localidad direccionable de esta.

No necesariamente. Si no interpreto mal, estarias diciendo que un micro de 64 bits no puede manejar memoria/palabras de menos de 64bits?

O para llevarlo al mundo de los microcontroladores, seria decir que un micro de 16 bits no puede manejar datos de 8 bits, o que un micro de 32 bits no puede manejar datos de 16 bits.

Para microcontroladores no es asi por el hecho de que hay instrucciones de assembler con variantes para 8/16 bits.
Habria que buscar el ISA (instruction set architecture) y ver si cuenta por ejemplo, no solo con una instruccion MOV (32 bits), sino tambien MOV.B (byte), MOV.W etc.

Sin embargo, trabajando con punteros en c, creo uno que apunte a una cadena y muestro la dirección donde esta almacenada, luego incrementos en 1 el puntero y la dirección se incrementa en 1 y ahora apunta al siguiente carácter por lo que entiendo que cada localidad direccionable de la RAM es de un 1byte (1 carácter). Alguien podría aclararme esta duda?

Bueno, aca por tratarse de computadoras no es tan facil el asunto como con microcontroladores.
Entre una instruccion de codigo que se ejecuta en la PC y la memoria fisica de la maquina hay controlador de memoria, cache, sistema operativo, memoria virtual (y seguro algunas cositas mas que me olvido). Ah si, y el compilador del programa!!!

En tu ultimo mensaje tambien hay una palabra importante: direccionable (addressable), que seria tamaño minimo de la memoria que se puede escribir/leer de la memoria. Si es byte-addressable cada byte tiene una direccion de memoria. Si es word-addressable cada word (16/32/64 bits segun ancho de bus de la maquina) tiene una direccion de memoria.

Creo (cuidado con esa palabra, encienda alarma señor lector) que la memoria de una computadora normal es direccionable byte a byte.
Creo que algunos DSP por ejemplo no pueden direccionar menos que 1 word (si es de 16 bits no puede leer menos de 16 bits de una sola vez).

Pasamos a C....
En C si el puntero es un tipo byte, puntero++ puede (dependiendo de las optimizaciones que el compilador juzgue conveniente emplear) incrementar el puntero en 1.
Si el puntero apunta a un tipo int, puntero++ incrementara en 4 si es una maquina de 32 bits, o en 8 si es de 64 bits (el tipo int suele ser del tamaño del bus de datos).

Y tambien ahi esta el temita de alineacion de memoria, que es simplemente que si declaras una variable el compilador va a ubicarla en una posicion de memoria multiplo del ancho de bus del sistema.
Quiero decir, si tenemos:
char a,b;
En una maquina de 32 bits la variable "a" va a estar en la direccion 0x0000-0040, y "b" en la direccion 0x0000-0044.
En una maquina de 64 bits la variable "a" va a estar en la direccion &a = 0x0000-0000-0000-0040, y "b" en la direccion 0x0000-0000-0000-0048.

Eso se hace para poder escribir/leer/operar las variables con 1 sola instruccion. Por eso se habla de desperdicio de memoria, porque hay huecos entre "a" y "b", pero eso no es un problema con las memorias multi-gigabyte del presente.

Pero char a[2];
seguira usando memoria continua. Es decir, en 32 bits ocuparia las direcciones 0x0000-0040 y 0x0000-0041
Por ahi ya esto depende mucho del lenguaje, tambien supuse que char es de tamaño byte, que puede no serlo tambien :(
Char puede ser bastante ambiguo como tipo de datos, hacer de cuenta que en lo anterior en vez de char dije uint8_t (stdint.h)

Bueno, creo que ya aporte bastante confusion, me retiro en medio de la bruma... :p
 
Muchísimas gracias por tu respuesta Ardogan.

Esta todo muy bien explicado y me ha quedado clarísimo.

Gracias también a los que habéis respondido.

Doy el tema por cerrado
 
Atrás
Arriba