¿Por qué dos direcciones de tablas vectoriales en ARM?
interrupt (2)
En la arquitectura ARM hay una dirección vectorial baja 0x0
y una dirección vectorial alta 0xFFFF0000
. Me preguntaba por qué se podrían necesitar dos direcciones de vector. En microprocesadores y microcontroladores Intel, hay una dirección de vector.
¿Hay alguna razón en particular para tener 2 direcciones vectoriales?
Algunas familias de microcontroladores tienen más de una a varias direcciones de inicio diferentes y / o usan la misma dirección y cambian y descodifican la dirección basándose en alfileres de correa para que pueda arrancar desde un gestor de arranque creado, por ejemplo, por el vendedor, o los usuarios gestor de arranque o la aplicación de los usuarios. (lo que le permite recuperar lo que normalmente sería un sistema de ladrillos).
Podrías imaginar lo mismo. Piense en cómo funcionan estos microcontroladores al tener que hacer el trabajo fuera del núcleo para cambiar el banco flash que se usa para arrancar. Al usar este pin de correa en el núcleo, podría tener un gestor de arranque alternativo en una dirección diferente, este gestor de arranque podría usarse para reescribir / administrar / desarrollar / rescatar la aplicación principal.
También puede posiblemente evitar la dirección de rom / ram vector. Digamos, por ejemplo, que arranque desde el flash en el vector alto y tenga ram en 0, entonces podría cargar el programa en ram o al menos en una tabla vectorial específica en tiempo de ejecución, luego cambiar el bit (podría tener que rebotar en un trampolín para llegar allí , No recuerdo que no usamos el vector alto en nuestro chip).
No dice que es por eso que ARM lo hizo, pero si nada más hace un esquema de rescate simple para los vendedores. algunos de los esquemas de rescate de proveedores o métodos de arranque alternativos son excesivamente complicados. Realmente me gustaría ver el brazo y otros tienen varios, al menos dos señales que dan cuatro direcciones, tal vez 0x00000000, 0x40000000, 0x80000000, 0xC0000000, ese tipo de cosas o 0x00000000, 0x80000000, 0xFFFF0000, 0xFFFF8000. Haga algo así en varios núcleos, especialmente el córtex-m, y es posible que vea que los proveedores de chips comienzan a usarlo en lugar de sus propios esquemas y que sería menos doloroso pasar de un chip a otro entre proveedores o dentro de la misma línea de productos de vendedores.
Como dice dwelch , esto evita la descodificación de direcciones en el hardware. Especialmente importante es el caso de arrancar desde Flash / ROM y cambiar a ejecutar desde RAM . Aunque esto es más importante sin una MMU.
Protección de memoria barata
En un sistema operativo en tiempo real como vxWorks , al menos antes de la versión 4, todo el código se ejecutaba a nivel del sistema y sin una MMU. Esto minimiza la latencia. Sin embargo, su código físico debe asignarse a una dirección baja o alta. Normalmente, una dirección baja es la más conveniente y el hardware SOC típico tiene selecciones de chip para la memoria externa que permite un diseño flexible de la memoria. Sin embargo, tener su tabla de vectores en 0x0
tiene algunos lados negativos. El más obvio es el uso de un puntero NULL
. Algunos hardware permitirán la protección de solo lectura de un rango de direcciones a través de la funcionalidad SOC ; generando una FALLA DE BUS cuando ocurre una escritura en estas direcciones. Si es tan desafortunado como para no tener este tipo de SOC , y no tiene la Arquitectura del Sistema de Protección de Protección ( Capítulo B5.1 BRAZO ARM ), entonces la reasignación de la tabla de vectores a la memoria alta puede ser algo bueno que hacer; de lo contrario, una sola escritura NULL
puede derribar su sistema.
Instrucción configurada agnóstica
También tenga en cuenta que ARM ARM dice que no hay instrucción ARM que dependa de una tabla vectorial alta o baja. Es un registro de coprocesador opcional que tienen la mayoría, si no todos, los ARM. Probablemente no sea tan útil en los modernos sistemas ARM donde usamos una MMU. Incluso ARM tiene algo de equipaje; sigue siendo útil en el caso de un gestor de arranque o sistemas profundamente integrados. Con una MMU activa, probablemente no se necesite esta característica a menos que se usen secciones (páginas de 1MB) para minimizar la presión de TLB.
Versiones de TrustZone
En los procesadores ARM más nuevos con controladores TrustZone , en realidad hay tres tablas vectoriales. La tabla de vector de mundo seguro es como la versión tradicional de memoria alta / baja . El modo monitor y las tablas vectoriales mundiales no seguras se configuran a través de un registro de coprocesador y se pueden colocar en cualquier lugar de la memoria.