¿Se puede cambiar el procesador ARM al modo no privilegiado dentro del modo controlador?

4

En la documentación de ARM se indica que:

  

El procesador admite dos modos de funcionamiento, modo de subproceso y controlador   modo. El modo hilo se ingresa al restablecer y normalmente al regresar de un   excepción. Cuando está en modo Hilo, el código puede ejecutarse como   Privilegiado o no privilegiado.

     

El modo de controlador se ingresará como resultado de una excepción. Codificar en   El modo de controlador siempre se ejecuta como Privilegiado, por lo tanto, el núcleo   cambia automáticamente al modo Privilegiado cuando se producen excepciones.

Pero no especifica si puedo volver al modo sin privilegios dentro de un controlador de interrupciones, o si el procesador simplemente lo ignorará. No tengo un M3 a mano conmigo para probar en este momento, así que me pregunto si alguien sabe la respuesta o si es capaz de realizar una prueba.

Básicamente, mi escenario es que me gustaría poder implementar "manejadores de eventos" asíncronos desde el código de usuario que se desencadena por alguna actividad de hardware, pero quiero que se ejecuten en modo no privilegiado, la forma obvia de hacerlo es simplemente tenga un bucle como este en el modo de subproceso después de configurar el kernel:

while (true) {
    __WFI();
    if (event_triggered) {
        run_event_handler();
    }
}

Pero el inconveniente es que este código se ejecutará constantemente y se realizará la comprobación cada vez que ocurra una interrupción cualquiera , ¡incluso si no es necesario ejecutar ningún controlador de eventos!

Mientras que en lugar de eso, simplemente podría tener un diseño puramente de interrupción donde cada vez que el kernel haga algo que (sabe) activará un evento de usuario, puede generar, por ejemplo, un PendSV de baja prioridad que luego los ejecuta según sea necesario. .. pero por supuesto que luego se ejecutaría en un contexto privilegiado. Entonces, ¿puedo volver a sin privilegios aquí?

    
pregunta Thomas

2 respuestas

2
  

Entonces, ¿puedo volver a sin privilegios aquí?

Sí. El método más simple sería configurar otra pila para el "subproceso" sin privilegios.

Ahora, simplemente puede cambiar las pilas en el controlador de interrupciones y usar el "retorno de excepción" estándar mediante mov ing un valor especial en PC .

    
respondido por el Turbo J
0
  

CONTROL.nPRIV Define el nivel de privilegio del modo Thread:

     

0 = privilegiado

     

1 = sin privilegios.

No hay registro de control para el nivel de privilegio del modo Handler.

    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas