FORK

Category
아이템: 
포스트 갯수5

[라즈베리파이] 프로세스 - 자식 프로세스 생성 실습 및 ftrace 로그 분석(1/2)

By Guillermo Austin Kim | 2018년 10월 27일 | 
이번에 리눅스 시스템 프로그래밍으로 프로세스를 생성해 봅시다. 소스 코드는 다음과 같으니 같이 입력해 봅시다.1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>45 #define PROC_TIMES 76 #define SLEEP_DURATION 27 #define FORK_MAX_TIMES 389 void raspbian_proc_process(void);1011 void raspbian_proc_process(void) 12 {13 int proc_times = 0;14 15 for(proc_times = 0; proc_times < PROC_TIMES; proc_times++)

[리눅스커널] 프로세스 - 유저 레벨 프로세스 생성 시 _do_fork() 함수 흐름

By Guillermo Austin Kim | 2018년 10월 21일 | 
먼저 유저 레벨 프로세스는 어떻게 생성할까요? 저수준 리눅스 어플리케이션 프로그램으로 fork() 함수를 호출하면 리눅스에서 제공하는 라이브러리 도움을 받아 커널에게 프로세스 생성 요청을 합니다. 여기까지가 유저 모드에서 프로세스를 요청하는 단계입니다. 리눅스에서 제공하는 라이브러리는 시스템 콜을 발생하고 리눅스 커널에서는 fork() 함수에 대응하는 시스템 콜 핸들러인 sys_clone() 함수를 호출합니다. 먼저 sys_clone() 함수 코드를 봅시다. [https://elixir.bootlin.com/linux/v4.14.70/source/kernel/fork.c#L2020]1 #ifdef __ARCH_WANT_SYS_CLONE2 #ifdef CONFIG_CLONE_BACKWARDS3 SYSCAL

[리눅스커널] 프로세스는 어떻게 생성하나? - _do_fork() 함수 호출

By Guillermo Austin Kim | 2018년 10월 21일 | 
프로세스에 대한 이해를 하려면 프로세스가 어떻게 생성되는 지 알면 좋습니다. 프로세스 생성 과정에서 프로세스를 관리하는 자료구조 관계를 알 수 있기 때문입니다. 리눅스에서 구동되는 프로세스는 크게 유저 레벨에서 생성된 프로세스와 커널 레벨에서 생성된 프로세스가 있습니다. 유저 레벨에서 생성된 프로세스는 유저 공간에서 프로세스를 생성하는 라이브러리(glibc) 도움을 받아 커널에게 프로세스 생성 요청을 합니다. 커널 프로세스는 kthread_create() 함수를 호출해서 커널 내부에서 프로세스를 생성합니다. 커널 프로세스는 커널 스레드라고 부르며 커널 내부에서 스레드를 직접 관리합니다. 공통으로 리눅스에서 생성된 프로세스는 _do_fork() 함수를 호출합니다. 프로세스 생성하는 핵심함수는 _do_

[리눅스 커널] 유저 레벨 프로세스란

By Guillermo Austin Kim | 2018년 10월 15일 | 
유저 레벨 프로세스에 대해 알아보기 전에 유저 모드가 무엇인지에 대해서 먼저 살펴봅시다. 우리가 라즈베리파이에서 바탕 화면에 있는 아이콘을 클릭해서 어떤 프로그램을 실행하고 있다고 가정합시다. 이 때 프로그램은 유저 모드나 커널 모드 중 하나로 동작합니다. ftrace 로그로 이 커널이 동작을 확인하면 정확히 유저 모드와 커널 모드를 자주 스위칭합니다. 유저 모드와 커널 모드로 나누는 기준은 무엇일까요? 이는 메모리 접근과 실행 권한으로 두 모드로 분류합니다. 실행 모드를 유저 모드와 커널 모드로 나누는 이유를 알기 위해 예를 들겠습니다. 어떤 시스템 메모리 공간을 0~4G까지 가상 메모리에서 연속으로 쓰고 있다고 가정합시다. 이 때 커널 코드와 전역 변수가 0~4G 메모리 구간에 메모리 주소로 매핑