linux arm context-switch

cómo entender la función de "__swtich_ to" para el cambio de contexto en el ARM linux



context-switch (1)

Cuando context_switch() llama a switch_to() , es solo una llamada de función normal. El ABI no requiere que r0-r3, r12 o los indicadores de condición en CPSR se conserven durante una llamada a función, por lo que no es necesario guardarlos en el contexto de la tarea de llamada, porque no le importará lo que es cuando finalmente se vuelve a programar y se reanuda al regresar de switch_to() .

El punto es que el cpu_context en thread_info , que es lo que se cambia aquí, es el estado del kernel de lo que terminó llamando a __schedule() . El estado del proceso real (espacio de usuario) * , es decir, r0-r15, SPSR, etc. está en pt_regs la tarea; ese estado se guarda inmediatamente después de ingresar al núcleo (ver por ejemplo, vector_swi ) y restaurarse al salir ( ret_to_user ) de la manera que Esperaría.

* Suponiendo que hay uno, es decir, el contexto de llamada no es un hilo del kernel.

Estoy tratando de entender cómo funciona el cambio de contexto de Linux que se basa en el ARM.

Entonces quiero entender los siguientes códigos.

ENTRADA (__ switch_to)

add ip, r1, #TI_CPU_SAVE ldr r3, [r2, #TI_TP_VALUE] stmia ip!, {r4 - sl, fp, sp, lr} @ Store most regs on stack ldr r6, [r2, #TI_CPU_DOMAIN] strex r5, r4, [ip] @ Clear exclusive monitor mcr p15, 0, r3, c13, c0, 3 @ set TLS register mov r4, #0xffff0fff str r3, [r4, #-15] @ TLS val at 0xffff0ff0 mcr p15, 0, r6, c3, c0, 0 @ Set domain register mov r5, r0 add r4, r2, #TI_CPU_SAVE ldr r0, =thread_notify_head mov r1, #THREAD_NOTIFY_SWITCH bl atomic_notifier_call_chain mov r0, r5 ldmia r4, {r4 - sl, fp, sp, pc} @ Load all regs saved previously

Entiendo que estos códigos se utilizan para almacenar el contexto de la CPU para el proceso actual y restaurar el contexto de la CPU para el siguiente proceso, que será el proceso actual. Pero no guarda y restaura sobre ip, r1, r2, r3, r4, especialmente sobre cpsr (Registro de estado de programa actual).

Creo que debería guardar y restaurar el registro cpsr para Context Switch. Pero no guarda el cpsr en el código anterior. No entiendo esto. Estoy luchando con esta pregunta durante una semana. Pero no pude encontrar la respuesta. Estaría muy agradecido de que alguien me diera la respuesta.