
- 2020/02/29 09:32
- rousalome.egloos.com/10011978
- 덧글수 : 13

핑백
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: wake_up_new_task() 함수 분석 2020-03-01 09:55:52 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: copy_process() 함수 분석 2020-03-01 09:55:55 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: _do_fork() 함수 2020-03-01 09:56:00 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 커널 스레드의 종류 2020-03-01 09:56:11 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 커널 스레드란? 2020-03-01 09:56:12 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: exit() 함수로 프로세스가 종료되는 과정 및 ftrace 로그 분석 2020-03-01 09:56:17 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 기본 유저 레벨 프로세스 실행 실습 및 ftrace 로그 분석 2020-03-01 09:56:27 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 커널 프로세스 생성 시 _do_fork() 함수의 흐름 2020-03-01 09:56:35 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 유저 레벨 프로세스를 생성할 때 _do_fork() 함수의 처리 흐름 2020-03-01 09:56:36 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스 커널] 프로세스: 유저 모드와 커널 모드란 2020-03-01 09:56:38 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: do_fork() 함수 소개 2020-03-01 09:56:40 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: ftrace에서 프로세스 확인하기 2020-03-01 09:56:42 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: ps 명령어로 프로세스 목록 확인 2020-03-01 09:56:46 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 스레드란? 2020-03-01 09:56:49 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 태스크란 2020-03-01 09:56:52 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 프로세스란 2020-03-01 09:56:56 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 유저 프로그램 실행 흐름 추적하기 2020-03-01 17:14:22 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 프로세스 컨택스트 정보는 어떻게 저장할까? 2020-03-01 17:15:31 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] thread_info 구조체의 preempt_count - 인터럽트 컨텍스트 실행 저장 2020-03-01 17:15:43 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] thread_info 구조체의 preempt_count - 선점 스케줄링 여부 확인 2020-03-01 17:20:46 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: thread_info 구조체 - cpu 필드에 대한 상세 분석 2020-03-01 17:21:01 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: thread_info 구조체 초기화 코드 분석 2020-03-01 17:21:23 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: current 매크로란 2020-03-01 17:21:31 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: current_thread_info() 매크로 함수 분석 2020-03-01 17:21:43 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: do_task_dead() 함수 분석 2020-03-01 17:23:11 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: do_task_dead() 함수를 호출하고 난 후의 동작 2020-03-01 17:23:16 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 태스크 디스크립터(task_struct 구조체) - 프로세스를 식별 필드 2020-03-01 17:23:29 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 태스크 디스크립터(task_struct 구조체) - 프로세스 상태 2020-03-01 17:23:46 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 태스크 디스크립터(task_struct 구조체) - 프로세스 간의 관계 2020-03-01 17:24:09 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 태스크 디스크립터(task_struct 구조체) - 프로세스 연결 리스트 2020-03-01 17:24:23 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 태스크 디스크립터(task_struct 구조체) - 프로세스 실행 시각 2020-03-01 17:24:41 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: thread_info 구조체란? 2020-03-01 17:24:54 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: struct thread_info 구조체 소개 2020-03-01 17:25:12 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: struct thread_info 구조체 주소 위치는 어디일까? 2020-03-01 17:25:31 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] thread_info 구조체의 preempt_count - Soft IRQ 컨텍스트 실행 2020-03-01 17:28:34 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: do_exit() 함수 분석 2020-03-02 00:37:14 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
Linux Kernel(4.19) Hacks : [리눅스커널] 프로세스: 프로세스 종료 흐름 파악 2020-03-02 00:40:15 #
... bsp;* 커널 스레드란? * 커널 스레드의 종류 * 커널 스레드는 어떻게 생성할까? 커널 내부 프로세스의 생성 과정 * _do_fork() 함수 &nb ... more
덧글
-
HokiMin 2021/01/24 23:22 # 답글
안녕하세요 어스틴님.
ftrace_filter에 __kthread_create_on_node와 _do_fork를 추가하여 아래와 같은 워커쓰레드 관련 로그를 얻었습니다.
947 => __kthread_create_on_node+0x18/0x1a8
948 => kthread_create_on_node+0x40/0x5c
949 => create_worker+0xd0/0x1b4
950 => worker_thread+0x3a4/0x5a4
951 => kthread+0x138/0x168
952 => ret_from_fork+0x14/0x28
953 => 0
954 kthreadd-2 [000] .... 1335.755353: _do_fork+0x14/0x434 <-kernel_thread+0x40/0x48
955 kthreadd-2 [000] .... 1335.755373: <stack trace>
956 => _do_fork+0x18/0x434
957 => kernel_thread+0x40/0x48
958 => kthreadd+0x1f4/0x27c
959 => ret_from_fork+0x14/0x28
960 => 0
그런데 제가 얻어보고 싶은 로그는 본 포스트에서 소개하신
=>_do_fork
=>kernel_thread
=>create_kthread
=>kthreadd
---------------
=>__kthread_create_on_node
=>kthread_create_on_node
=>kthread_create
인데요, 요 로그를 얻을 수 있는 방법이 있을까요? -
AustinKim 2021/01/25 21:36 #
이 내용 확인 후 업데이트하겠습니다.
감사합니다. -
AustinKim 2021/01/26 20:56 #
공유해주신 로그는 2단계로 흐름이 분류됩니다.
첫 번째 로그 묶음을 보면요;
947 => __kthread_create_on_node+0x18/0x1a8
948 => kthread_create_on_node+0x40/0x5c
949 => create_worker+0xd0/0x1b4
950 => worker_thread+0x3a4/0x5a4
951 => kthread+0x138/0x168
952 => ret_from_fork+0x14/0x28
953 => 0
kthreadd 프로세스를 깨워서 워커 스레드를 생성해 달라고 요청합니다.
그런데 언급하신 kthread_create() 함수는 아래 선언부와 같이 kthread_create_on_node() 함수로 치환되므로,
https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/kthread.h
#define kthread_create(threadfn, data, namefmt, arg...)
kthread_create_on_node(threadfn, data, NUMA_NO_NODE, namefmt, ##arg)
kthread_create() 함수의 심벌은 존재하지 않습니다. 따라서 ftrace 메시지의 콜 스택에서 kthread_create() 함수를 볼 수 없습니다.
2번째는 kthreadd 스레드가 깨어나는 부분인데요.
954 kthreadd-2 [000] .... 1335.755353: _do_fork+0x14/0x434 <-kernel_thread+0x40/0x48
955 kthreadd-2 [000] .... 1335.755373: <stack trace>
956 => _do_fork+0x18/0x434
957 => kernel_thread+0x40/0x48
958 => kthreadd+0x1f4/0x27c
959 => ret_from_fork+0x14/0x28
960 => 0
이 콜 스택에서 create_kthread() 함수가 보이지 않는데, 그 이유는 create_kthread() 함수에 대한 심벌도 역시 없기 때문입니다.
정리하면, available_filter_functions에 언급하신 함수가 존재하지 않기 때문에 ftrace의 stack trace에서 함수를 볼 수 없는 것입니다. -
HokiMin 2021/01/26 21:07 # 답글
어스틴님 답변 정말 감사합니다!
System.map 파일을 확인해보니까 kthread_create와 create_kthread의 심볼이 없다는 것을 꺠달았습니다.
두 녀석을 ftrace_filter로 설정했을 때 커널 패닉이 일어났었는데
그 원인이 심볼이 없어서였군요. 매크로 이녀석...!
질문하길 정말 잘한 것 같습니다. 속이 후련합니다. 감사합니다. -
AustinKim 2021/01/27 10:50 #
도움이 됐다니 다행입니다.
즐거운 하루 되세요. -
kuokka 2021/09/08 03:17 # 삭제 답글
안녕하세요 Austin님!
저는 이 블로그 글을 자주 보다가 내용이 너무 꼼꼼해서 책까지 2권 다 구매해서 공부 중인 학생입니다.
다름이 아니라 커널 쓰레드라는 단어에 헷갈리는 점이 있어서 댓글 남기게 되었습니다.
책에서 보면 유저 모드에서 생성되면 유저 레벨 프로세스, 커널 모드에서 생성되면 커널 레벨 프로세스라고 하는데
만약 시스템 콜을 사용해서 제가 따로 구현한 어떤 함수(디바이스 드라이버라던지)로 분기된 상태에서
그 함수 내에서 do_fork를 통해 task를 생성하게 되면, 이건 커널 프로세스인가요 유저 프로세스인가요??
너무 헷갈려서 이것 저것 다 검색해봤는데 도저히 맘에 드는 답을 찾을수가 없네요 ㅠㅠ...
책 너무 잘 보고 있고 읽어주셔서 감사합니다! -
AustinKim 2021/09/08 07:41 #
_do_fork() 함수에 어떤 인자를 적용해 호출하느냐에 따라 다를 것 같습니다.
아래는 유저 프로세스를 생성할 때 호출 흐름이고요.
https://elixir.bootlin.com/linux/v4.19.30/source/kernel/fork.c
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
{
return _do_fork(clone_flags, stack_start, stack_size,
parent_tidptr, child_tidptr, 0);
}
sys_clone() 함수에서 do_fork() 함수를 호출하잖아요?
커널 스레드는 아래 kernel_thread() 함수를 호출해 생성합니다.
https://elixir.bootlin.com/linux/v4.19.30/source/kernel/fork.c
pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
{
return _do_fork(flags|CLONE_VM|CLONE_UNTRACED, (unsigned long)fn,
(unsigned long)arg, NULL, NULL, 0);
}
그런데 _do_fork() 함수에 적용되는 인자가 다르죠?
_do_fork() 함수에 적용되는 인자에 따라 유저 프로세스인지 커널 프로세스인지 분간할 수 있겠네요. -
Kuokka 2021/09/08 10:00 # 삭제
아 정말 명확하네요
이렇게나 빠른 답변을 … 정말 감사합니다
써주신 책 잘 읽고 있습니다.
좋은 하루 되세요!! -
AustinKim 2021/09/09 09:46 #
^^ 즐거운 하루 되세요. -
멋부리는 눈의여왕 2022/11/09 07:30 # 답글
안녕하세요. 별거 아닐 수 있는데 궁금해서 질문 드립니다.
__function에서 __의 의미가 커널 내부에서 동작하는 함수라고 하셨는데 rpi-4.19.y/kernel/kthread.c 내의 kthreadd 함수를 보면 15번째 줄엔 set_current_state(TASK_INTERRUPTIBLE);을 호출하고 있고, 18번째 줄엔__set_current_state(TASK_RUNNING)을 호출하는데 같은 함수처럼 보이는데 다르게 호출한 이유가 있을까요? -
멋부리는 눈의여왕 2022/11/09 07:48 #
추가적으로 rpi-4.19.y/kernel/kthread.c 내에서 __kthread_create_on_node함수의 8번째 줄에 struct kthread_create_info *create = kmalloc(sizeof(*create), GFP_KERNEL);로 되어있는데
sizeof(create)로 선언하면 포인터 크기만큼 할당이 되니까 kthread_create_info 사이즈만큼 할당해주려고 sizeof(*create)로 선언한 것 같은데 sizeof(struct kthread_create_info) 이렇게 선언하면 안되나요?
제가 sizeof로 구조체 타입을 넣는건 봤어도 저렇게 포인터가 가리키고 있는 값을 넣은 경우는 처음봐서 해독하는데 이해가 잘 안되서요.
질문을 정리하자면 제 추측으로는 sizeof(struct kthread_create_info)와 sizeof(*create)가 같은 것 같은데, sizeof(*create)로 한 이유가 따로 있을까요? -
AustinKim 2022/11/14 22:43 #
방금 댓글을 확인했습니다. 내일까지 업데이트 드리겠습니다.
감사합니다. -
AustinKim 2022/11/24 11:46 #
질문에 답을 드리면요.
1. __set_current_state와 set_current_state 매크로 함수의 구현부는 다음과 같은데요.
거의 같은 구문으로 구성돼 있습니다.
https://elixir.bootlin.com/linux/v4.19.60/source/include/linux/sched.h
#define __set_current_state(state_value)
do {
WARN_ON_ONCE(is_special_task_state(state_value));
current->task_state_change = _THIS_IP_;
current->state = (state_value);
} while (0)
#define set_current_state(state_value)
do {
WARN_ON_ONCE(is_special_task_state(state_value));
current->task_state_change = _THIS_IP_;
smp_store_mb(current->state, (state_value));
} while (0)
current->state에 프로세스의 상태를 저장하는 구문에서 set_current_state 매크로 함수는 스토어 배리어를 사용합니다. current->state를 저장하는 명령어의 순서가 바뀌지 않도록 처리하는데요.
일반적으로 디바이스 드라이버를 작성하실 때는 set_current_state 매크로를 사용하셔서 프로세스의 상태를 변경하는 것을 권장드립니다.
2. sizeof(struct kthread_create_info)는 말 그대로 구조체의 사이즈를 체크하기 위한 구문입니다. 구조체의 사이즈를 체크하는 목적이라면 어느 코드를 사용해도 무방합니다.
즐거운 하루 보내세요.
최근 덧글