Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

15192
888
89788


[라즈베리파이] 프로세스: 컨택스트 스위칭 이란 Linux-Kernel Analysis

마운드에 A란 투수가 있습니다.
마운드에는 투수 한 명만 공을 던질 수 있습니다.

그런데 마운드에 오르고 싶어하는 B, C란 투수가 불펜에서 몸을 풀고 있습니다.

감독은 마운드에서 혼자 공을 던지고 있는 A란 투수가 불펜에 있는 B, C 투수보다 잘 던지는지 꾸준히 모니터링합니다.

시간이 흘러 감독이 B란 투수틀 마운드에 올려야 겠다고 결단을 내렸습니다.

감독은 마운드에 있는 A 투수를 마운드에서 내리고 B 투수를 마운드에 올립니다.

컨택스트 스위칭에 대한 이해를 돕기 위해 잠깐 야구에서 투수 교체에 대해 설명을 했습니다.

그럼 다시 컨택스트 스위칭에 대한 설명으로 되돌아 가겠습니다.

사용자 입장에서 컴퓨터나 휴대폰에서 여러 프로그램을 동시에 실행할 수 있습니다.
프로그램을 구성 중인 프로세스도 동시에 CPU 실행할 수 있다고 봐야 할까요?
그렇지는 않습니다. 우리 눈에 여러 프로세스들이 CPU를 동시에 실행하고 있다고 느낄 수 있지만,
마운드에 1명의 투수만 공을 던질 수 있듯, 한 개 CPU에서는 한 개 프로세스만 실행할 수 있습니다.

만약 A란 프로세스가 CPU에서 실행 중이라고 가정합시다.
그런데 B와 C 프로세스가 실행을 기다리고 있습니다.

스케줄러는 A란 프로세스와 B, C 프로세스 우선 순위를 계속 지켜봅니다.

스케줄러가 CPU에서 실행 중인 A 프로세스보다 B 프로세스를 실행해야 한다고 판단하면 어떤 일을 할까요?
스케줄러는 B란 프로세스를 CPU에 데리고 갑니다. CPU에서 실행 중인 A 란 프로세스를 CPU에서 비우고 B란 프로세스를 CPU에 채워 줍니다.
감독이 A란 투수를 마운드에서 내리고 B란 투수를 마운드에 올립니다..
이와 같은 이 동작을 컨택스트 스위칭이라고 합니다.

이번에는 조금 더 컨택스트 스위칭을 ARM 프로세스 관점으로 확장해서 생각해봅시다.

A란 프로세스가 실행 중이라고 한다면 ARM(CPU)가 떠오를 것입니다.

A란 프로세스가 ARM 프로세스에서 실행하면 ARM 레지스터 세트에는 A란 프로세스가 실행 중인 정보로 채워져 있습니다.
PC에는 현재 실행 중인 함수 주소를 저장하고 R13 레지스터는 현재 실행 중인 프로세스 스택 주소를 가르키고 있을 것입니다.
물론 함수를 호출한 후 반환값을 R0 레지스터로 전달 받을 것입니다.

스케줄러가 CPU에서 실행 중인 A 프로세스보다 B 프로세스를 실행해야 한다고 판단하면 어떤 일을 할까요?

스케줄러가 A란 프로세스를 ARM 코어에서 A 프로세스를 비워주고,
B란 프로세스를 실행시키려면 어떤 동작을 함까요?  실행 순서는 다음과 같습니다.
1. A 프로세스 실행 정보를 백업
 A 프로세스 실행 정보로 채워져 있는 ARM 코어 레지스터를 A 프로세스 current_thread_info()->cpu_context 필드에 저장

2. B 프로세스 실행 정보 로딩
이전 B 프로세스가 실행했던 레지스터 세트 정보가 저장된 current_thread_info()->cpu_context 필드에 접근해서
ARM 코어 레지스터에 채워줌

A란 프로세스 실행 정보로 가득차 있는 ARM 코어에서 실행했던 레지스터 세트는
프로세스 최상단 주소에 있는 current_thread_info()->cpu_context_save 구조체에 저장합니다.

관련 자료 구조를 함께 소개합니다.
[https://elixir.bootlin.com/linux/v4.14.70/source/arch/arm/include/asm/thread_info.h] 
struct thread_info {
...
__u32 cpu_domain; /* cpu domain */
struct cpu_context_save cpu_context; /* cpu context */

struct cpu_context_save {
__u32 r4;
__u32 r5;
__u32 r6;
__u32 r7;
__u32 r8;
__u32 r9;
__u32 sl;
__u32 fp;
__u32 sp;
__u32 pc;
__u32 extra[2]; /* Xscale 'acc' register, etc */
};

current_thread_info()->cpu_context_save 필드에 가보면
ARM 프로세스 r4 레지스터에서 pc 레지스터까지 저장할 수 있는 필드가 있습니다.

컨택스트 스위칭 동작은 CPU에 의존적입니다.
따라서, ARM64, x86 등 다른 아키텍처에서는 레지스터 세트가 다르니 서로 다른 방식으로 
레지스터를 로딩하거나 저장합니다.


#Reference 시스템 콜


Reference(워크큐)
워크큐(Workqueue) Overview


덧글

댓글 입력 영역