강좌 & 팁
안녕하세요~ 이우영 입니다.
오늘은 본격적으로 커널 분석을 해보도록 하겠습니다.
오늘은 리눅스의 ps 명령어 처럼 task_struct 의 정보를 화면에 출력 해보도록 하겠습니다.
PS 명령어
ps 명령어를 치면 실행중인 프로세스들의 간단한 정보가 다음 그림처럼 화면에 출력 됩니다.
프로세스들의 정보는 /proc 폴더에 파일형태로 저장되어 있습니다.
우리는 이 파일이 아닌 직접 task_struct에서 정보를 얻어와 화면에 출력 해보도록 하겠습니다.
task_struct
task_struct 에는 프로세스에 관한 모든 정보를 보관하는 프로세스 서술자 입니다.
너무 많은 변수를 가지고 있고 나열만해도 a4용지 4장에 가까운 분량이 나오더군요
그래서 이 모든걸 알아보는건 아니고 우리가 자주 쓰고 보는 정보들 위주로 화면에 출력을 해볼까 합니다.
우선 현재 실행중인 프로세스의 정보 부터 얻어 보겠습니다.
소스 코드를 보면 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의 주소를 출력 해 보았습니다.
보시면 현재 프로세스( 우리가 만든 모듈이겠죠? )의 ID는 976 번이고
상태는 0으로 현재 running 상태인것을 알 수 있습니다.
그리고 thread_info 값이 서로 같은것을 알 수 있습니다.
그럼 모든 프로세스에 대한 접근을 해보도록 하겠습니다.
리눅스는 친절하게도 매크로를 만들어 두었습니다 (커널 만드시는 분들이 편하기 위해 만들어 두었겠죠?)
for_each_process () 를 이용하여 프로세스들의 이름과 아이디를 다음과 같이 출력했습니다.
for_each_process ()는 인자로 struct task_struct를 줍니다. 그럼 rot문이 한번 돌때마다
새로운 프로세스의 task_struct 를 넘겨줍니다 그래서 어렵지 않게 정보를 얻어 올 수 있습니다.
오늘도 친절한 매크로를 통해 쉽게 진행 했습니다.
다음 시간에는 조금 더 정보를 출력 해보고 자식 프로세스 를 얻어오는 방법 등을 알아 보도록 하겠습니다.
그럼 다음시간에 만나요~