
\section{ARM}

\subsection{Instrucciones}

ARM utiliza un conjunto de intrucciones reducido o \emph{RISC} (\emph{Reduced Instruction Set}).
Este hecho lo hace notablemente diferente a los procesadores Intel IA-32 en varios aspectos.

Las intrucciones utilizadas en ARM son de 32-bits de longitud.
No es posible ingresar direcciones de tamaño arbitrario como operando debido a esta característica.
Las direcciones y constantes de 32-bits deben ser cargadas en un registro previamente.
El siguiente ejemplo muestra un fragmento de código que evidencia lo expuesto.

\begin{verbatim}

ARM_assembly:
	ldr r0, =_32bit_address_ 	@ r0 := Dirección etiqueta _32_bit_address_
	ldr r1, [r0]				@ r1 := 0xf0000000
	...

Intel_assembly:
	mov eax, [_32_bit_address_] @ eax := 0xf0000000
	...

_32_bit_address_:
	.word 0xf0000000

\end{verbatim}

Dentro del conjunto de instrucciones de ARM, muchas de las mismas poseen 3 operandos.
El siguiente extracto ejemplifica como afecta esto, por ejemplo, a la operación de suma de registros en ambas arquitecturas.
En el caso de ARM, el operando destino puede ser un tercer registro.

\begin{verbatim}

ARM_add:
	add r3, r0, r1  @ Resultado r3 := r0 + r1
	...

Intel_add:
	add eax, ebx 	@ Resultado eax := eax' + ebx
	...

\end{verbatim}

Las instrucciones en ARM no pueden operar directamente en memoria.
La arquitectura utiliza instrucciones especiales de carga (\emph{Load}) y almacenado (\emph{Store}).
Veamos la diferencia que esto implíca, por ejemplo, al tener que sumar 2 números de 32-bits de memoria y luego almacenarlos.

\begin{verbatim}

_numero1_:
	.word 3
_numero2_:
	.word 4

Intel_assembly:
	mov eax, [_numero2_] @ eax := 4
	add [_numero1_], eax @ Almacenar en _numero1_ el resultado de 4 + 3
	...

ARM_assembly:
	ldr r0, =_numero2_ 	@ r0 := _numero2_
	ldr r1, [r0] 		@ r1 := 4
	ldr r0, =_numero1_ 	@ r0 := _numero1_
	ldr r2, [r0] 		@ r2 := 3
	add r1, r1, r2 		@ r1 := 4 + 3
	stm r1, [r0] 		@ Almacenar en _numero1_ r1
	...

\end{verbatim}

En ARM, los 2 números son previamente almacenados en registros, al igual que las direcciones de los mismos en memoria.
Intel no tiene esa dificultad ya que se puede operar en memoria directamente, y el operando fuente o destino (no ambos) puede ser una constante de 32 bits de longitud.

Las operaciones \emph{ldr} y \emph{str} pueden direccionar a memoria de las siguientes formas.

\hfill

