Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

85235
1036
103655


[리눅스커널] 프로세스: struct thread_info 구조체 소개 4장. 프로세스 관리

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

struct thread_info 구조체는 다음과 같은 프로세스 핵심 실행 정보를 저장합니다. 
선점 스케줄링 실행 여부
시그널 전달 여부 
인터럽트 컨텍스트와 Soft IRQ 컨텍스트 상태
휴면에 진입하기 직전 레지스터 세트를 로딩 및 백업

그러면 struct thread_info 구조체의 정체가 무엇인지 대화로 더 알아볼까요?  

    struct thread_info 구조체는 어디에 있을까?

struct thread_info 구조체는 프로세스 스택 최상단 주소에 있습니다. 프로세스마다 자신만의 스택이 있으니 프로세스마다 1 개 struct thread_info 구조체가 있는 것입니다.  

    struct thread_info 구조체는 왜 필요할까? 프로세스를 관리하는 자료구조는 태스크  
   디스크립터 struct thread_info task_struct 구조체로 충분하지 않나?

struct thread_info 구조체 필드는 프로세스 세부 실행 정보를 저장합니다.
컨택스트 정보 저장 
스케줄링 직전 실행했던 레지스터 세트 
프로세스 세부 실행 정보 

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

다음 코드 검색 결과를 보면서 아키텍처 별 struct thread_info 구조체를 확인해볼까요? 
[https://github.com/raspberrypi/linux/blob/rpi-4.19.yident/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 아키텍처의 struct thread_info 구조체 선언부입니다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/x86/include/asm/thread_info.h]
struct thread_info {
unsigned long flags; /* low level flags */
u32 status; /* thread synchronous flags */
};

struct thread_info 구조체 필드는 2개 밖에 없습니다.

이어서 다음은 ARMv7 아키텍처의 struct thread_info 구조체 선언부입니다.  
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/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 아키텍처에서 실행하므로 위 경로에 있는 struct thread_info 구조체로 프로세스 세부 동작을 관리합니다.

이제 다음 대화를 통해 struct thread_info 구조체에 대해 정리를 해볼까요? 

    태스크 디스크립터인 struct task_struct 구조체와 struct thread_info 구조체의 
   차이점은 무엇일까?

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

    struct thread_info 구조체에서 관리하는 커널 핵심 동작은 무엇인가?

struct thread_info 구조체에서 관리하는 커널 세부 동작은 다음과 같습니다.
현재 실행 중인 코드가 인터럽트 컨택스트인지 여부 
현재 프로세스가 선점 가능한 조건인지 점검 
로세스가 시그널을 받았는지 여부 
컨택스트 스케줄링 전 후로 실행했던 레지스터 세트를 저장하거나 로딩

이번 시간에는 struct thread_info 구조체에 대해 소개를 했습니다. 이어서 struct thread_info 구조체 세부 필드를 알아볼까요?

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

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

#Reference(프로세스 관리)
프로세스 디버깅
   glibc fork 함수 gdb 디버깅





핑백

덧글

댓글 입력 영역