Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

38107
469
422670


[리눅스커널] 프로세스: 유저 프로그램 실행 흐름 추적하기 4. 프로세스(Process) 관리

이번 장에서는 유저 공간에서 fork() 시스템 콜 함수를 호출하면 유저 프로세스가 실행된다고 설명한 바 있습니다. 그런데 유저 프로세스를 생성하는 목적은 크게 다음과 같은 두 가지로 분류할 수 있습니다.

fork() 시스템 콜 함수를 호출해 같은 미션의 프로그램을 여러 프로세스가 나눠서 실행
exev() 시스템 콜 함수로 아예 새로운 프로그램을 생성해서 실행

우리가 리눅스 시스템 프로그램으로 프로세스를 생성할 때는 대부분 첫 번째 방식을 사용합니다. 그래서 이번 장에서는 첫 번째 방법에 초점을 맞춰 유저 프로세스의 생성 과정을 설명한 것입니다. 하지만 두 번째 방식으로 유저 프로세스를 실행할 때가 있습니다. 이미 만들어 놓은 프로그램 파일을 실행하고 싶을 때입니다. 그래서 이번에 디버깅 실습으로 두 번째 방식으로 유저 프로세스가 실행되는 과정을 알아보겠습니다.

#프로세스

프로세스 소개 
프로세스 확인하기  
프로세스는 어떻게 생성할까?  
유저 레벨 프로세스 실행 실습  
커널 스레드  
커널 내부 프로세스의 생성 과정   
프로세스의 종료 과정 분석  
태스크 디스크립터(task_struct 구조체)  
스레드 정보: thread_info 구조체  
프로세스의 태스크 디스크립터에 접근하는 매크로 함수  
프로세스 디버깅  
   * glibc의 fork() 함수를 gdb로 디버깅하기  


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 
repository:
http://rousalome.egloos.com/10025060


핑백

덧글

  • 잔망스러운 얼음집 2020/09/11 15:38 # 답글


    아래와 같이 filter 지정시에 invalid argument 라고 뜹니다.
    무엇이 문제 일까요?

    root@raspberrypi:/home/pi/test # echo sys_clone do_exit search_binary_handler copy_process.part.5 > /sys/kernel/debug/tracing/set_ftrace_filter

    bash: echo: write error: Invalid argument
  • AustinKim 2020/09/11 18:58 #

    copy_process() 함수는 static 타입이라 컴파일러가 심벌 이름에 라벨링을 해 copy_process.part.5 혹은 copy_process.part.3 로 심벌을 생성합니다.

    다음과 같이 지정해보시겠어요?

    echo sys_clone do_exit search_binary_handler copy_process* > /sys/kernel/debug/tracing/set_ftrace_filter

    copy_process.part.5 이름을 copy_process* 바꿔서 지정하면 됩니다.
    참고로 copy_process 함수 끝 부분에 *기호를 붙히면 copy_process 이름의 심벌에 해당하는 함수를 모두
    /sys/kernel/debug/tracing/set_ftrace_filter 에 지정합니다.
  • 공부중입니다. 2020/12/21 20:38 # 삭제 답글

    안녕하세요. 지금 다른 보드, 안드로이드로 이 책을 적용 시켜가면서 공부 중입니다.
    arm64 기반의 보드인지라 크로스 컴파일을 하여 실행시켜 보고자 하였는데 . 안드로이드라서 그런건지 실행이 안되더라구요. 그래서 ndk로 빌드하여 실행파일을 사용하여서 ftrace 로그를 보는 중입니다.
    지금 여러개의 궁금한 점이 생겼는데
    1. 저는 태스크 이름이 <...> 이런 것이 생겼습니다. 한두개가 아니고 좀 많습니다. pid를 보면 태스크 이름이 유추가 가능한데 <...>라는 게 왜 나오는 지 아시나요? 단순히 의미없이 이렇게 나오는 건 아니지 않을 까 해서 여쭤 봅니다.
    2. 태스크이름이 sh pid는 6803이라고 나오다가 갑자기 태스크이름이 raspbian_proc pid가 6803으로 바뀌더라구요. 중간에 do_exit 이런것도 없이. 혹시 이것은 제가 do_exit을 trace 지정안해서그런건지 한 번 확인해 보겠습니다.
    3. 저는 ftrace 로그가 5초정도에 5만줄 정도 나옵니다 . 정상인것일까요?
    4. 혹시 ndk로 빌드한 실행파일로 ftrace를 한다면 ftrace로그 값이 많이 다르게 나올까요? (저는 책하고 다르게 stack trace가 거의 안 나옵니다.)

    너무 뭉뜽그려서 질문드려서 죄송합니다. 저도 사실 아직 이해가 되지 않는 부분이 많아 제가 뭘 모르고 뭘 질문해야 할지 어려워서 책을 열심히 봐보려고 노력중입니다. 감사합니다
  • AustinKim 2020/12/21 21:01 #

    문의 주신 내용에 대해 답신 드립니다.

    1. 네, 맞습니다. 원래 available_filter_functions 파일에 있는 함수 심벌(copy_process.isra.62.part.63)로 등록하면 됩니다.
    2. 아래 언급하신 ftrace 로그를 제 이메일로 보내주실 수 있나요?
    '태스크이름이 sh pid는 6803이라고 나오다가 갑자기 태스크이름이 raspbian_proc pid가 6803으로 바뀌더라구요'

    이메일 주소: austindh.kim@gmail.com

    메일을 주시면 ftrace 메시지를 보고 블로그에 분석 내용을 포스팅해 드리겠습니다.
    감사합니다.
  • AustinKim 2020/12/21 21:03 #

    메일로 주실 때는 ftrace 로그의 용량이 클 지 모르니, 되도록 압축해서 보내주세요.
    감사합니다.
  • 공부중입니다. 2020/12/21 20:43 # 삭제 답글

    5. available_filter_functions에서 저는 copy_process라는 것이 없고 copy_process.isra.62.part.63라는 것만 있어서 바꾸어서 sh 스크립트를 만들었는데요. 맞게 한 것 일까요?
댓글 입력 영역