Académique Documents
Professionnel Documents
Culture Documents
Cap. 5: Memoria.
José Daniel Muñoz Frías
Índice
1. Introducción. Jerarquía de memorias.
2. Características de las memorias.
3. Memorias de acceso aleatorio.
a) Banco de registros.
b) Memoria SRAM.
c) Memoria DRAM.
d) Memoria ROM.
4. Organización de la memoria.
5. Memorias asociativas.
6. Memoria virtual.
ICAIdea Estructura de Computadores Cap. 5: Memoria.– p. 2
Introducción
La memoria almacena los datos y los programas del
computador.
Sus prestaciones marcan las del ordenador completo:
es un cuello de botella.
Existen varias tecnologías para su implementación:
• Las rápidas son caras y de poca capacidad.
• A mayor capacidad, más lentas y más baratas.
Esto hace necesario usar una jerarquía de
memorias.
En el capítulo 1 (pg. 9) se vio que la estructura básica de un ordenador estaba compuesta por una
CPU, una unidad de E/S y una memoria para almacenar los programas y los datos. La memoria es
por tanto una parte fundamental del ordenador. Además sus prestaciones limitan las prestaciones del
ordenador completo, pues aunque la CPU sea muy rápida, si la memoria no puede alimentarla con las
instrucciones y los datos que necesita, de nada nos valdrá tanta velocidad en la CPU.
Existen varias tecnologías para implantar las memorias, según se verá más adelante. En cuanto a
las prestaciones, por desgracia las memorias rápidas tienen poca capacidad y son caras, por lo que no
se pueden usar para dotar al ordenador de toda la memoria que necesita (salvo que se tenga muchísimo
dinero y ganas de malgastarlo). La solución es adoptar una jerarquía de memorias.
Introducción
CPU
Registros
Velocidad
Coste/bit
Cache
Memoria principal
Memoria secundaria (HD)
Memoria terciaria (CD, cintas)
Tamaño
ICAIdea Estructura de Computadores Cap. 5: Memoria.– p. 4
En la práctica los programas muestran localidad temporal (si un dato acaba de usarse, es muy
probable que vuelva a ser usado en breve) y espacial (si se accede a un dato, es muy probable que sea
necesario acceder a datos que están próximos a él). La jerarquía de memoria saca partido de ambas
localidades: para aprovechar la localidad temporal el sistema mantiene cerca del procesador los datos
usados más recientemente. Para aprovechar la localidad espacial se mueven los datos entre los niveles
de jerarquía en bloques de varias palabras contiguas en la memoria.
Dentro del procesador sólo hay una pequeña fracción de la memoria total: los registros. Cierta-
mente sería deseable contar con infinitos registros, pero como se ha visto en el tema anterior esto es
impracticable. De la misma forma, lo ideal sería disponer de varios Gb de memoria directamente ac-
cesible por el procesador. Sin embargo, debido a la alta velocidad de éste, la memoria necesaria para
que el procesador pueda acceder a ella sin tener que esperar es muy cara y poco densa (pocos kB por
chip), lo cual hace impracticable dicha solución. No obstante, aprovechando el principio de localidad
es posible colocar una pequeña fracción de la memoria total directamente accesible por el procesador
(cache) de forma que se almacenen en ésta los datos e instrucciones que está usando el procesador.
De la misma forma que cuando un dato no está en un registro ha de leerse de la memoria cache, si un
dato no está en la cache es necesario traerlo desde la memoria principal. Asimismo, si un dato no está
en la memoria principal es necesario ir a buscarlo a la memoria secundaria y así sucesivamente. Si la
tasa de aciertos (objetos que están en la cache) es alta, la jerarquía de memoria tiene una velocidad
efectiva cercana a la de la memoria cache y un tamaño igual al nivel más bajo de la jerarquía.
Los tres primeros niveles residen en la circuitería del ordenador, unidos a la CPU mediante buses.
La memoria secundaria está formada por dispositivos que se conectan a la CPU mediante sistemas de
entrada/salida. Actualmente lo típico es usar discos duros. Por último el nivel mas bajo está formado
por dispositivos en los que el medio donde se almacenan los datos puede ser cambiado (CD, cintas,
DVD, etc.) lo que hace que su tamaño sea “ilimitado” aunque su velocidad de acceso será la más lenta,
sobre todo si el medio no está insertado en la unidad.
Características de las memorias
Las memorias se caracterizan por su:
• Ubicación:
• Interna: Conectada directamente a la CPU.
• Externa: Conectada a la CPU a través de E/S.
• Capacidad:
• En las memorias externas se expresa en
bytes.
• En las internas se expresa en bytes o
palabras.
Antes de profundizar en el tema, es conveniente estudiar una serie de características de las me-
morias que permiten su clasificación.
Según su ubicación las memorias pueden ser internas cuando la CPU puede acceder directamente
a ellas. Típicamente estas memorias suelen estar conectadas en la misma placa de circuito impreso
que la CPU. Estas memorias están formadas en la actualidad por dispositivos basados en semiconduc-
tores (chips). La memoria externa está situada fuera de la tarjeta de circuito impreso y la CPU sólo
puede acceder a ellas a través de los circuitos de entrada salida. En la actualidad están formadas por
dispositivos de almacenamiento magnético u óptico (discos duros, cintas, CD, DVD, etc.).
La capacidad de las memorias varía enormemente según su tecnología. Las memorias semicon-
ductoras varían desde unos pocos kB a unas decenas de MB. En cambio las memorias basadas en
elementos magnéticos en la actualidad tienen capacidades de varias decenas de GB.
En la mayoría de las situaciones la capacidad de memoria se da en bytes, ya que esta es la unidad
mínima con la que trabajan la mayoría de las CPU (recuerde que un byte se usa para almacenar un
carácter). No obstante en algunos casos el tamaño de la memoria interna se da en palabras en lugar
de en bytes. Además no ha de olvidar que, según se comentó en el capítulo 2 los prefijos k, M y G
cuando se habla de memoria secundaria suelen significar 10 3 , 106 y 109 , mientras que cuando se habla
de memoria interna significan 210 = 1,024, 220 = 1,048,576 y 230 = 1,073,741,824.
Características de las memorias
Las memorias se caracterizan por su:
• Unidad de transferencia:
• Palabras para la memoria interna.
• Bloques para la memoria externa.
Recuerde que:
• La memoria interna se organiza en palabras pero,
• La unidad direccionable suele ser el byte.
La memoria externa se organiza en bloques de varios cientos de bytes, ya que es muy costoso
localizar un determinado byte en el medio, por lo que una vez localizado se transfiere todo el bloque
para aumentar las prestaciones aprovechando el principio de localidad. La memoria interna en cambio
se organiza en palabras de varios bytes de longitud, transfiriéndose en la mayoría de los sistemas una
sola palabra a la CPU a la vez.
El concepto de palabra es bastante “espinoso”. Se suele definir como la unidad “natural” de or-
ganización de la memoria. En general la unidad “natural” será igual al ancho del bus de datos usado
para acceder a la memoria. Por ejemplo en el MIPS las palabras son de 32 bits ya que el bus de datos
es de 32 bits. En este caso las instrucciones y los registros enteros son también de 32 bits. No obstante
en otras arquitecturas las palabras con las que trabaja el procesador no coinciden con su bus de datos.
Por ejemplo el 8088 trabajaba con palabras de 16 bits pero su bus de datos era de 8 bits, con lo que
la memoria se organizaba en “palabras” de un byte. Otro ejemplo son las organizaciones de las me-
morias principales en sistemas con memoria cache. En estos casos la memoria cache se organiza en
palabras de la longitud del bus de datos del procesador, pero la memoria principal puede organizarse
en palabras de un mayor número de bits para aprovechar la localidad de los accesos. Nótese que para
ello es necesario usar un bus de datos entre la memoria cache y la principal del tamaño de la palabra
de la memoria principal.
Por último es necesario tener en cuenta que en la mayoría de los sistemas la mínima unidad
direccionable es el byte, ya que este es el tamaño mínimo usado por la CPU, típicamente para contener
un carácter ASCII. No obstante en los sistemas con palabras mayores de un byte la unidad mínima de
transferencia es una palabra. Si la CPU desea acceder a un byte, se lee la palabra entera que contiene
el byte y se realiza una multiplexación dentro de la CPU para acceder al byte requerido.
Características de las memorias
Las memorias se caracterizan por su:
• Método de acceso:
• Secuencial. Cintas.
• Directo. Discos.
• Aleatorio. Memoria principal y cache.
• Asociativo. Tablas de etiquetas para cache.
En las siguientes transparencias se van a estudiar los distintos tipos de circuitos usados para
implantar la memoria interna. Los dispositivos empleados para la memoria externa se estudiarán en el
capítulo de entrada y salida.
Los cuatro tipos de memoria utilizados en los tres primeros niveles de la jerarquía de memorias
mostrada en la página 4 son:
• Registros internos. Son accesibles directamente por el procesador. Según se verá a
continuación se accede a ellos mediante multiplexores de pocas entradas, por lo que los
tiempos de acceso son mínimos. El inconveniente principal es el número limitado de registros.
• SRAM (del inglés Static Random Access Memory. Las memorias RAM estáticas son las
utilizadas en los ordenadores actuales para implantar las memorias cache debido a su bajo
tiempo de acceso.
• DRAM (del inglés Dinamic Random Access Memory). Son los circuitos utilizados para
implantar la memoria principal. El termino dinámico, como se verá mas adelante, se refiere a
que este tipo de memorias precisa un refresco periódico de sus contenidos para evitar que se
pierdan. Por el contrario las memorias estáticas conservan sus datos mientras no se corte la
alimentación.
• ROM (del inglés Read Only Memory). Son memorias de solo lectura pero que al contrario que
las RAM mantienen sus datos incluso cuando se corta la alimentación. 1 Por ello se usan para
almacenar los programas de arranque de los ordenadores, las BIOS, etc.
1 Por
ello se dice que este tipo de memorias son no volátiles y las RAM se dice que son
memorias volátiles.
Banco de registros
Register file
Read register
number 1 Read
5 data 1
Read register 32
number 2
5
Write register
number
5 Read
Write data 2
data Write 32
32
En la figura se muestra un esquema del banco de registros (register file en inglés) del MIPS. Los
bancos de registros de los demás procesadores son similares. Se ha elegido el del MIPS por estar
familiarizados ya con este procesador.
Como se puede apreciar, dicho banco consta de dos puertos de salida: Read data 1 y Read data
2 de 32 bits y un puerto de entrada Write data, también de 32 bits. De esta forma se pueden leer los
dos registros que forman los operandos de las instrucciones MIPS y se puede guardar el resultado en
un tercer registro. Las entradas Read register number 1 y Read register number 2 indican los
números de los registros cuyos contenidos han de aparecer en los dos puertos de salida y la entrada
Write register number indica el número de registro en donde se ha de escribir el dato del puerto
Write data. Dicho dato sólo se escribirá en el flanco de reloj en el que la señal Write esté activa.
Banco de registros. Lectura
Read register
number 1 5
Register 0
Register 1 M
u Read data 1
Register n − 1 x 32
Register n
Read register
number 2 5
M
u Read data 2
x 32
En la figura se muestra la circuitería de lectura del banco de registros. Como se puede apreciar,
cada uno de los puertos de salida consta de un multiplexor que selecciona cuál de los registros se
conecta con la salida en función de la entrada de control Read register x. El funcionamiento será
por lo tanto asíncrono: el contenido del registro seleccionado mediante la entrada Read register x
aparecerá en la salida Read data x después del retardo del multiplexor.
Banco de registros. Escritura
Write
E
0
Register 0
1 D
Write register n to−1 E
number 5 decoder Register 1
D
n−1
n
E
Register n−1
D
E
Register n
Write data D
32
En la figura se muestra la circuitería de escritura del banco de registros. En este caso el puerto de
entrada Write data está conectado a la entrada de todos los registros. Mediante el demultiplexor de
n a 1 se selecciona el registro cuyo número aparece en la entrada Write register number, de forma
que cuando se active la entrada Write, sólo se habilite dicho registro para escritura. Nótese que los
registros son síncronos, por lo que la escritura se realizará en el flanco del reloj.
Banco de registros. Temporización
Clk
Read register
number 1 1 4 3
Write
Chip select
SRAM 8
Output enable Dout[7−0]
32K × 8
Write enable
1 Algunos circuitos unen estas dos últimas señales en una sola línea R/W, de forma que
cuando dicha línea está a 1 se realiza una lectura y cuando está a cero una escritura
Memoria SRAM. Celda de 1 bit
B A
Q2 Q1
fila
−bit bit
ICAIdea Estructura de Computadores Cap. 5: Memoria.– p. 15
En la figura se muestra el circuito usado para implantar una celda de 1 bit en las memorias está-
ticas. El valor del bit se almacena mediante dos inversores acoplados. Así, cuando en el punto A haya
un 1 lógico, en el punto B habrá un cero lógico y en la celda tendremos almacenado un 1 lógico. De
la misma manera, cuando se almacene un cero, el punto A estará a cero y el B a uno. Para leer la celda
basta con activar la entrada fila, con lo que los transistores de paso Q1 y Q2 conducirán y las salidas
bit y -bit tomarán los valores almacenados en A y B respectivamente. El proceso de escritura es
similar: el valor a escribir se sitúa en bit y su negado en -bit, para a continuación activar la entrada
fila que habilite los transistores de paso para forzar los puntos A y B al nuevo valor.
Como se puede apreciar el valor escrito permanece estable mientras no se corte la alimentación.
El precio a pagar por ello es la complejidad de la celda, ya que se necesitan 6 transistores: los dos de
paso y dos más para cada puerta inversora. Esto hace que este tipo de memorias sea caro y poco denso.
Una descripción más detallada de este circuito, así como de varias alternativas, puede encontrarse
en (Weste y Eshraghian, 1993).
Memoria SRAM. Decodificación de dir.
Acondicionamiento
líneas de bit
−bit bit
fila
0
A0
−bit bit
Decodificador de 15 a 32768
A1
A2 fila
1
−bit bit
fila
A14 32767
−bit bit
read Ampl. medida
write Buffer escr. D
Para construir una memoria de por ejemplo 32 kb basta con crear una matriz de 32kceldas y un
decodificador de 15 a 32.768 para, en función de la dirección, seleccionar la entrada fila de la celda
correspondiente.
Además de la matriz de celdas y el decodificador, son necesarios circuitos adicionales para leer y
escribir las células. En la parte superior de la figura se muestra un bloque denominado Acondicionamiento
de líneas de bit que se utiliza para poner las líneas bit y -bit a la mitad de la tensión de ali-
mentación, de forma que la lectura sea más rápida y fiable. A este proceso se le denomina precarga
y se realiza antes de cada lectura. Además, para realizar el interfaz con el exterior son necesarios un
amplificador de medida para amplificar el valor que aparece en las líneas -bit y bit y un buffer para
realizar las escrituras. Ambos circuitos se activan con las líneas read y write respectivamente. La
señal read también se encarga de habilitar la puerta triestado de la salida de datos.
El problema de este circuito es que tanto el decodificador de 15 a 32.768 como la matriz de celdas
son difíciles de implantar debido a que el circuito resultante es muy alargado (32.768 de alto por 1 de
ancho, si se suponen las celdas cuadradas) (Rabaey, 1996). Además como las conexiones verticales
serán muy largas, se producirán retardos inaceptables en el acceso a las celdas. Por tanto esta solución,
aunque en teoría es válida, en la práctica no se usa.
Para conseguir un acceso más rápido y un circuito aproximadamente cuadrado, en la práctica se
usan esquemas de decodificación en dos niveles, tal como se muestra en la siguiente transparencia.
Memoria SRAM. Decodificación de dir.
Acondicionamiento
líneas de bit
Decodificador de filas
A7 Línea de palabra
A8
A9
256
x
128
A14
Línea de bit
A0
Mux. Columna
A6
D
Como se puede apreciar, ahora la decodificación se hace en dos niveles. De esta forma se consigue
una matriz de celdas prácticamente cuadrada. En este ejemplo particular las dimensiones de la matriz
serán de 27 de ancho por 28 de alto. Además ahora tanto el decodificador de filas como el multiplexor
de columnas son de menos bits, con lo que ocuparán menor área en el chip y serán más rápidos.
El método de direccionamiento ahora consiste en seleccionar una fila de la matriz (línea de pa-
labra) con los bits superiores de la dirección. Si se realiza una lectura, toda esta línea se lee mediante
los 26 amplificadores de medida, aunque de todos los bits leídos de la línea sólo nos interesa un bit,
el cual se multiplexa hacia la salida con los bits inferiores de la dirección. En el caso de una escritura,
el primer paso es el mismo: se selecciona la fila correspondiente mediante los bits superiores de la
dirección. El segundo paso consiste en, utilizando los bits inferiores de la dirección, activar solamente
el buffer de escritura correspondiente a la celda donde se ha de escribir el bit de entrada.
Si se desea construir una memoria para almacenar palabras de N bits (4, 8 o 16 son valores
típicos), basta con ampliar la matriz para almacenar los bits necesarios y hacer que el multiplexor de
columna sea de N bits de salida. En el ejemplo anterior, si se desea construir una memoria de 32k x
4 bits, se podría utilizar una matriz de 256x512 celdas (128 · 4 = 512) y hacer que el multiplexor de
columnas sea de 4 bits.
Memoria SRAM. Temporización
Véase la hoja de características de la SRAM.
Q1
C1
Bit line
En la figura se muestra una celda de una memoria RAM dinámica. Como se puede apreciar consta
tan solo de 1 transistor y de un condensador, lo cual hace que tenga un tamaño reducido y por tanto se
consigue una gran densidad de almacenamiento. Recuerde que la celda SRAM necesita 6 transistores.
El precio que hay que pagar es una mayor complejidad del circuito de lectura y escritura. Además
la carga en el condensador se pierde con el tiempo a causa a las corrientes de fugas, por lo que es
necesario refrescar el estado de carga de estos condensadores periódicamente para evitar que los da-
tos se corrompan. Debido a que mientras dura el refresco no se puede acceder a los datos, se pierde
rendimiento. No obstante el periodo de refresco es de decenas de milisegundos y el tiempo emplea-
do en refrescar no es muy elevado, lo cual significa tan solo una pequeña pérdida de rendimiento.
Típicamente el refresco ocupa entre un 1 % y un 2 % del total de los ciclos de acceso disponibles
(Patterson y Hennessy, 2000).
Para leer el estado de la celda en primer lugar se precarga la línea de bit a una tensión igual a la
mitad de la alimentación. A continuación se activa la línea de palabra con lo que el transistor de paso
Q1 conduce y la carga almacenada en el condensador cambiará el valor de tensión de la línea de bit,
lo cual será detectado por el amplificador de medida. Conviene destacar que este proceso de lectura
es destructivo, ya que en este proceso se varía en gran medida la carga del condensador. Para evitar la
pérdida de datos, después de realizar la lectura se realiza un escritura del mismo dato para refrescarlo.
Para escribir en la celda se sitúa el dato en línea de bit y a continuación se activa la línea de
palabra para que el transistor Q1 conduzca de forma que el condensador se cargue o se descargue en
función del valor presente en la línea de bit.
Memoria DRAM. Decodificación de dir.
Acondicionamiento
líneas de bit
Decodificador de filas
A0 Línea de palabra
A1
A2
256
x
128
A7
A0
Mux. Columna
A6
cas D
fila
bit1 bit0
Decodificador de filas
A7 Línea de palabra
A8
A9
256
x
128
A14
Línea de bit
read
cs Ampl. medida
A0
Mux. Columna
A6
Como se puede observar en la figura, la organización interna de un chip de ROM es muy similar a
la de un chip de memoria SRAM. La principal diferencia está, aparte de en la estructura de cada celda
de bit, en la inexistencia de la señal de escritura. No obstante sigue existiendo una puerta triestado a la
salida del bus de datos, ya que, como se verá más adelante, en la mayoría de los sistemas se conectan
varios circuitos de memoria al bus de datos. Para controlar la puerta triestado existen dos señales: cs
(chip select) que habilita el chip y read que habilita la lectura. Por tanto la salida hacia el bus de datos
sólo se activará cuando se acceda al chip en modo de lectura.
El bloque de acondicionamiento de líneas de bit consta de una resistencia de pull-up para cada
línea de bit, aunque en memorias de gran capacidad se suele sustituir por circuitos más complejos para
disminuir las pérdidas.
Memoria ROM. Temporización
Son raras las aplicaciones en las que la memoria necesaria se encuentra en un solo chip. En
ocasiones se necesitan palabras más anchas que las soportadas por los chips, en otras ocasiones se
necesita más memoria que la disponible en un solo chip y en la mayoría de las ocasiones ocurren
ambas cosas: se necesita un ancho de palabra y una capacidad mayor que la disponible en un solo
chip.
Por ejemplo, supóngase que se se dispone de un microprocesador con un ancho de bus de datos
de 16 bits y se desea construir un sistema con 64 kB de memoria principal. Lamentablemente sólo
se dispone de chips de 32 kpalabras de 8 bits. Será por tanto necesario usar dos chips, de forma que
en uno de ellos se almacenen los 8 bits menos significativos y en el otro se almacenen los 8 bits más
significativos. En la transparencia siguiente se muestra un esquema del circuito resultante. Nótese que
el bit 0 del bus de direcciones (A0) no existe físicamente. En su lugar hay dos líneas: UDS (Upper data
strobe) y LDS (Lower data strobe). Cuando se realiza un acceso de 16 bits se activan ambas líneas
para de esta forma activar ambos chips de memoria mediante su entrada CS (Chip Select). Si se realiza
un acceso de 8 bits, entonces se activará la señal UDS si se accede a un byte situado en una dirección
impar o la LDS si se accede a un byte situado en una dirección par (suponiendo una organización little
endian). Obviamente en estos casos se multiplexará internamente el bus de datos.
En la transparencia 27 se muestra un esquema de bloques de un sistema con un procesador de 8
bits con un bus de direcciones de 16 bits. Se desea dotarlo de la máxima memoria posible y se dispone
de chips de 32 kpalabras de 8 bits. En este caso son necesarios también dos chips para implantar los
64 kB direccionables por el procesador, de forma que un chip almacenará los 32 kB más bajos de la
memoria y el siguiente los 32 kB más altos. Nótese que se usa la línea A15 del bus de direcciones para
seleccionar un chip u otro: cuando A15 valga 0 (acceso a las posiciones comprendidas entre 0x0000 y
0x7FFF), se activará la señal CS del primer chip y se desactivará la del segundo, con lo que el acceso
se realizará al primer chip. Si A15 vale 1 (acceso entre 0x8000 a 0xFFFF) se activará sólo el segundo
chip.
Organización de la memoria
15
8
A A[15..1] SRAM
UDS CS 32Kx8
LDS OE D[15..8]
WE
uP
D D[15..0]
15
OE
WE
8
SRAM
CS 32Kx8 D[7..0]
OE
WE
Organización de la memoria
15
0xFFFF
A[14..0]
A A[15..0] CS SRAM 8
OE 32Kx8
WE D[7..0]
A15
0x8000
uP D D[7..0]
OE 15 0x7FFF
WE A[14..0]
8
CS SRAM
OE 32Kx8
WE D[7..0]
0x0000
0x0000
Nótese que los chips de memoria no tienen por qué ser iguales. En la transparencia se muestra un
esquema típico de los sistemas basados en microprocesador para aplicaciones empotradas: los 32kB
bajos son ROM y los 32 kB superiores RAM.
La ROM se utiliza para guardar el programa del sistema y la RAM para los datos. En ocasiones
no es necesario usar tanta memoria RAM. Por ejemplo, puede ser necesario crear un sistema con 32
kB de ROM pero sólo 8 kB de RAM. En estos casos se suele realizar el esquema de la siguiente
transparencia:
Organización de la memoria
13
0x9FFF
A[12..0]
A[15..0] 8
A CS SRAM
OE 8Kx8 D[7..0]
WE
A15
0x8000
uP D[15..0]
D
15
OE 0x7FFF
WE A[14..0]
8
CS ROM
OE 32Kx8 D[7..0]
0x0000
En este ejemplo, los 8 kB de RAM aparecen repetidos en las posiciones 0xA000-0xBFFF, 0xC000-0xDFFF
y 0xE000-0xFFFF, ya que los bits A13 y A14 no se tienen en cuenta para direccionar la RAM. Se di-
ce entonces que las posiciones de memoria 0xA000-0xBFFF, 0xC000-0xDFFF y 0xE000-0xFFFF son
posiciones “fantasma” de la memoria situada en 0x8000-0x9FFF.
El circuito anterior es en realidad una chapuza que permite ahorrar hardware a costa de “com-
plicar” la programación, ya que no es nada elegante el que una misma posición de memoria física se
pueda acceder desde cuatro direcciones distintas. No obstante en aplicaciones empotradas en las que
un objetivo es ahorrar hardware, este tipo de chapuzas están justificadas.
En sistemas más complejos se suele usar una circuitería adicional que indica al procesador si la
dirección de memoria a la que intenta acceder no existe físicamente. En estos casos el procesador ge-
nera una excepción, denominada típicamente error de bus. Esto es interesante para depurar programas,
ya que en el circuito de la transparencia si se produce un acceso erróneo a la posición 0xE001, en lugar
de detectarse el error se realizará un acceso a la 0x8001.
Organización de la memoria
Ej: Se dispone de un microprocesador con un bus de
direcciones de 20 bits y un bus de datos de 16 bits:
• ¿Cual es el tamaño máximo de memoria que
puede usar?
• Se necesita disponer de una memoria RAM de
512 kB y una ROM de 256 kB. Se dispone de
chips de ROM de 128 kx8 y chips de RAM de 128
kx4. La memoria ROM ha de situarse en las
posiciones bajas del mapa de memoria y la RAM
en las posiciones altas.
Para finalizar veamos un ejemplo más complejo. Se desea construir un sistema empotrado basado
en un microprocesador de 16 bits con un bus de direcciones de 20 bits. El microprocesador podrá
direccionar por tanto 220 = 1,048,576 (1 MB).
Del espacio de direccionamiento total sólo se necesita usar una parte. En la siguiente transparencia
se muestra el mapa de memoria que es necesario implementar.
Organización de la memoria
Mapa de memoria:
0xFFFFF RAM RAM RAM RAM
0xFFFFF
128kx4128kx4128kx4128kx4
0xC0000
RAM
RAM RAM RAM RAM
128kx4128kx4128kx4128kx4
0x80000 0x80000
0x40000 0x40000
ROM ROM
ROM
128kx8 128kx8
0x00000 0x00000
La ROM se ha situado en los 256 kB más bajos de la memoria y se implementa usando dos chips
de 128k x 8. La RAM se ha situado en los 512 kB superiores y se implementa usando 8 chips de 128k
x 4.
En cada acceso a memoria será necesario distinguir qué grupo de chips es necesario activar en
función de la dirección de memoria. Así, siempre que la dirección esté entre 0x00000 y 0x3FFFF, ha-
brán de activarse solamente los dos chips de ROM. Si el acceso se realiza a una dirección comprendida
entre 0x80000 y 0xBFFFF será necesario activar los 4 primeros chips de RAM y si se accede a las
direcciones comprendidas entre 0xC0000 y 0xFFFFF, habrá que activar los 4 últimos chips de RAM.
Organización de la memoria
Mapa de memoria:
Dirección Memoria
00XX XXXX XXXX XXXX XXXX ROM
01XX XXXX XXXX XXXX XXXX No usado
10XX XXXX XXXX XXXX XXXX RAM 1
11XX XXXX XXXX XXXX XXXX RAM 2
D[15..12]
CSRAM2 LDS UDS
D[11..8]
D[3..0]
D[7..4]
OE 128Kx4 OE 128Kx4 OE 128Kx4 OE 128Kx4
0 1 2 3 WE WE WE WE
Dec 2 a 4
A19
A18
D[15..12]
LDS UDS
D[11..8]
D[3..0]
D[7..4]
OE 128Kx4 OE 128Kx4 OE 128Kx4 OE 128Kx4
WE WE WE WE
uP
D D[15..0]
OE OE
WE WE A[17..1] 17 A[17..1] 17
8 8
CSROM CSROM
LDS
CS ROM UDS
CS ROM
OE 128Kx8 D[7..0] OE 128Kx8 D[15..8]
WE WE
Ejercicio
Modifique el circuito anterior para implantar una ROM de sólo 128 kB. Se dispone de chips de
ROM de 64 kx8. La RAM seguirá siendo de 512 kB y se dispone de chips de 128k x 4. No deben de
existir copias “fantasmas” de la ROM. Dibuje el mapa de memoria resultante y el circuito final.
Memoria CAM. Celda de 1 bit
B A
Q2 Q1
fila
−bit bit
match
Las memorias CAM (content addressable memory) o memorias asociativas, permiten conocer,
según su tipo, si un dato está almacenado en ella o en qué posiciones está. Dicho de otra forma, al
contrario que una memoria convencional en la que se aporta a la memoria una dirección y ésta nos da
el dato almacenado en dicha posición; en las memorias CAM se aporta a la memoria un dato y ésta
nos devuelve la posición en la que éste se encuentra.
La estructura de una celda de un bit de una memoria CAM es la mostrada en la transparencia.
Como se puede apreciar no es más que una celda de memoria SRAM a la que se ha añadido una puerta
XNOR. En escritura funciona exactamente igual que una SRAM convencional: en las líneas bit y
-bit se coloca el dato a escribir y su complementario, respectivamente, y a continuación se activa la
línea fila. La lectura en cambio se realiza colocando el dato en las líneas bit y -bit, pero ahora no se
activa la línea fila, sino que en su lugar se observa la salida de la puerta XNOR. Si el bit almacenado
en la celda coincide con el dato presente en la línea bit, la salida match se activará.
Obviamente una memoria CAM de un bit no es muy útil. En la siguiente transparencia se muestra
una estructura de una memoria CAM para almacenar datos de 4 bits.
Memoria CAM. Circuito de 4 x 4 bits
Acondicionamiento de líneas de bit
M0
Los sistemas operativos modernos utilizan memoria virtual por dos razones principales. La pri-
mera es la de permitir que varios programas coexistan en la misma máquina y en la misma memoria,
pero con la “ilusión” de que disponen de un espacio de memoria propio. Este espacio de memoria
virtual está aislado del resto de programas que se ejecutan en la máquina, de forma que cada programa
sólo puede leer y escribir en su zona de memoria. De esta forma es prácticamente imposible que un
error en un programa deje colgada la máquina entera. 1 Además la memoria virtual puede ser de un
tamaño mucho mayor que la memoria física, por lo que se pueden ejecutar un programa (o un con-
junto de ellos) que necesite un tamaño de memoria (para código y datos) mayor que la memoria física
disponible, aunque, tal como se verá más adelante, a costa de una pérdida en el rendimiento.
El espacio de direcciones virtual consta de direcciones de m bits, el cual se mapea en un espacio
de direcciones físico en RAM de n bits (n < m) y en disco duro. En la siguiente transparencia se
muestra un diagrama del proceso.
Direcciones de disco
Para realizar un mapeo eficiente de la memoria virtual en memoria física, la memoria virtual se
divide en bloques (4 kB, 16 kB o 32 kB son valores típicos hoy día) denominados páginas.
Cuando se compila un programa, se supone que dispone de todo el rango de direcciones virtuales,
situándose el programa y los datos dentro de este espacio virtual. Cuando el programa se carga en
memoria para su ejecución, éste se divide en páginas, las cuales se irán cargando en la memoria RAM
conforme se vayan necesitando. Si se llena la memoria RAM, algunas páginas que no se estén usando
se volcarán a disco para su posterior recuperación cuando se necesiten de nuevo. En la transparencia
se muestra una situación en la que la mayoría de las páginas están en RAM y sólo tres de ellas están
en disco.
Nótese también que varias páginas virtuales de distintos procesos pueden mapearse en una misma
página física. Esto permite que varios programas puedan compartir datos o código.
Memoria Virtual
Dirección virtual
31 30 29 28 27 15 14 13 12 11 10 9 8 3210
Traducción
29 28 27 15 14 13 12 11 10 9 8 3210
Dirección física
Virtual address
31 30 29 28 27 15 14 13 12 11 10 9 8 3 2 1 0
20 12
Page table
18
If 0 then page is not
present in memory
29 28 27 15 14 13 12 11 10 9 8 3 2 1 0
Physical address
Para reducir el número de fallos de página, es necesario poder asignar una página virtual a cual-
quier página física (esquema totalmente asociativo). De esta forma se pueden usar algoritmos sofisti-
cados para minimizar dichos fallos de página como el LRU (Least recently used) que otros esquemas
(directo o asociativo por conjuntos usados en las caches) no permitirían.
Para implantar la traducción de páginas virtuales a físicas se usa una tabla que asocia cada página
virtual con su página física, denominada tabla de páginas. Como cada programa tiene su propio
espacio de direcciones virtual, cada programa necesita su propia tabla de páginas, la cual se almacena
en memoria. Por ello es necesario disponer en la circuitería de un registro de tabla de páginas para
almacenar la dirección de memoria en la que está almacenada la tabla de páginas del programa que se
está ejecutando. En la transparencia se muestra el proceso de traducción: el número de página virtual
indica la entrada de la tabla de páginas en la que hay que leer el número de página física. Como no
todas las páginas virtuales estarán en memoria física, existe un bit (valid) que estará a 1 si la página
está en RAM o a 0 si no lo está. Si la página está en RAM (valid=1), se toma el número de página
física de la tabla de páginas y se realiza el acceso a memoria. Si no está (valid=0), se producirá un
fallo de página. En estos casos se generará una excepción y el sistema operativo tendrá que traer la
página solicitada desde el disco. Para ello en la entrada de la tabla de páginas (o en una estructura de
datos auxiliar) estará almacenada la dirección en el disco de la página.
Memoria Virtual. Tabla de páginas
Tamaño de la tabla de páginas:
220 entradas · 4bytes/entrada = 4MB
Se necesita una tabla de páginas para cada programa
en ejecución.
Varias alternativas:
• Registro de límites.
• Tabla hash.
• Varios niveles de tablas.
• Paginar la tabla de páginas.
Si se desea mapear toda la memoria virtual, el tamaño de la tabla de páginas puede ser muy
elevado. En el ejemplo de la figura, el número de entradas en la tabla de páginas sería igual a 2 20 . Si
para cada entrada se necesitan 4 bytes, el tamaño total será de 2 20 ∗ 4 Bytes = 4 MB. Ciertamente 4
MB es un tamaño elevado, pero si se tiene en cuenta que cada programa que se esté ejecutando en
la máquina necesita su propia tabla de páginas, se llega a la conclusión de que si no se reduce de
alguna forma el tamaño de estas tablas puede ocurrir que se necesite toda la memoria para almacenar
las tablas de páginas, lo cual no es lo más apropiado.
Por tanto es necesario usar algún mecanismo para reducir el tamaño de la tabla de páginas. Todos
los métodos se basan en el mismo principio: puesto que los programas no usan toda la memoria virtual,
basta con almacenar solamente las páginas usadas por el programa en la tabla de páginas.
El primer método consiste en crear una tabla de páginas del tamaño igual al que necesita el
programa e indicar este tope mediante un registro de límite. Si el programa durante su ejecución
necesita más memoria, se asignan más páginas y se incrementa la tabla de páginas a partir del registro
límite. Obviamente esta técnica obliga a que el programa tenga que situarse en un espacio contiguo de
la memoria virtual. No obstante, se puede añadir una mejora que consiste en incluir dos registros de
límite para permitir tener dos zonas de memoria virtual separadas (por ejemplo una para la pila y otra
para el programa).
El segundo método se basa en crear una tabla de páginas con un número de entradas igual al de
páginas físicas, denominada tabla de páginas invertida. Mediante una función de dispersión (hash)
se asocia cada página virtual a una entrada en la tabla de páginas.
El tercer método divide la tabla de páginas en bloques (64 o 256 páginas por bloque son valores
típicos). Se crea entonces una tabla de nivel superior para almacenar los bloques, de forma que cada
entrada en esta tabla o bien indica que ninguna de las páginas del bloque está asignada, o bien contiene
el puntero a la tabla de páginas del bloque.
Por último, las tablas de páginas de pueden almacenar también en la memoria virtual, aunque es
un proceso relativamente complejo que se sale de los objetivos de esta introducción.
Memoria Virtual. TLB
Cada acceso a memoria tarda el doble:
• Un ciclo para leer la tabla de páginas.
• Otro para leer el dato
Gracias al principio de localidad, las traducciones de
direcciones se vuelven a utilizar en breve.
Para mejorar las prestaciones se usa un buffer de
traducción de direcciones (TLB).
Page table
Dirty Physical page
Valid or disk address
1 0
1 1
1 0 Disk storage
1 1
0 0
1 0
1 1
0 0
1 0
1 0
0 0
1 1
1 Dado que se producen frecuentes fallos del TLB, este remplazo ha de realizarse por
hardware, por lo que no puede ser muy complejo. Soluciones típicas son elegir una entrada
para remplazar al azar o usar un mecanismo LRU simplificado.
2 En este caso menos frecuente y con mayor penalización que el fallo en el TLB ya que
hay que acceder al disco, el mecanismo de remplazo ha de ser complejo (p ej. LRU) para
minimizar los fallos de página.
Memoria Virtual. TLB
m−p
Memoria CAM
(etiquetas)
pag. virtual
Mn ........ M2 M1 M0
Valid
Memoria SRAM Dirty
(dir. físicas) n−p
pag. física
En la figura se muestra una implantación típica de una TLB usando memoria asociativa para
almacenar las etiquetas. Las salidas de igualdad de cada palabra de la memoria CAM se conectan
a la señal de fila de una memoria SRAM, en la que se almacenan los datos correspondientes a la
etiqueta asociada de la CAM. Por tanto, cuando se introduce un número de página virtual, si ésta está
almacenada en la posición x, la salida Mx de la CAM se activará, y esta señal hará que en la salida de
la memoria SRAM se obtenga el número de página física y los bits valid y dirty almacenados en la
posición x, que obviamente serán los asociados a la etiqueta x.
En la figura se ha supuesto que las direcciones virtuales son de m bits, las físicas de n bits y los
desplazamientos dentro de las páginas de p bits.
Referencias
Patterson, D. A. y Hennessy, J. L. (2000). Estructura y diseño de computadores. Interficie circuite-
ría/programación. Reverté.
Rabaey, J. M. (1996). Digital integrated circuits: A design perspective. Prentice Hall.
Samsung. K3N3C3000D-D(G)C 4M-Bit (512Kx8) CMOS MASK ROM. SAMSUNG ELECTRONICS
CO., LTD. Disponible on-line en:
http://www.dea.icai.upco.es/daniel/asignaturas/EstComp_2_IINF/docs/romSamsung.pdf.
Samsung. K4E170411D, K4E160411D, K4E170412D, K4E160412D. 4M x 4Bit CMOS Dynamic
RAM with Extended Data Out. SAMSUNG ELECTRONICS CO., LTD. Disponible on-line en:
http://www.dea.icai.upco.es/daniel/asignaturas/EstComp_2_IINF/docs/dramSamsung.pdf.
Weste, N. H. E. y Eshraghian, K. (1993). Principles of CMOS VLSI design. A systems perspective.
VLSI Systems series. Addison-Wesley, second edition.