ARM Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

202239
1625
172599


[리눅스커널] 프로세스: thread_info 구조체란? 4. 프로세스(Process) 관리

지금까지 프로세스 속성을 관리하는 자료구조인 태스크 디스크립터를 배웠습니다. 커널에서는 태스크 디스크립터뿐만 아니라 thread_info 구조체로 프로세스 실행 동작을 관리합니다.

이번 절에서는 thread_info 구조체를 소개하고 각 필드의 의미를 살펴보겠습니다. 또한 thread_info 구조체 중 preempt_count 필드를 중심으로 프로세스의 실행 흐름을 분석하겠습니다.

thread_info 구조체란?

태스크 디스크립터는 프로세스의 공통 속성 정보를 저장하고 관리합니다. 추가로 커널에서는 프로세스의 세부 실행 정보를 저장하거나 로딩하는 자료구조가 필요한데 이를 thread_info 구조체에서 관리합니다.

thread_info 구조체는 다음과 같은 프로세스의 핵심 실행 정보를 저장합니다.

선점 스케줄링 실행 여부
시그널 전달 여부 
인터럽트 컨텍스트와 Soft IRQ 컨텍스트 상태
휴면 상태로 진입하기 직전 레지스터 세트를 로딩 및 백업

그럼 thread_info 구조체의 정체가 무엇인지 좀 더 자세히 알아보겠습니다.

먼저 thread_info 구조체는 어디에 있을까요? thread_info 구조체는 프로세스 스택에서 최상단 주소에 있습니다. 프로세스마다 자신만의 스택이 있으니 프로세스마다 1개의 thread_info 구조체가 있는 셈입니다.  

thread_info 구조체는 다음과 같은 프로세스의 세부 실행 정보를 저장합니다.

컨텍스트 정보
스케줄링 직전 실행했던 레지스터 세트
프로세스 세부 실행 정보 

그런데 위에서 언급한 동작은 CPU 아키텍처마다 구현 방식이 다릅니다. 즉, x86, ARMv7, ARMv8, PowerPC별로 구현 방식이 다릅니다. 그래서 CPU 아키텍처별로 프로세스의 세부 정보를 저장하는 자료구조인 thread_info 구조체가 필요한 것입니다.

다음 코드의 검색 결과를 보면서 아키텍처별 thread_info 구조체를 확인해 보겠습니다.

https://elixir.bootlin.com/linux/v4.19.30/source/ident/thread_info
arch/alpha/include/asm/thread_info.h, line 15 (as a struct)
arch/arc/include/asm/thread_info.h, line 42 (as a struct)
arch/arm/include/asm/thread_info.h, line 49 (as a struct)
arch/arm64/include/asm/thread_info.h, line 39 (as a struct)
...
arch/x86/include/asm/thread_info.h, line 56 (as a struct)

다음은 x86 아키텍처의 thread_info 구조체 선언부입니다.

https://elixir.bootlin.com/linux/v4.19.30/source/arch/x86/include/asm/thread_info.h
struct thread_info {
unsigned long flags; /* low level flags */
u32 status; /* thread synchronous flags */
};

thread_info 구조체의 필드가 2개밖에 없습니다.

다음은 ARMv7 아키텍처의 thread_info 구조체 선언부입니다.  

https://elixir.bootlin.com/linux/v4.19.30/source/arch/arm/include/asm/thread_info.h
struct thread_info {
unsigned long flags; /* low level flags */
int preempt_count; /* 0 => preemptable, <0 => bug */
mm_segment_t addr_limit; /* address limit */
struct task_struct *task; /* main task structure */
__u32 cpu; /* cpu */
...
};

라즈비안에서는 ARMv7 아키텍처에서 실행되므로 위 경로에 있는 thread_info 구조체로 프로세스의 세부 동작을 관리합니다.

이번에는 thread_info 구조체에 대해 정리해 봅시다. 먼저 태스크 디스크립터인 task_struct 구조체와 thread_info 구조체의 차이점은 무엇일까요?

태스크 디스크립터인 task_struct 구조체는 CPU 아키텍처에 독립적인 프로세스 관리용 속성을 저장합니다. 커널 버전이 같으면 x86이나 ARMv7에서 task_struct 구조체의 기본 필드는 같습니다. 하지만 thread_info 구조체는 CPU 아키텍처에 종속적인 프로세스의 세부 속성을 저장하므로 서로 다릅니다. 

thread_info 구조체에서 관리하는 커널의 핵심 동작은 무엇인가요? thread_info 구조체에서 관리하는 커널의 세부 동작은 다음과 같습니다.

현재 실행 중인 코드가 인터럽트 컨텍스트인지 여부 
현재 프로세스가 선점 가능한 조건인지 점검
프로세스가 시그널을 받았는지 여부 
컨텍스트 스케줄링 전후로 실행했던 레지스터 세트를 저장하거나 로딩

이번에는 thread_info 구조체를 소개했습니다. 이어서 thread_info 구조체의 세부 필드를 살펴보겠습니다.

* 유튜브 강의 동영상도 있으니 같이 들으시면 좋습니다. 




#프로세스

프로세스 소개 
프로세스 확인하기  
프로세스는 어떻게 생성할까?  
유저 레벨 프로세스 실행 실습  
커널 스레드  
커널 내부 프로세스의 생성 과정   
프로세스의 종료 과정 분석  
태스크 디스크립터(task_struct 구조체)  
스레드 정보: thread_info 구조체  
프로세스의 태스크 디스크립터에 접근하는 매크로 함수  
프로세스 디버깅  
   * glibc의 fork() 함수를 gdb로 디버깅하기  


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)




핑백

덧글

댓글 입력 영역