context switching 을 할때 수행되는 asm 코드 관련 문의 드립니다.
안녕하세요. 강의 잘 보고 있습니다.
어리석은 질문일수도 있습니다만 문득 든 생각이라 여쭤봅니다.
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)
Answer 3
0
AI가 어느 정도 잘 대답을 했네요.
정말 쉽게 이야기하면,
0~18에 만약 필요한 데이터가 있었다면.. (호출하는 쪽에서 관리해야함)
이건 스택 프레임에 저장이 되어 있어야 해요.
그래서 스택 프레임에 접근해서 그 데이터들을 가져오는 구조로 사용해요.
X19~X29, SP, LR 는 기존 상태로 돌리기 위해서 꼭 필요하다. 정도로 생각하시면 좋을 것 같아요.
0~18 데이터가 필요하다면, 스택 프레임에 저장이 되어 있어야 하고, 이건 호출하는 쪽에서 알아서 관리해야한다.
이 정도로 정리하죠.
0
안녕하세요, 인프런 AI 인턴입니다. ym0914님.
리눅스 커널에서의 문맥 전환(context switch) 시 특정 레지스터만 저장 및 복원하는 이유에 대해 말씀드리겠습니다. 기본적으로 ARM 아키텍처에서 사용되는 레지스터들은 두 가지 유형으로 나뉘는데, 바로 ‘caller-saved’와 ‘callee-saved’ 레지스터입니다.
Caller-saved Registers:
- 이들은 함수 호출 시 호출자가 저장하고 복원해야 하는 레지스터입니다.
- X0 ~ X18은 주로 함수 간 인자 전달 및 임시 데이터 저장에 사용되므로, 문맥 전환 시 저장할 필요가 없습니다. 이는 호출자가 이 레지스터들을 필요할 경우 스스로 저장해야 하기 때문입니다.
- 이들은 함수 호출 시 호출자가 저장하고 복원해야 하는 레지스터입니다.
Callee-saved Registers:
- X19 ~ X29, SP(Stack Pointer), LR(Link Register)은 함수가 반환될 때 초기에 호출된 상태를 그대로 복원해야 하므로, 피호출자가 이들을 저장하고 복원합니다.
- 문맥 전환이란 프로세스 A의 실행 상태를 프로세스 B로 전환하는 것이기 때문에, 프로세스 간에 변경되지 않아야 하는 컨텍스트(상태)는 callee-saved 레지스터로 관리됩니다.
- X19 ~ X29, SP(Stack Pointer), LR(Link Register)은 함수가 반환될 때 초기에 호출된 상태를 그대로 복원해야 하므로, 피호출자가 이들을 저장하고 복원합니다.
따라서, 코드에서 X19 ~ X29, SP, LR만 저장하고 복원하는 이유는 이러한 레지스터들이 함수 실행 간에 불변의 상태를 유지해야 하기 때문입니다.
유사한 질문들에 대한 추가적인 정보를 원하시면 아래의 링크를 참조하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. 계속 프로젝트를 해야지 하다가 결제하고 환경 설정 중입니다.
0
14
1
Export template 안됨
1
27
2
scanf("%d\n") 의미
0
20
1
REST API (Self-descriptive messages)
0
22
1
필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)
0
37
2
13강 프로젝트생성해보기 관련 질문
0
26
3
56강 bcm2835-mailbox.c 파일 질문
0
58
2
'drivers/soc/bcm/bcm2835-power.o 에러 입니다.
0
88
3
라즈베리파이5 도 상관없을까요
0
103
1
드라이버 작성 포맷
0
74
2
ftrace를 사용하면서 궁금한 점.
0
83
2
install.txt를 실행하는 이유에 대해서.
0
93
2
네트워크 연결이 안됩니다
0
116
2
고아(?) 프로세스의 부모 선정이 어떻게 되는지 궁금합니다
0
121
3
arm 아키텍처는 4를 빼는 이유가 무엇일까요
0
172
3
xshell 와이파이 연결이 안됌.
0
205
2
시즌 2, 3 는 언제 수강할 수 있을까요?
0
257
2
current 매크로를 이용할때 sp_el0 를 활용하는 이유
0
195
2
라즈베리파이 메모리 사이즈 큰거 사도 될까요?
0
329
1
set_ftrace 질문
2
243
2
강의자료
0
175
2
재 빌드시 변경파일만 반영하지 않고 처음부터 빌드 됩니다.
0
319
1
kernel build 오류
0
300
3
라즈베리파이 용량부족
0
589
3

