inflearn logo
강의

Course

Instructor

The easiest Linux kernel course in Korea

Current was you-2

current 매크로를 이용할때 sp_el0 를 활용하는 이유

Resolved

195

ym0914

3 asked

0

안녕하세요. 좋은강의 감사합니다.

설명해주신대로 코드를 보면 sp_el0 를 이용해서 current 주소를 얻어온다는것을 이해할 수 있었습니다.

 

그런데 문득 sp_el1 도 있을텐데 왜 sp_el0 를 활용한건지 궁금합니다. sp_el0 는 user process 들이 활용하는 sp 이고 sp_el1 은 kernel process 들이 활용하는 sp 로 알고 있는데 요,

그런용도가 아니라 그냥 sp_el0 를 모든 process 의 task_struct 의 시작주소를 저장하는 용도로 활용하는걸까요?

 

<arch/arm64/include/asm/current.h>

15 static __always_inline struct task_struct *get_current(void)

16 {

17 unsigned long sp_el0;

18

19 asm ("mrs %0, sp_el0" : "=r" (sp_el0));

20

21 return (struct task_struct *)sp_el0;

22 }

<arch/arm64/kernel/entry.S>

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)

c linux Raspberry-Pi 운영체제 arm-architecture asm

Answer 2

0

ym0914

답변 감사합니다!

0

ojtube5

정말 쉽게 정리할게요.
1. sp_el0는 항상 current, 즉 현재 실행 중인 Task의 주소를 가리키도록 설계되었습니다.
즉 어떤 모드든 상관 없이 무조건 sp_el0는 current를 가르킵니다.


2. 리눅스 커널에서 sp_el0의 용도 변경

ARM64의 기본 설계에서sp_el0는 유저 모드의 스택 포인터를 가리키도록 되어 있지만, 리눅스 커널에서는 이렇게 사용하지 않습니다. 대신sp_el0를 "현재 실행 중인 프로세스의task_struct를 가리키는 전용 레지스터"로 사용합니다.

굳이 왜 이러시나요?
1. 아주 빠르고 쉽게 일관되게 current를 찾기 위해.

결론

  • ARM64 아키텍처 기본 설계: sp_el0는 "유저 모드의 스택 포인터"로 사용하라고 설계됨.

  • 리눅스 커널: "그 말을 안 듣고, sp_el0current 관리용으로 사용하겠다."

안녕하세요. 계속 프로젝트를 해야지 하다가 결제하고 환경 설정 중입니다.

0

15

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

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

0

170

3

라즈베리파이 메모리 사이즈 큰거 사도 될까요?

0

329

1

set_ftrace 질문

2

243

2

강의자료

0

175

2

재 빌드시 변경파일만 반영하지 않고 처음부터 빌드 됩니다.

0

319

1

kernel build 오류

0

300

3

라즈베리파이 용량부족

0

589

3