해결된 질문
작성
·
23
0
안녕하세요. 강의 잘 보고 있습니다.
어리석은 질문일수도 있습니다만 문득 든 생각이라 여쭤봅니다.
X0 ~ X18 은 저장 및 복원 하지 않고,
X19~X29, SP, LR 만 복원하는 이유가 있을까요?
829 SYM_FUNC_START(cpu_switch_to)
830 mov x10, #THREAD_CPU_CONTEXT
831 add x8, x0, x10
832 mov x9, sp
833 stp x19, x20, [x8], #16 // store callee-saved registers
834 stp x21, x22, [x8], #16
835 stp x23, x24, [x8], #16
836 stp x25, x26, [x8], #16
837 stp x27, x28, [x8], #16
838 stp x29, x9, [x8], #16
839 str lr, [x8]
840 add x8, x1, x10
841 ldp x19, x20, [x8], #16 // restore callee-saved registers
842 ldp x21, x22, [x8], #16
843 ldp x23, x24, [x8], #16
844 ldp x25, x26, [x8], #16
845 ldp x27, x28, [x8], #16
846 ldp x29, x9, [x8], #16
847 ldr lr, [x8]
848 mov sp, x9
849 msr sp_el0, x1
850 ptrauth_keys_install_kernel x1, x8, x9, x10
851 scs_save x0
852 scs_load_current
853 ret
854 SYM_FUNC_END(cpu_switch_to)
855 NOKPROBE(cpu_switch_to)
답변 3
0
0
AI가 어느 정도 잘 대답을 했네요.
정말 쉽게 이야기하면,
0~18에 만약 필요한 데이터가 있었다면.. (호출하는 쪽에서 관리해야함)
이건 스택 프레임에 저장이 되어 있어야 해요.
그래서 스택 프레임에 접근해서 그 데이터들을 가져오는 구조로 사용해요.
X19~X29, SP, LR 는 기존 상태로 돌리기 위해서 꼭 필요하다. 정도로 생각하시면 좋을 것 같아요.
0~18 데이터가 필요하다면, 스택 프레임에 저장이 되어 있어야 하고, 이건 호출하는 쪽에서 알아서 관리해야한다.
이 정도로 정리하죠.
0
안녕하세요, 인프런 AI 인턴입니다. ym0914님.
리눅스 커널에서의 문맥 전환(context switch) 시 특정 레지스터만 저장 및 복원하는 이유에 대해 말씀드리겠습니다. 기본적으로 ARM 아키텍처에서 사용되는 레지스터들은 두 가지 유형으로 나뉘는데, 바로 ‘caller-saved’와 ‘callee-saved’ 레지스터입니다.
Caller-saved Registers:
Callee-saved Registers:
따라서, 코드에서 X19 ~ X29, SP, LR만 저장하고 복원하는 이유는 이러한 레지스터들이 함수 실행 간에 불변의 상태를 유지해야 하기 때문입니다.
유사한 질문들에 대한 추가적인 정보를 원하시면 아래의 링크를 참조하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.