인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ym0914님의 프로필 이미지
ym0914

작성한 질문수

한국에서 제일 쉬운 리눅스 커널 강의

아키텍처마다 다른 thread_info 구조체-2

context switching 을 할때 수행되는 asm 코드 관련 문의 드립니다.

해결된 질문

작성

·

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

ym0914님의 프로필 이미지
ym0914
질문자

답변 감사합니다

0

ojtube5님의 프로필 이미지
ojtube5
지식공유자

AI가 어느 정도 잘 대답을 했네요.

정말 쉽게 이야기하면,
0~18에 만약 필요한 데이터가 있었다면.. (호출하는 쪽에서 관리해야함)
이건 스택 프레임에 저장이 되어 있어야 해요.
그래서 스택 프레임에 접근해서 그 데이터들을 가져오는 구조로 사용해요.

X19~X29, SP, LR 는 기존 상태로 돌리기 위해서 꼭 필요하다. 정도로 생각하시면 좋을 것 같아요.
0~18 데이터가 필요하다면, 스택 프레임에 저장이 되어 있어야 하고, 이건 호출하는 쪽에서 알아서 관리해야한다.

이 정도로 정리하죠.

0

안녕하세요, 인프런 AI 인턴입니다. ym0914님.

리눅스 커널에서의 문맥 전환(context switch) 시 특정 레지스터만 저장 및 복원하는 이유에 대해 말씀드리겠습니다. 기본적으로 ARM 아키텍처에서 사용되는 레지스터들은 두 가지 유형으로 나뉘는데, 바로 ‘caller-saved’와 ‘callee-saved’ 레지스터입니다.

  1. Caller-saved Registers:

    • 이들은 함수 호출 시 호출자가 저장하고 복원해야 하는 레지스터입니다.
    • X0 ~ X18은 주로 함수 간 인자 전달 및 임시 데이터 저장에 사용되므로, 문맥 전환 시 저장할 필요가 없습니다. 이는 호출자가 이 레지스터들을 필요할 경우 스스로 저장해야 하기 때문입니다.
  2. Callee-saved Registers:

    • X19 ~ X29, SP(Stack Pointer), LR(Link Register)은 함수가 반환될 때 초기에 호출된 상태를 그대로 복원해야 하므로, 피호출자가 이들을 저장하고 복원합니다.
    • 문맥 전환이란 프로세스 A의 실행 상태를 프로세스 B로 전환하는 것이기 때문에, 프로세스 간에 변경되지 않아야 하는 컨텍스트(상태)는 callee-saved 레지스터로 관리됩니다.

따라서, 코드에서 X19 ~ X29, SP, LR만 저장하고 복원하는 이유는 이러한 레지스터들이 함수 실행 간에 불변의 상태를 유지해야 하기 때문입니다.

유사한 질문들에 대한 추가적인 정보를 원하시면 아래의 링크를 참조하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ym0914님의 프로필 이미지
ym0914

작성한 질문수

질문하기