ARMv8 Linux Context Switch 대해서 공부하고 있습니다.
코드는 아래와 같습니다.
ENTRY(cpu_switch_to)
mov x10, #THREAD_CPU_CONTEXT
add x8, x0, x10
mov x9, sp
stp x19, x20, [x8], #16 // store callee-saved registers
stp x21, x22, [x8], #16
stp x23, x24, [x8], #16
stp x25, x26, [x8], #16
stp x27, x28, [x8], #16
stp x29, x9, [x8], #16
str lr, [x8]
add x8, x1, x10
ldp x19, x20, [x8], #16 // restore callee-saved registers
ldp x21, x22, [x8], #16
ldp x23, x24, [x8], #16
ldp x25, x26, [x8], #16
ldp x27, x28, [x8], #16
ldp x29, x9, [x8], #16
ldr lr, [x8]
mov sp, x9
msr sp_el0, x1
ret
ENDPROC(cpu_switch_to)
질문 1, Context Switch 시에 왜 Callee Register 하는 이유가 있을 까요?
PCS(Procedure Call Standard)나 ABI(Application Binary Interface) 등을 참고 하라는데 이해가 안되서요.
Task Context 라는 것이 어찌 보면 Sequence of function 이고, Callee Register 해도 Task Context 가 유지 되나요?
이전 ARM 에서는 R0 ~ R15 모두 했던 걸로 기억하는데요. 정확히 이해가 안됩니다.
질문 2, PSTATE 는 왜 안하는지 모르겠어요.
이전 ARM Core 에 비하여 Condition Flag를 관여하는 Instruction 이 적어진 것 알겠는데, 일부는 있던데요. 이런 Instruction 사이에 Context Switch 가 있어나면 어떻게 되는 것인가요?
공부하는데 이해가 안되는 부분이어서 질문 남겨 봅니다. 의견 주시면 감사하겠습니다.
댓글 2
-
문c(문영일)
2022.08.08 17:53
-
문c(문영일)
2022.08.10 15:05
exception으로 인해 전체 레지스터를 백업해야하는 구간에서는 pstate도 백업합니다.
다만 위의 cpu_switch_to 코드내에서는 전체 레지스터를 백업할 필요 없으므로 pstate도 백업하지 않을 뿐입니다.
exception 벡터 진입 시 pt_regs를 백업할 때,
pstate도 스택내에 저장되는 pt_regs 구조체 내의 pstate 위치에 저장합니다.
struct pt_regs { union { struct user_pt_regs user_regs; struct { u64 regs[31]; u64 sp; u64 pc; u64 pstate; }; }; u64 orig_x0;
.
안녕하세요? 문c 블로그(http://jake.dothome.co.kr)의 문영일입니다.
질문 1에서 유저 태스크 간 context 전환 시 2 가지 종류의 context 전환이 필요합니다.
1) 유저 <-> 커널 전환(user & irq context 전환) 시 전체 레지스터의 백업/복구를 진행합니다.
2) 태스크 A <-> 태스크 B 전환(process context 전환) 시 함수 호출 후에 파괴되어도 무방한 레지스터는 버리고 나머지 레지스터들만 백업/복구를 진행합니다.
질문 2의 경우 pstate도 백업/복구 합니다. (나중에 찾아보겠습니다)
자세한 내용은 다음 URL을 참고하세요.
http://jake.dothome.co.kr/preemption/
감사합니다.
문영일 드림.