Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

74261
1501
219116


[리눅스커널] 프로세스 태스트 디스크립터 디버깅: 스레드와 스레드 그룹 4. 프로세스(Process) 관리

T32로 프로세스 목록을 보면 다음과 같이 계층 구조를 볼 수 있다.
magic___|___command_________|#thr|state_____|spaceid|pids_|
C1A171B8|   swapper/0       | 420|current   | 0000  | 0. 2. 3. 5. 6. 7. 8. 9. 10
F1618000|   init            | -  |sleeping  | 0001  | 1.
E9AF8740|   ueventd         | -  |sleeping  | 01D0  | 464.
E9AFAB80|   logd            | 7. |sleeping  | 0208  | 520.
E9AFC140|      logd.daemon  |    |sleeping  |       | 524.
E9AFC880|      logd.reader  |    |sleeping  |       | 525.
E9AFCFC0|      logd.writer  |    |sleeping  |       | 526.
E9AFD700|      logd.control |    |sleeping  |       | 527.
DEED8740|      logd.reader.p|    |sleeping  |       | 25232.
DA61CFC0|      logd.reader.p|    |sleeping  |       | 10190.

logd는 스레드 그룹 리더이고 logd.daemon부터 logd.reader.p는 스레드 그룹에 속한 스레드들이다.

먼저 logd 스레드 그룹 리더의 태스크 디스크립터를 보자.
  (struct task_struct *) (struct task_struct*)0xE9AFAB80 = 0xE9AFAB80 =  -> (
    (long int) state = 1 = 0x1 = '....',
    (void *) stack = 0xEA5F8000 =  -> ,
    (atomic_t) usage = ((int) counter = 2 = 0x2 = '....'),
    (unsigned int) flags = 4210944 = 0x00404100 = '.@A.',
...
    (pid_t) pid = 520 = 0x0208 = '....',
    (pid_t) tgid = 520 = 0x0208 = '....',
...
    (struct list_head) thread_group = (
      (struct list_head *) next = 0xE9AFC56C 
        (struct list_head *) next = 0xE9AFCCAC 
          (struct list_head *) next = 0xE9AFD3EC 
            (struct list_head *) next = 0xE9AFDB2C  
              (struct list_head *) next = 0xDEED8B6C

역시나 pid와 스레드 그룹 아이디가 520으로 같고 thread_group이란 연결 리스트 해드에 여러 연결 리스트가 연결돼있다.

thread_group.next에는 0xE9AFC56C 주소를 볼 수 있는데 이는 스레드 그룹에 등록된 스레드의 struct task_struct.thread_group 멤버가 위치한 주소를 의미한다.

struct task_struct 구조체에서 thread_group이란 멤버가 위치한 주소 오프셋은 0x42C이니 다음 계산식으로 0xE9AFC140가 스레드 태스크 디스크립터 주소이다.
0xE9AFC140 = 0xE9AFC56C-0x42C

0xE9AFC140 주소를 struct task_struct 구조체로 캐스팅해서 보자.
v.v %all %l (struct task_struct*)0xE9AFC140
  (struct task_struct *) [-] (struct task_struct*)0xE9AFC140 = 0xE9AFC140 -> (
    (long int) [D:0xE9AFC140] state = 1 = 0x1,
    (void *) [D:0xE9AFC144] stack = 0xE8F3A000,
    (atomic_t) [D:0xE9AFC148] usage = ((int) [D:0xE9AFC148] counter = 2 = 0x2),
    (unsigned int) [D:0xE9AFC14C] flags = 1077952576 = 0x40404040,
    (unsigned int) [D:0xE9AFC150] ptrace = 0 = 0x0,
...
    (pid_t) [D:0xE9AFC510] pid = 524 = 0x020C,
    (pid_t) [D:0xE9AFC514] tgid = 520 = 0x0208,
...
    (struct list_head) [D:0xE9AFC56C] thread_group = (
      (struct list_head *) [D:0xE9AFC56C] next = 0xE9AFCCAC,
      (struct list_head *) [D:0xE9AFC570] prev = 0xE9AFAFAC),

0xE9AFC56C 주소에 thread_group 멤버가 위치해있다.

또한 이 스레드의 pid는 524이고 스레드 그룹 리더의 pid는 520이다.

리마인드를 위해  logd 스레드 그룹 리더의 태스크 디스크립터 thread_group.next가 가르키는 주소를 다시 보자. 역시 0xE9AFC56C 주소를 저장하고 있다.
  (struct task_struct *) (struct task_struct*)0xE9AFAB80 = 0xE9AFAB80 =  -> (
    (long int) state = 1 = 0x1 = '....',
    (void *) stack = 0xEA5F8000 =  -> ,
    (atomic_t) usage = ((int) counter = 2 = 0x2 = '....'),
    (unsigned int) flags = 4210944 = 0x00404100 = '.@A.',
...
    (pid_t) pid = 520 = 0x0208 = '....',
    (pid_t) tgid = 520 = 0x0208 = '....',
...
    (struct list_head) thread_group = (
      (struct list_head *) next = 0xE9AFC56C 
        (struct list_head *) next = 0xE9AFCCAC 
          (struct list_head *) next = 0xE9AFD3EC 
            (struct list_head *) next = 0xE9AFDB2C  
              (struct list_head *) next = 0xDEED8B6C

덧글

댓글 입력 영역