안녕하세요~ 이우영 입니다.


오늘은 본격적으로 커널 분석을 해보도록 하겠습니다. 


오늘은 리눅스의 ps 명령어 처럼 task_struct 의 정보를 화면에 출력 해보도록 하겠습니다.

 

PS 명령어


 

ps 명령어를 치면 실행중인 프로세스들의 간단한 정보가 다음 그림처럼 화면에 출력 됩니다.


ps.png


프로세스들의 정보는 /proc 폴더에 파일형태로 저장되어 있습니다. 


우리는 이 파일이 아닌 직접 task_struct에서 정보를 얻어와 화면에 출력 해보도록 하겠습니다.


task_struct


 

task_struct 에는 프로세스에 관한 모든 정보를 보관하는 프로세스 서술자 입니다.

너무 많은 변수를 가지고 있고 나열만해도 a4용지 4장에 가까운 분량이 나오더군요 

 

그래서 이 모든걸 알아보는건 아니고 우리가 자주 쓰고 보는 정보들 위주로 화면에 출력을 해볼까 합니다.

 

우선 현재 실행중인 프로세스의 정보 부터 얻어 보겠습니다.

 

02_task_struct.png

 

소스 코드를 보면 current 라는 매크로를 이용하여 현재 task_struct 정보를 얻어오니다.

 

current 정보는 linux/include/asm-arm/current.h 에 들어있습니다.

 

#include <linux/thread_info.h>

 

static inline struct task_struct *get_current( void ) __attribute_const__;

static inline struct task_struct *get_current( void )

{

        return current_thread_info()->task;

}

 

#define current ( get_current() )

 

보시면 thread_info 라는 곳에서 task 정보를 얻어 옵니다. 커널 2.4 버전에서는

 

바로 task_struct가 있었지만 2.6 버전 부터 thread_info() 가 생겼습니다.

 

thread_info 에는 간단한 프로세스의 정보와 task_struct의 주소를 가지고 있습니다.

 

thread_info()는 프로세스의 커널 스택의 가장 끝부분에 할당되어 접근을 쉽게 만들었습니다.

(2.4버전에서는 이부분에 task_struct가 있었겠죠?)

 

thread_info() 의 정보는 linux/include/asm-arm/thread_info.h에 있으니 한번 확인해 보세요.

 

그럼 얻어온 task_struct로 간단한 정보를 확인해 봅시다.

 

여기서는 우선 thread_info의 주소값, task의 PID, 현재 상태, 플러그 값,

 

그리고 task가 가지는 thread_info의 주소를 출력 해 보았습니다.

 

02_s.png

 

보시면 현재 프로세스( 우리가 만든 모듈이겠죠? )의 ID는 976 번이고

 

상태는 0으로 현재 running 상태인것을 알 수 있습니다.

 

그리고 thread_info 값이 서로 같은것을 알 수 있습니다.

 

그럼 모든 프로세스에 대한 접근을 해보도록 하겠습니다.


리눅스는 친절하게도 매크로를 만들어 두었습니다 (커널 만드시는 분들이 편하기 위해 만들어 두었겠죠?)

 

03_all_task_id.png  


for_each_process () 를 이용하여 프로세스들의 이름과 아이디를 다음과 같이 출력했습니다.


for_each_process ()는 인자로 struct task_struct를 줍니다. 그럼 rot문이 한번 돌때마다 


새로운 프로세스의 task_struct 를 넘겨줍니다 그래서 어렵지 않게 정보를 얻어 올 수 있습니다.


03.png


오늘도 친절한 매크로를 통해 쉽게 진행 했습니다.


다음 시간에는 조금 더 정보를 출력 해보고 자식 프로세스 를 얻어오는 방법 등을 알아 보도록 하겠습니다.


그럼 다음시간에 만나요~


http://ms-osek.org/ <- 쫌더 빨리 보고 싶으신분은 여기로 오세요~