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.