Diferencia entre revisiones de «Unidad de Mapeo de Memoria»
Línea 41: | Línea 41: | ||
| 0 || 0 || 0 || 0 || align="center" | Pone el '''Puntero Actual''' a todo ceros || align="center" | wit = 0x0 || align="center" | ? | | 0 || 0 || 0 || 0 || align="center" | Pone el '''Puntero Actual''' a todo ceros || align="center" | wit = 0x0 || align="center" | ? | ||
|- | |- | ||
− | | 0 || 0 || 0 || 1 || align="center" | Pone la '''Página Actual''' a la primera || align="center" | wit[0] || align="center" | witPAG0 | + | | 0 || 0 || 0 || 1 || align="center" | Pone la '''Página Actual''' a la primera || align="center" | wit[0] || align="center" | witPAG0; |
|- | |- | ||
− | | 0 || 0 || 1 || 0 || align="center" | Retrocede la '''Página Actual''' (*) || align="center" | wit[-] || align="center" | witPAGME | + | | 0 || 0 || 1 || 0 || align="center" | Retrocede la '''Página Actual''' (*) || align="center" | wit[-] || align="center" | witPAGME; |
|- | |- | ||
− | | 0 || 0 || 1 || 1 || align="center" | Avanza la '''Página Actual''' (*) || align="center" | wit[+] || align="center" | witPAGMM | + | | 0 || 0 || 1 || 1 || align="center" | Avanza la '''Página Actual''' (*) || align="center" | wit[+] || align="center" | witPAGMM; |
|- | |- | ||
− | | 0 || 1 || 0 || 0 || align="center" | Selecciona el '''Puntero Actual''' P1(Q) || align="center" | witQ || align="center" | witQ | + | | 0 || 1 || 0 || 0 || align="center" | Selecciona el '''Puntero Actual''' P1(Q) || align="center" | witQ || align="center" | witQ; |
|- | |- | ||
− | | 0 || 1 || 0 || 1 || align="center" | Selecciona el '''Puntero Actual''' P2(R) || align="center" | witR || align="center" | witR | + | | 0 || 1 || 0 || 1 || align="center" | Selecciona el '''Puntero Actual''' P2(R) || align="center" | witR || align="center" | witR; |
|- | |- | ||
− | | 0 || 1 || 1 || 0 || align="center" | Selecciona el '''Puntero Actual''' P3(S) || align="center" | witS || align="center" | witS | + | | 0 || 1 || 1 || 0 || align="center" | Selecciona el '''Puntero Actual''' P3(S) || align="center" | witS || align="center" | witS; |
|- | |- | ||
− | | 0 || 1 || 1 || 1 || align="center" | Selecciona el '''Puntero Actual''' P4(T) || align="center" | witT || align="center" | witT | + | | 0 || 1 || 1 || 1 || align="center" | Selecciona el '''Puntero Actual''' P4(T) || align="center" | witT || align="center" | witT; |
|- bgcolor="#aaffcc" | |- bgcolor="#aaffcc" | ||
! Z || U || V || W || align="center" | Acción || align="center" | Pseudocódigo || align="center" | Rutina eWamblador | ! Z || U || V || W || align="center" | Acción || align="center" | Pseudocódigo || align="center" | Rutina eWamblador | ||
Línea 59: | Línea 59: | ||
| 1 || 0 || 0 || 0 || align="center" | Pone la '''Página Actual''' a todo unos || align="center" | wit[0] = 1x1 || align="center" | ? | | 1 || 0 || 0 || 0 || align="center" | Pone la '''Página Actual''' a todo unos || align="center" | wit[0] = 1x1 || align="center" | ? | ||
|- | |- | ||
− | | 1 || 0 || 0 || 1 || align="center" | Selecciona el '''Puntero Actual''' L0(L) || align="center" | witL0 || align="center" | witL0 | + | | 1 || 0 || 0 || 1 || align="center" | Selecciona el '''Puntero Actual''' L0(L) || align="center" | witL0 || align="center" | witL0; |
|- | |- | ||
− | | 1 || 0 || 1 || 0 || align="center" | Selecciona el anterior '''Puntero Actual''' (*) (en L) || align="center" | witL- || align="center" | witLME | + | | 1 || 0 || 1 || 0 || align="center" | Selecciona el anterior '''Puntero Actual''' (*) (en L) || align="center" | witL- || align="center" | witLME; |
|- | |- | ||
− | | 1 || 0 || 1 || 1 || align="center" | Selecciona el siguiente '''Puntero Actual''' (*) (en L) || align="center" | witL+ || align="center" | witLMM | + | | 1 || 0 || 1 || 1 || align="center" | Selecciona el siguiente '''Puntero Actual''' (*) (en L) || align="center" | witL+ || align="center" | witLMM; |
|- | |- | ||
− | | 1 || 1 || 0 || 0 || align="center" | Decrementa el valor del '''Puntero Actual''' || align="center" | wit-- || align="center" | witME | + | | 1 || 1 || 0 || 0 || align="center" | Decrementa el valor del '''Puntero Actual''' || align="center" | wit-- || align="center" | witME; |
|- | |- | ||
− | | 1 || 1 || 0 || 1 || align="center" | Incrementa el valor del '''Puntero Actual''' || align="center" | wit++ || align="center" | witMM | + | | 1 || 1 || 0 || 1 || align="center" | Incrementa el valor del '''Puntero Actual''' || align="center" | wit++ || align="center" | witMM; |
|- | |- | ||
− | | 1 || 1 || 1 || 0 || align="center" | Pone en el '''Puntero Actual''' el valor del PC || align="center" | wit = PC || align="center" | witEsPC | + | | 1 || 1 || 1 || 0 || align="center" | Pone en el '''Puntero Actual''' el valor del PC || align="center" | wit = PC || align="center" | witEsPC; |
|- | |- | ||
− | | 1 || 1 || 1 || 1 || align="center" | Pone en PC el valor del '''Puntero Actual''' || align="center" | PC = wit || align="center" | witToPC | + | | 1 || 1 || 1 || 1 || align="center" | Pone en PC el valor del '''Puntero Actual''' || align="center" | PC = wit || align="center" | witToPC; |
|} | |} | ||
Revisión del 21:30 21 ago 2010
La MMU o Unidad de Mapeo de Memoria es una de las Unidades Básicas de la Arquitectura eWa. Es la encargada de realizar las operaciones de acceso al Espacio de Direcciones.
Sumario
Registros de la MMU
La MMU agrupa los registros en unas estructuras a las que se les llama punteros.
Punteros
Los punteros de la MMU están compuestos de, al menos, una página de ocho bits. Aunque puede tener teóricamente tantas páginas (mayor que cero) como quiera, generalmente se usan tres páginas (24 bits en total) en los SIRs y ocho páginas (64 bits en total) en los SIM-Es. Aunque exista esa diferencia entre SIMs, en todos existen ocho páginas, aunque solo tres se usen en los SIRs.
Cada una de las páginas de la MMU se comportan como registros simbólicos de los registros 01234567 de la CPU, haciendo que la modificación del valor de uno de esos registros de la CPU, quede patente de inmediato en la página actual.
El puntero PC
También se llama Pcero, ya que es el considerado Puntero Cero, aunque no está visible directamente como puntero para el programador. Es un puntero especial de la MMU. Este puntero es el encargado de apuntar a la próxima dirección del Espacio de Direcciones donde estará la siguiente instrucción (cuatro bits) a ejecutar. No se puede acceder directamente para leerlo ni para modificarlo; hay que volcar en o del Puntero Actual el valor del Puntero PC para ello.
Cuatro wits
En la MMU además hay cuatro punteros de acceso directo llamados witQ, witR, witS y witT que permiten al programador tener apuntadas diferentes direcciones del Espacio de Direcciones o guardar datos.
Los punteros L
Como la MMU es muy extensible (tanto en páginas como en punteros), hay una serie de punteros que, en principio, no determina su número las instrucciones básicas. Estos punteros son los llamados punteros L, que generalmente son tres para los SIRs y ocho para los SIM-Es.
Operaciones de la MMU
La MMU permite la ejecución de tres instrucciones básicas de la Arquitectura eWa, dos de ellas, destinadas al acceso por parte del Núcleo de la Arquitectura al Espacio de Direcciones. Éstas están orientadas a la gestión del paginador.
Funciones de acceso al Espacio de Direcciones
Tanto la instrucción básica de lectura como de escritura en el Espacio de Direcciones (la E: 1110 y la F: 1111) se ejecutan de forma análoga: el puntero actual apunta a una dirección de un bit del Espacio de Direcciones donde se escribirá el valor del registro K de la CPU o de donde se leerá para escribir en el K de la CPU dependiendo de si es la instrucción básica E o F.
Función de ejecución de la MMU
La función de ejecución de la MMU es la encargada de administrar los punteros y páginas de la MMU. Genera dieciséis instrucciones dependiendo de los registros ZUVW de la CPU cuando es llamada la instrucción A: 1010.
Z | U | V | W | Acción | Pseudocódigo | Rutina eWamblador |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | Pone el Puntero Actual a todo ceros | wit = 0x0 | ? |
0 | 0 | 0 | 1 | Pone la Página Actual a la primera | wit[0] | witPAG0; |
0 | 0 | 1 | 0 | Retrocede la Página Actual (*) | wit[-] | witPAGME; |
0 | 0 | 1 | 1 | Avanza la Página Actual (*) | wit[+] | witPAGMM; |
0 | 1 | 0 | 0 | Selecciona el Puntero Actual P1(Q) | witQ | witQ; |
0 | 1 | 0 | 1 | Selecciona el Puntero Actual P2(R) | witR | witR; |
0 | 1 | 1 | 0 | Selecciona el Puntero Actual P3(S) | witS | witS; |
0 | 1 | 1 | 1 | Selecciona el Puntero Actual P4(T) | witT | witT; |
Z | U | V | W | Acción | Pseudocódigo | Rutina eWamblador |
1 | 0 | 0 | 0 | Pone la Página Actual a todo unos | wit[0] = 1x1 | ? |
1 | 0 | 0 | 1 | Selecciona el Puntero Actual L0(L) | witL0 | witL0; |
1 | 0 | 1 | 0 | Selecciona el anterior Puntero Actual (*) (en L) | witL- | witLME; |
1 | 0 | 1 | 1 | Selecciona el siguiente Puntero Actual (*) (en L) | witL+ | witLMM; |
1 | 1 | 0 | 0 | Decrementa el valor del Puntero Actual | wit-- | witME; |
1 | 1 | 0 | 1 | Incrementa el valor del Puntero Actual | wit++ | witMM; |
1 | 1 | 1 | 0 | Pone en el Puntero Actual el valor del PC | wit = PC | witEsPC; |
1 | 1 | 1 | 1 | Pone en PC el valor del Puntero Actual | PC = wit | witToPC; |
(*) A la hora de avanzar/retroceder las páginas y de incrementar/decrementar los Punteros, en caso de overflow, se reinicia la cuenta a un valor sin avisar: es tarea del programador saber qué ha pasado, que pasará y que podría pasar, así de cómo solucionarlo si pasa.