Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

46107
469
422678


[리눅스커널] 프로세스: thread_info 구조체란? 4. 프로세스(Process) 관리

지금까지 프로세스 속성을 관리하는 자료구조인 태스크 디스크립터를 배웠습니다. 커널에서는 태스크 디스크립터뿐만 아니라 thread_info 구조체로 프로세스 실행 동작을 관리합니다. 추가로 커널에서는 프로세스의 세부 실행 정보를 저장하거나 로딩하는 자료구조가 필요한데 이를 thread_info 구조체에서 관리합니다.

thread_info 구조체는 다음과 같은 프로세스의 핵심 실행 정보를 저장합니다.

선점 스케줄링 실행 여부
시그널 전달 여부 
인터럽트 컨텍스트와 Soft IRQ 컨텍스트 상태
휴면 상태로 진입하기 직전 레지스터 세트를 로딩 및 백업

* 유튜브 강의 동영상도 있으니 같이 들으시면 좋습니다. 




#프로세스

프로세스 소개 
프로세스 확인하기  
프로세스는 어떻게 생성할까?  
유저 레벨 프로세스 실행 실습  
커널 스레드  
커널 내부 프로세스의 생성 과정   
프로세스의 종료 과정 분석  
   * 프로세스 종료 흐름 파악    
   * do_exit() 함수 분석   
   * do_task_dead() 함수 분석   
   * do_task_dead() 함수를 호출하고 난 후의 동작    
태스크 디스크립터(task_struct 구조체)  
   * 프로세스를 식별하는 필드   
   * 프로세스 상태 저장   
   * 프로세스 간의 관계   
   * 프로세스 연결 리스트   
   * 프로세스 실행 시각 정보   
스레드 정보: thread_info 구조체  
   * thread_info 구조체란?   
   * thread_info 구조체 분석    
   * thread_info 구조체의 주소 위치는 어디일까?  
   * 컨텍스트 정보 상세 분석    
      ** 인터럽트 컨텍스트 실행 정보 저장  
      ** Soft IRQ 컨텍스트 실행 정보 저장  
      ** 선점 스케줄링 여부 확인    
   * cpu 필드에 대한 상세 분석   
   * thread_info 구조체 초기화 코드 분석   
프로세스의 태스크 디스크립터에 접근하는 매크로 함수  
   * current 매크로란?   
   * current_thread_info() 매크로 함수 분석   
프로세스 디버깅  
   * glibc의 fork() 함수를 gdb로 디버깅하기  
   * 리눅스 유틸리티 프로그램을 이용한 실행 추적   

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

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

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



핑백

덧글

  • ragingsoul 2021/11/13 11:24 # 삭제 답글

    안녕하세요 해당 책 독자입니다. 232페이지에 새 프로세스를 이닛 테스트인포 구조체에 추가하는 것을 테레이스32로 분석한 로그가 나오는데요,
    ...
    (struct list_head) [D:0xA1A174C8] tasks = (
    (struct list_head*) [D:0xA1A174E8] next = 0xA1618310 -> (
    (struct list_head*) [D: 0xA1618330] next = 0xB1618A70
    ...
    init_task.tasks.next를 0xA1618310으로 대입하지만,
    실제 다음 프로세스의 tasks.next의 주소는 0xA1618330,
    즉 32비트 뒤의 값인것으로 보이는데요,
    이는 init_task의 tasks.next가 tasks 변수보다 32비트 뒤에 있는것과 같아보이는데,
    즉, tasks.next는 다음 프로세스의 tasks.next를 가리키는 것이 아니라
    tasks를 가리키는 것이 아닌가 생각했는데요,
    그 다음 페이지의 설명을 보니 tasks.next는 다음 프로세스의 tasks.next를 가리킨다고 나와있어서 조금 혼란스러운 상태입니다.
    제가 놓친부분이나 잘못 이해한 부분을 알려주셨으면 합니다.
  • AustinKim 2021/11/13 20:31 #

    T32 출력 결과를 정말로 세세하고 정밀하게 분석하셨는데요.
    자세히 분석하니 T32 출력 결과에 오타가 있네요.

    책에 표기된 아래 출력 결과는 아래와 같은데,

    04 (struct sched_info) [D:0xA1A174A8] sched_info = ((long unsigned int) pcount = 0,
    05 (struct list_head) [D:0xA1A174C8] tasks = (
    06 (struct list_head *) [D:0xA1A174E8] next = 0xA1618310 -> (
    07 (struct list_head *) [D:0xA1618330] next = 0xB1618A70,
    08 (struct list_head *) [D:0xA1618334] prev = 0xA1A174E8),
    09 (struct list_head *) [D: 0xA1A174CC] prev = 0xA7778330),

    다음과 같이 변경돼야 합니다.

    04 (struct sched_info) [D:0xA1A174A8] sched_info = ((long unsigned int) pcount = 0,
    05 (struct list_head) [D:0xA1A174C8] tasks = (
    06 (struct list_head *) [D:0xA1A174C8] next = 0xA1618310 -> (
    07 (struct list_head *) [D:0xA1618310] next = 0xB1618A70,
    08 (struct list_head *) [D:0xA1618314] prev = 0xA1A174E8),
    09 (struct list_head *) [D: 0xA1A174CC] prev = 0xA7778330),

    07번째 줄에 보이는 주소가 D:0xA1618330에서 D:0xA1618310로 출력돼야 합니다.
    출력 결과에 대한 오타는 3쇄에 반영토록 진행하겠구요, 질문 주셔서 감사합니다.

    아래는 제가 갖고 있는 다른 램덤프에서 확인한 init_task의 출력 결과이니 참고하세요.

    (static struct task_struct) [D:0xC1711300] init_task = (
    (long int) [D:0xC1711300] state = 0,
    (void *) [D:0xC1711304] stack = 0xC1700000,
    (atomic_t) [D:0xC1711308] usage = ((int) [D:0xC1711308] counter = 2),
    ...
    (struct sched_info) [D:0xC1711700] sched_info = ((long unsigned int) [D:0xC1711700] pcount = 0,
    (struct list_head) [D:0xC1711720] tasks = (
    (struct list_head *) [D:0xC1711720] next = 0xE5CB0420 -> (
    (struct list_head *) [D:0xE5CB0420] next = 0xE5CB3420,
    (struct list_head *) [D:0xE5CB0424] prev = 0xC1711720),
    (struct list_head *) [D:0xC1711724] prev = 0xD1FA8420),
    (struct plist_node) [D:0xC1711728] pushable_tasks = ((int) [D:0xC1711728] prio = 140, (struct li

    감사합니다.
  • ragingsoul 2021/11/14 23:15 # 삭제

    친절한 답변 감사드립니다! 답글의 설명을 읽으니 바로 이해가 됐습니다
    해당 책을 읽으면서 정말 많은것을 배우고 있습니다, 감사합니다^^
댓글 입력 영역