Linux/Linux System Programming 9

유닉스 디렉토리 구조와 의미

유닉스에서는 파일들을 저장하고 관리하기 위해 트리 형태의 디렉터리 구조를 사용한다. 유닉스 및 리눅스 환경을 처음 접하면서 기존의 소스 및 구현들이 어느 디렉토리에 있구나,,해서 어깨 넘어로 배운 지식뿐이다. 이에 정확한 디렉터리의 구조와 의미를 집고 넘어가자. /bin 유닉스 기본 유틸리티들을 모은 디렉토리 /sbin 유닉스 시스템 유틸리티들을 모은 디렉토리 /dev 시스템에 연결되어 있는 디바이스 파일들이 위치 /lib 일반적으로 공유 라이브러리 위치 /boot 커널 이미지와 같은 시스템 부팅과 관련된 파일들이 위치 /home 일반 사용자 홈 디렉터리 /root 슈퍼 유저(root)를 위한 디렉터리로 일반 사용자들이 접근할 수 없다. /etc 시스템 설정과 관련된 파일들이 위치 /proc 프로세스와 ..

ftrace 메세지로 시스템 콜 exit() 프로세스 생성과 종료 과정 분석

ftrace 메세지로 시스템 콜 exit() 프로세스 생성과 종료 과정 분석 소스코드 1 #include 2 #include 3 #include 4 5 #define PROC_TIMES 3 6 #define SLEEP_DURATION 3 //sec unit 7 8 int main() 9 { 10 int proc_times = 0; 11 12 for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) { 13 printf("rpi tracing\\n"); 14 sleep(SLEEP_DURATION); 15 } 16 17 exit(EXIT_SUCCESS); 18 return 0; 19 } ftrace 활성화 → 위 소스코드 실행 → ftrace 비활성화 프로세스..

Kill -9 Program ftrace (유저단)

ftrace 메세지로 프로세스 생성과 종료 과정 분석 1단계 프로세스 생성 2단계 raspbian_proc 프로세스 진행 3단계 프로세스 종료 4단계 부모 프로세스에게 시그널 전달 399 bash-12961 [002] .... 1060001.980092: sys_clone+0x14/0x38 sys_clone+0x18/0x38 402 => ret_fast_syscall+0x0/0x28 403 => 0x7ef64190 404 bash-12961 [002] .... 1060001.980122: _do_fork+0x14/0x464 _do_fork+0x18/0x464 407 => sys_clone+0x30/0x38 408 => ret_fast_syscall+0x0/0x28 409 => 0x7ef64190 410 ..

프로세스는 뭘까? - 정의

리눅스 시스템 메모리에서 실행 중인 프로그램이라고 한다. 다수의 프로세스를 실시간으로 사용하는 기법을 멀티프로세싱이라 하며, 같은 시간에 여러 프로그램을 실행하는 방식을 멀티태스킹이라고 한다. 리눅스 시스템에서 프로세스가 어떻게 동작을 하는 지 의문이 생긴다. 프로세스가 실행을 대기한다면 실행할 때 어떤 과정을 거칠까? 프로세스는 어떤 구조체로 식별할까? 리눅스에는 프로세스를 관리하는 자료구조이자 객체를 “태스크 디스크립터”(Task Descriptor)라고 하며, tast_struct 구조체로 표현된다. 이 구조체에서는 메모리 리소스, 프로세스 이름, 실행 시각, 프로세스 아이디, 프로세스 스택의 최상단 주소와 같은 속성 정보가 저장된다. 프로세스의 실행 흐름을 표현하는 또 한 가지의 중요한 공간은 프..

ftrace란?

Ftrace란? ftrace는 리눅스 커널에서 제공하는 가장 강력한 트레이서이다. 트레이서의 특징은 다음과 같다. 인터럽트, 스케줄링, 커널 타이머 등의 커널 동작을 상세히 추적한다. 함수 필터를 지정하면 지정한 함수를 호출한 함수와 전체 콜 스택까지 출력한다. 물론 코드 수정이 없다. 함수를 어느 프로세스가 실행하는 지 알 수 있다. 함수가 실행된 시각 정보를 알 수 있다. ftrace 로그를 활성화해도 시스템 동작에 부하를 거의 주지 않는다. Ftrace 설치 방법 ftrace는 리눅스 커널의 공통 기능이고 라즈비안이 아닌 다른 리눅스 시스템에도 지원한다고 한다. 라즈비안에서는 아래의 패치코드를 통해서 활성화를 할 수 있다. /arch/arm/configs/your_device_defconfig CO..

dump_stack()함수

dump_stack() 함수 커널에서 지원하는 dump_stack() 함수를 호출하면 콜 스택을 커널 로그로 볼 수 있다. 사용법은 커널 로그로 콜 스택을 보고 싶은 코드에 dump_stack() 를 추가하기만 하면 된다. #include 위의 헤더 파일을 추가해서 사용한다. dump_stack() 함수의 선언부는 다음과 같다. asmlinkage __visible void dump_stack(void); 매개변수와 반환값이 모두 void이다. 즉, 커널 소스코드의 어디든 사용이 가능하다. dump_stack()함수로 커널 로그에서 콜 스택 호출하기 kernel/fork.c 파일 수정. 라즈비안의 커널을 빌드와 설치 후 재부팅합니다. dump_stack() 함수 실행 확인 [28.785596] cpu 번..

커널 디버깅 - printk

C언어의 printf와 같은 기능으로 커널에서 사용하는 출력 함수입니다. 자료형의 서식지정은 C언어의 printf와 동일합니다. * printk로 포인터를 출력하고 싶으면 %p를 쓰면 됩니다. 책의 예제에 따라 커널 소스 중 일부를 수정했다. static void insert_wq_barrier(struct pool_workqueue *pwq, struct wq_barrier *barr, struct work_struct *target, struct worker *worker) { struct list_head *head; unsigned int linked = 0; // 수정내용 printk("[+] process: %s\n", current->comm); printk("[+][debug] messag..

파일 입출력

리눅스 파일은 읽거나 쓰기 전에 반드시 열어야 한다. 커널은 파일 테이블이라고 하는 프로세스별로 열린 파일 목록을 관리한다. 이 테이블은 음이 아닌 정수 값인, 파일 디스크립터로 인덱싱되어 있다. 이 테이블(커널)의 각 항목은 열린 파일에 대한 정보를 담고 있으며 여기에는 메모리에 복사된 inode를 가리키는 포인터와 각종 메타데이터가 포함되어 있다. 파일 디스크립터는 사용자 영역과 커널 영역 모두에서 프로세스의 냉의 고유한 식별자로 사용된다. 파일을 열면 파일 디스크립터가 반환된고 이 파일 디스크립터를 관련 시스템 콜의 첫 번째 인자로 넘겨 다양한 연산을 수행한다. 파일 디스크립터는 C의 int형이다. 따라서 각 리눅스 프로세스가 열 수 있는 최대 파일 개수가 정해져 있다. 파일 디스크립터로 음수를 허..