\begin{tabular}{ l | l }
Addressing mode and index method & Addressing syntax \\
\hline \\
Preindex with immediate offset & [Rn, \#+/-offset\_12] \\
Preindex with register offset & [Rn, +/-Rm] \\
Preindex with scaled register offset & [Rn, +/-Rm, shift \#shift\_imm] \\
Preindex writeback with immediate offset & [Rn, \#+/-offset\_12]! \\
Preindex writeback with register offset & [Rn, +/-Rm]! \\
Preindex writeback with scaled register offset & [Rn, +/-Rm, shift \#shift\_imm]! \\
Immediate postindexed & [Rn], \#+/-offset\_12 \\
Register postindex & [Rn], +/-Rm \\
Scaled register postindex  & [Rn], +/-Rm, shift \#shift\_imm \\
\end{tabular}

\hfill

\hfill

Las operaciones que toman $base + desplazamiento$, se encuentran limitadas por el tamaño de las instrucciones.
Sólo se pueden ingresar desplazamientos de 12 bits.

Los modos de indirección utilizados por la instrucción \emph{mov} en Intel, pueden ser simulados con lo descripto anteriormente.
Por ejemplo, las siguientes 2 rutinas tienen el mismo efecto.

\begin{verbatim}

ARM_rutina:
	@ r2 := indice
	ldr r1, =dir_tabla
	ldr r0, [r1, r10, LSL #2]

Intel_rutina:
	@ ebx := indice
	mov eax, [ebx * 4, dir_tabla]

\end{verbatim}

\hfill

\hfill

Intel posee instrucciones específicas para realizar operaciones de entrada/salida a dispositivos, como \emph{inb} y \emph{outb}.
ARM no dispone de un equivalente para estas instrucciones.
Como los dispositivos son asignados a memoria (\emph{Memory Mapped}), las mismas instrucciones de carga y almacenado son utilizadas para acceder a ellos.

\hfill

Las llamadas a subrutinas en ARM no dejan la dirección de retorno en la pila.
Existe un registro especial llamado \emph{lr} o \emph{link register}, en el cuál la dirección de retorno es almacenada cada vez que se ejecuta una instrucción de \emph{branch \& link}.
Las intrucción de \emph{brach \& link} es equivalente a la instrucción \emph{call} utilizada por Intel.
Si se realizan sucesivas llamadas, el registro debe ser resguardado para evitar perder las direcciones de retorno.

\begin{verbatim}

ARM_add:
	bl ARM_subrutina 		@ lr := dirección de retorno.
	...

ARM_subrutina:
	stmfd sp!, {lr}			@ Se preserva la dirección de retorno anterior. Equivalente a 'PUSH lr'.
	bl otra_subrutina 		@ lr := Dirección de retorno a ARM_subrutina.
	...

Intel_add:
	call Intel_subrutina 	@ Se almacena en la pila la dirección de retorno.
	...

Intel_subrutina:
	call otra_subrutina 	@ Se almacena en la pila la dirección de retorno.
	...

\end{verbatim}

Otra cuestión es que el procesador ARM no cuenta con un módulo de división entera.
Las operaciones de división deben ser implementadas, utilizando código.
Las divisiones por 0 deben ser manejadas por software, la arquitectura no posee una excepción para este fin.

%Ambos procesadores utilizan \emph{pipelines} para mejorar la ejecución de instrucciones.

\subsubsection{Modos de Operación}

% modos de operacion JAZELLE, THUMB
Además del modo habitual de operación, ARM cuenta con 2 tecnologías \emph{Jazelle} y \emph{Thumb}.

\begin{description}
\item[\emph{Jazelle}] \hfill \\
	Los procesadores que poseen esta arquitectura permiten ejecución de Java bytecode de forma nativa en el hardware.

\item[\emph{Thumb}] \hfill \\
	Es un subconjunto de instrucciones del modo ARM que tienen 16 bits de longitud.
	Tiene mayor desempeño en procesadores con un bus de datos de 16 bits de ancho.
	Además los programas escritos con estas instrucciones tienen una mayor densidad de código.

\end{description}

La arquitectura IA-32 no posee ninguna de estas 2 características.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Modos de Ejecución}

La arquitectura IA-32 cuenta con varios modos de ejecución.
Se utilizan más que nada para preservar la compatibilidad hacia atrás entre las distintas arquitecturas de Intel.
Algunos de ellos son:

\begin{description}
\item[Real Mode] \hfill \\
Los procesadores IA-32 inician en este modo.
Utiliza el modelo de segmentación.
Las direcciones son de 20-bits de longitud máximo.
\item[Protected Mode] \hfill \\
Este modo soporta memoria virtual que posee mecanismos de protección.
Se utilizan direcciones de 32-bits, o 36-bits utilizando PAE (\emph{Physical Address Extension}).
Es compatible hacia atrás con el modo real (\emph{Real Mode}).
\item[Virtual 8086 Mode] \hfill \\
Provee la habilidad de ejecutar código de 16-bits, dentro del modo protegido (\emph{Protected Mode}).
\end{description}

En oposición, ARM cuenta con 7 modos de ejecución.
El propósito de los modos de ejecución difiere totalmente con los de Intel.
La siguiente es una breve descripción de los distintos modos exitentes en ARM.

\begin{itemize}
\item Privilegiados
	\begin{description}
	\item[Abort] \hfill \\
		El procesador entra en este modo cuando falla al intentar acceder a una posición de memoria.
	\item[Interrupt Request (IRQ) y Fast Interrupt Request (FIQ)] \hfill \\
		Estos modos corresponden con 2 niveles de interrupción disponibles en el procesador.
	\item[Supervisor] \hfill \\
		Modo en el cual la CPU incia, luego del reset. Es el utilizado para ejecutar el kernel de sistema.
	\item[System] \hfill \\
		Este modo es una versión especial del modo usuario (user mode), sólo que privilegiado.
	\item[Undefined] \hfill \\
		El procesador utiliza este modo cuando encuentra una instrucción que no es soportada.
	\end{description}
\item No Privilegiados
	\begin{description}
	\item[User] \hfill \\
		Es el único modo no privilegiado. Es utilizado por programas y aplicaciones.
	\end{description}
\end{itemize}

El modo activo define los registros utilizados y los privilegios de acceso sobre el registro \emph{CPSR} (\emph{Current Program Status Register}).
El \emph{CPSR} se utiliza para monitorear y controlar operaciones internas del procesador.
Este registro cumple una función similar a el registro \emph{EFLAGS} en Intel.

\hfill

Cada modo en ARM puede ser clasificado como \emph{privilegiado} o \emph{no privilegiado}.
A diferencia de la arquitectura IA-32, ARM no dispone de anillos de protección.
Sin embargo se podría hacer un paralelo entre los anillos de protección de nivel 0 (kernel de sistema) y 3 (usuario), y esta clasificación entre modos.

\hfill

Ejecutar dentro de un modo privilegiado permite leer y escribir en cualquier sección del registro \emph{CPSR}.
Las tareas de administración de sistema (como por ejemplo activar o desactivar la mmu) sólo pueden hacerse dentro un modo con privilegios.

Por otro lado un modo no privilegiado no permite operaciones de escritura sobre el \emph{CPSR}, con excepción de los flags de programa.

\hfill

El cambio de un modo a otro puede realizarse explícitamente escribiendo en la sección de control del registro \emph{CPSR}, siempre y cuando se ejecute dentro de un modo privilegiado.
También se produce de forma automática durante una excepción o interrupción.

\subsection{Registros}

Anteriormente mencionamos que el modo de ejecución define los registros activos.
El procesador cuenta con 37 registros en total.

\hfill

No todos los registros se encuentran activos en todos los modos, 20 de ellos son \emph{banked registers}.
Los mismos son reemplazados por otros al cambiar de modo.

Esta característica permite que el cambio de contexto entre modos de ejecución sea más rápido.
Al igual que en la arquitectura IA-32 se utilizan diferentes pilas para cada nivel de protección, en ARM sucede lo mismo pero para cada modo.
Durante un cambio de contexto de un modo a otro, el hecho de que la dirección de la pila utilizada se encuentre en un \emph{banked register}, hace que no sea necesario realizar operaciones a memoria.

\hfill

En la figura ~\ref{fig:registers} podemos ver el conjunto de registros completo según el modo de operación.
En la mayoría de los modos, el procesador cuenta con 18 registros: 16 de propósito general y 2 de estado del procesador.

\begin{figure}[!ht]
	\centering
	\includegraphics{img/registros}
	\caption{Registros del procesador.}
	\label{fig:registers}
\end{figure}

Los registros de propósito general se identifican con la letra \emph{r} seguido de un número.
Todos los registros son de 32-bits de longitud y pueden contener datos o direcciones.

Algunos de estos registros son asignados a tareas específicas, a ser:

\begin{description}
\item[Registro R13 o \emph{lr}] \hfill \\ Contiene la dirección de retorno de una subrutina.
\item[Registro R14 o \emph{sp}] \hfill \\ Este registro es utilizado como puntero a pila.
\item[Registro R15 o \emph{pc}] \hfill \\ Almacena la dirección de la siguiente instrucción a ser ejecutada.
\end{description}

El procesador cuenta con 2 registros de estado.

\begin{description}
\item[\emph{CPSR} o \emph{Current Process Status Register}]
Se utiliza para monitorear y control operaciones internas del procesador.
El mismo tiene 32-bits de longitud y se divide en 4 secciones: \emph{flags}, \emph{status}, \emph{extension} y \emph{control}.
El contenido de cada sección varia según el modelo de procesador.
\footnote{\href{http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0301h/I2837.html}{http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0301h/I2837.html} Descripción detallada CPSR del procesador ARM1176JZF-S.}

\item[\emph{SPSR} o \emph{Saved Process Status Register}]
Este registro no se encuentra disponible en todos los modos y su utilización se hará clara más adelante.
Basta con decir que el procesador lo utiliza para resguardar el estado del registro \emph{CPSR}.
\end{description}

El modo usuario y sistema comparten el mismo set de registros, sólo que un modo es privilegiado y el otro no.
Ambos modos, además, no poseen registro \emph{SPSR}.

En los demás modos los registros desde \emph{R0} hasta \emph{R12} son los mismos, los únicos que cambian son aquellos marcados como \emph{banked registers}.

El modo \emph{Fast Interrupt Request} posee 5 \emph{banked registers} adicionales, para reducir el impacto del cambio de contexto durante una interrupción.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Excepciones}

ARM no hace una distinción entre una interrupción y una excepción.
El término es empleado indistintamente para referirse a una u otra cosa.

El manejo de excepciones en ARM es muy diferente al de la arquitectura IA-32.
No existe una tabla de descriptores asociados a las rutinas de atención de interrupción.
Cada excepción/interrupción se encuentra ligada a una entrada de una tabla conocida como \emph{vector table}.
Esta tabla se encuentra en la dirección \emph{0x00000000} en memoria.
En algunos procesadores ARM se tiene la posibilidad de elegir ubicarla en la dirección \emph{0xffff0000}.

Cada entrada de la tabla contiene una intrucción de 32-bits de longitud.
La misma modifica el contador de programa para hacer referencia al inicio de una rutina de atención.
Las instrucciones utilizadas para este fin pueden ser varias: \emph{b} (branch), \emph{ldr} (load) o \emph{mov} (mov).

En contraste con las 256 interrupciones disponibles en IA-32, ARM sólo posee 7.
En Intel se tiene la posibilidad de fijar un nivel de privilegio para cada interrupción, en el descriptor de la misma.
ARM define para cada interrupción un modo de ejecución predeterminado.

Las excepciones o interrupciones disponibles son las listadas a continuación, entre paréntesis el modo asociado.

\begin{description}
\item[Reset (Supervisor)] \hfill \\
	Esta interrupción se produce ni bien se enciende el procesador.
	De aquí se salta al código de incialización del kernel, es el punto de entrada.
\item[Undefined Instruction (Undefined)] \hfill \\
	Cuando el procesador no puede decodificar una instrucción se produce esta excepción.
	Similar a la excepción \emph{Invalid Opcode} en Intel.
\item[Software Interrupt (Supervisor)] \hfill \\
	Utilizada por las aplicaciones de usuario para realizar llamadas a sistema.
\item[Data Abort (Abort)] \hfill \\
	Sucede cuando una instrucción intenta acceder a memoria sin los permisos adequados.
	También cuando la dirección virtual especificada no está disponible.
	Su contrapartida en Intel sería la excepción \emph{Page Fault}.
\item[Prefetch Abort (Abort)] \hfill \\
	Se aplica el mismo comportamiento que para la excepción \emph{Data Abort}, sólo que el error refiere a la obtención de una instrucción y no un dato.
\item[Interrupt Request (IRQ)] \hfill \\
	Es utilizado por el hardware externo para interrumpir la ejecución del procesador.
	Sólo se produce de estar habilitadas las interrupciones (indicado por bit en \emph{CPSR}, sección control).
\item[Fast Interrupt Request (FIQ)] \hfill \\
	Es similar a Interrupt Request.
	Es utilizado cuando se requiere mayor velocidad de respuesta.
	Posee la ventaja de tener un mayor número de \emph{banked registers}.
\end{description}

Cuando sucede una interrupción el procesador:

\begin{enumerate}
\item Almacena la dirección de retorno en R14 del modo asociado a la excepción.
\item Copia el CPSR en el SPSR del modo asociado a la excepción.
\item Cambia los bits del CPSR para forzar el cambio de modo.
\item Obtiene y ejecuta la instrucción almacenada en la entrada de la tabla de excepciones para dicha excepción.
\end{enumerate}

Las excepciones poseen niveles de prioridad.
Puede darse la posibilidad de que se produzcan 2 excepciones al mismo tiempo, por lo que se le da prioridad a aquella de mayor nivel.

También las interrupciones modifican los bits asociados a las interrupciones externas del registro CPSR.
En todos los casos al producirse una excepción se deshabilitan las interrupciones normales (no las rápidas).

La siguiente tabla contiene las prioridades y valores para los bits \emph{I} (Interrupt Request) y \emph{F} (Fast Interrupt Request) del CPSR.
Un valor de 1 para cualquiera de los 2 bits, deshabilita las interrupciones del tipo en cuestión. Un guión significa que no es modificado.

\hfill

\begin{tabular}{ l | l | l | l}
Exceptions & Priority & I bit & F bit \\
\hline
Reset & 1 & 1 & 1 \\
Data Abort & 2 & 1 & - \\
Fast Interrupt Request & 3 & 1 & 1 \\
Interrupt Request & 1 & 1 & - \\
Prefetch Abort & 4 & 1 & - \\
Software Interrupt & 5 & 1 & - \\
Undefined Instruction & 6 & 1 & - \\
\end{tabular}

\hfill

\hfill

Cuando una excepción ocurre, el link register es configurado a una dirección específica en función del contador de programa.
Por ejemplo cuando sucede un Data Abort, el link register contiene la dirección de la última instrucción ejecutada más 4.
Nosotros debemos ajustar el link register de forma que apunte a la instrucción que generó el error.
Como la instrucción que generó el error fue la última ejecutada, debemos restar 8 (recordar que 1 instrucción tiene 4 bytes) al registro lr para volver a ejecutarla una vez corregido el error.

La siguiente tabla define las correcciones que deben realizarse durante la excepción al link register para retornar a la intrucción correcta.

\hfill

\begin{tabular}{ l | l | l}
Exception & Return address & Use \\
\hline
Reset & - & lr is not defined on a Reset \\
Data Abort & lr - 8 & points to the instruction that caused the\\
&& Data Abort exception \\
FIQ & lr - 4 & return address from the FIQ handler \\
IRQ & lr - 4 & return address from the IRQ handler \\
Prefetch Abort & lr - 4 & points to the instruction that caused the \\
&& Prefetch Abort exception \\
SWI & lr  & points to the next instruction after the SWI instruction \\
Undefined Instruction & lr & points to the next instruction after the undefined instruction \\
\end{tabular}

\hfill

\subsection{Administrador de memoria virtual y protección (ARMv6)}

En la arquitectura IA-32 es necesario configurar segmentación para iniciar la mmu, por la compatibilidad hacia atrás se implementa el mecanismo de memoria virtual sobre segmentación.
En ARM no es necesario ya que no utiliza segmentación.

Al igual que Intel, ARM utiliza tablas de páginas para realizar la traducción de direcciones.
Cada entrada de la tabla permite otorgar a cada página permisos para los distintos niveles de privilegio, además de políticas de cache y buffer de escritura.

ARMv6 utiliza un directorio de páginas de 2 niveles.
La tabla de primer nivel soporta páginas de 1M (\emph{section}) y 16M (\emph{supersection}), conocida como \emph{master}  o \emph{level 1 page table}.
Esta posee 4096 entradas de 4 bytes, cada una hace referencia a una \emph{section} (sección) que direcciona 1M de memoria.
Cuando se utilizan páginas de 16M, la entrada se replica 16 veces en la tabla a partir de la \emph{section} de inicio.

% imagen entrada

La tabla de segundo nivel, o \emph{coarse table}, tiene sólo 256 entradas de 4 bytes cada una.
Soporta páginas de 4K (\emph{small pages}) y 64K (\emph{large pages}). Al igual que con las \emph{supersections}, las entradas asociadas a páginas de 64K se repiten 16 veces.

% imagen entrada

Tradicionalmente a diferencia de ARM, la arquitectura IA-32 sólo soporta 2 tamaños de páginas de 4K y 4M.
ARM no cuenta con \emph{PAE} o \emph{Physical Address Extension}, sólo puede manejar un espacio de memoria virtual de 4G.

Sistemas operativos como Linux dividen el espacio de direcciones virtuales en 2, una para las aplicaciones de usuario y otra para el kernel de sistema.
Devido a esto, ARM tiene la habilidad de partir su directorio de páginas en 2.
De esta forma el espacio asociado a la aplicación de usuario puede ser reemplazado sin necesidad de invalidar todo el directorio.
El procesador posee 2 registros que almacenan las direcciones base de ambas tablas \emph{translation table base 0 (ttb0) y 1 (ttb1)}.
Esta característica es opcional, y se encuentra desactivada por defecto.
De no utilizarse, sólo se realiza la traducción con la tabla que indique el registro \emph{ttb0}.

\subsubsection{Dominios}

Cada sección de la tabla de nivel 1 tiene asociado un dominio, existen 16 dominios configurables en ARMv6.
El acceso a memoria se ve perjudicado dependiendo del tipo de dominio seleccionado.
Los tipos de dominio son los siguientes.

\begin{description}
\item[Client] \hfill \\
Clientes son los usuarios de los dominios en donde se ejecutan programas y guardan datos.
Cada acceso al dominio debe ser verificado contra los permisos de la página correspondiente.
\item[Manager] \hfill \\
Los administradores controlan el comportamiento del dominio, las secciones y páginas del mismo y los derechos de acceso.
Por este motivo las secciones bajo este dominio no son protegidas, no se verifican los permisos.
\end{description}

\subsubsection{Permisos de acceso}

Cada página contiene permisos de acceso para ambos niveles de privilegio.
Si una página es accedida sin los permisos necesarios se produce una excepción Data Abort o Prefetch Abort, dependiendo del contexto.
La siguiente tabla muestra las posibles configuraciones de permisos permitidas.

\hfill \\
\begin{tabular}{ r | l | l | l }
APX & AP & Supervisor & User \\
\hline
0 & b00 & No access. & No access.\\
0 & b01 & Read/write. & No access.\\
0 & b10 & Read/write. & Read-only.\\
0 & b11 & Read/write. & Read/write.\\
1 & b00 & Reserved. & Reserved.\\
1 & b01 & Read-only. & No access.\\
1 & b10 & Read-only. & Read-only.\\
1 & b11 & Read-only. & Read-only.\\
\end{tabular}

\hfill \\

Otros atributos configurables son:

\begin{description}
\item[Shared] \hfill \\ Indica que el área de memoria puede ser compartido por múltiples procesadores.
\item[Never Execute] \hfill \\ Habilita la ejecución de código en la página.
\item[Not-Global] \hfill \\ Este bit indica si la traducción es global, o específica de un proceso en la TLB.
De ser específica de un proceso, la traducción ingresa en la TLB relacionada con un \emph{ASID} (\emph{Address Space Identifier}).
Ver sección Translation Lookaside Buffer debajo.
\end{description}

\subsubsection{Políticas de caché}

Los bits \emph{C} y \emph{B} están relacionados con el comportamiento de la caché y el buffer de escritura respectivamente.
Las siguientes configuraciones son aceptadas.

\hfill \\
\begin{tabular}{ r | l }
C \& B bits & Policy \\
\hline
b00 & Noncacheable \\
b01	& Write-Back cached, Write Allocate \\
b10	& Write-Through cached, No Allocate on Write \\
b11	& Write-Back cached, No Allocate on Write
\end{tabular}

\subsubsection{Translation Lookaside Buffer}

ARM posee 2 niveles de \emph{TLB} o \emph{Translation Lookaside Buffer}. 
La TLB de primer nivel es la \emph{microTLB}, es más pequeña y de mayor velocidad que la principal.
Existen microTLB separadas para los datos y las instrucciones, ambas poseen 10 líneas de tipo \emph{fully associative}.

La TLB de segundo nivel o principal, actúa cuando se produce un \emph{miss} en alguna de las microTLB (instrucciones o datos).
Al contrario de la microTLB el procesador sólo posee 1 cache asociativa tanto para datos como para instrucciones.
La TLB principal contiene 8 líneas \emph{fully associative} y otra región que consta de 64 líneas \emph{low associative}.

\hfill

La arquitectura soporta \emph{Address Space Identifier} o ASID, para permitir al sistema diferenciar entre los espacios de direcciones utilizados por los procesos.
De esta manera no es necesario vaciar toda la cache durante un cambio de contexto.

\hfill

Las entradas también pueden ser marcadas como \emph{global}, de esta forma son compartidas por los espacios virtuales de todos los procesos.

\hfill

Aunque los tipos de caches empleados por Intel no son iguales, se utiliza el mismo sitema de 2 niveles (Intel Core i7).
También dispone de su propia implementación de ASID (llamdo PCID o Process Context Identifier) y entradas globales.
