Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

176162
807
85244


4.7 태스크 디스크립터(struct task_struct) 4장. 프로세스 관리

4.7 태스크 디스크립터(struct task_struct) 
프로세스 속성 정보를 표현하는 가장 중요한 자료구조는 무엇일까요? 정답은 태스크 디스크립터이며 자료구조는 struct task_struct입니다. 리눅스 커널에서 가장 중요한 자료구조이며 리눅스 디바이스 드라이버와 커널 코드를 보는 분들은 모두 잘 알아야 할 내용입니다.

TCB(Task Control Block)란 용어 들어본 적 있나요? 임베디드 시스템에서 태스크 혹은 프로세스 정보를 표현하는 자료구조입니다. 
리눅스 커널에서 프로세스 정보를 표현하는 자료 구조는 뭘까요? 여기서 임베디드 시스템에서 말하는 태스크와 리눅스 커널의 프로세스는 같은 개념으로 봐야 합니다. 

프로세스마다 자신의 속성을 저장하는 태스크 디스크립터가 있는 것입니다.
정답은 struct task_struct입니다. 이 구조체를 태스크 디스크립터라고 말하며 프로세스의 속성과 상태 정보를 확인할 수 있습니다.

struct task_struct 구조체에 접근해서 프로세스 정보를 출력하는 한 가지 예를 들어보겠습니다. 라즈베리파이에서 다음와 같이 “ps –ely”란 명령어를 입력하면 프로세스 목록을 볼 수 있습니다.
root@raspberrypi:/home/pi/dev_raspberri # ps -ely
S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0     1     0  0  80   0  5964  7007 SyS_ep ?        00:00:02 systemd
S     0     2     0  0  80   0     0     0 kthrea ?        00:00:00 kthreadd
I     0     4     2  0  60 -20     0     0 worker ?        00:00:00 kworker/0:0H
I     0     6     2  0  60 -20     0     0 rescue ?        00:00:00 mm_percpu_wq
S     0     7     2  0  80   0     0     0 smpboo ?        00:00:00 ksoftirqd/0
I     0     8     2  0  80   0     0     0 rcu_gp ?        00:00:00 rcu_sched
I     0     9     2  0  80   0     0     0 rcu_gp ?        00:00:00 rcu_bh

가장 오른쪽에 systemd, kthreadd 순서로 프로세스 이름을 볼 수 있고 PID는 1, 2, 4번으로 확인할 수 있습니다. 이 프로세스 정보는 태스크 디스크립터 필드에 저장된 값을 읽어서 이를 표현하는 것입니다.

리눅스 시스템에서 구동 중인 프로세스 목록은 어떻게 출력할까요? 이 목록은 프로세스를 관리하는 태스크 디스크립터의 연결 리스트(init_task.tasks에 접근해서 등록된 프로세스를 출력합니다.

처음 리눅스 커널 소스 코드를 분석을 시작할 때 품은 의문이 있습니다. “어떤 코드부터 분석할까?”란 고민을 하는 경우 많습니다.
소스 코드 분석을 시작할 때 태스크 디스크립터 각각 멤버가 리눅스 커널 어느 코드에서 변경되는지 점검하는 것도 좋습니다. 리눅스 커널은 프로세스 중심으로 중요한 데이터를 저장하고 로딩하기 때문입니다.
데브웁스나 리눅스 커널 개발자에게 태스크 디스크립터 구조체인 struct task_struct는 반드시 알아야 할 자료구조입니다.

태스크 디스크립터를 각 항목별로 점검해봅시다. 
처음 태스크 디스크립터 멤버들을 모두 무리해서 외우지 말고 각 멤버들이 무슨 의미인지 코드를 이해하면서 자연히 체득하는 것이 좋습니다.

"이 포스팅이 유익하다고 생각되시면 댓글로 응원해주시면 감사하겠습니다.  
혹시 글을 읽고 궁금점이 있으면 댓글로 질문 남겨주세요. 상세한 답글 올려 드리겠습니다!"


Reference(프로세스 관리)
4.9 프로세스 컨택스트 정보는 어떻게 저장할까?
 4.9.1 컨택스트 소개
 4.9.2 인터럽트 컨택스트 정보 확인하기
 4.9.3 Soft IRQ 컨택스트 정보 확인하기
 4.9.4 선점 스케줄링 여부 정보 저장
4.10 프로세스 디스크립터 접근 매크로 함수
 4.10.1 current_thread_info()
 4.10.2 current 매크로란
4.11 프로세스 디버깅
 4.11.1 glibc fork 함수 gdb 디버깅
 4.11.2 유저 프로그램 실행 추적 


#Reference 시스템 콜

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


핑백

덧글

댓글 입력 영역