런큐에 CFS 스케쥴러로 큐잉된 상태로 기다리는 프로세스 목록은 어디서 찾을 수 있을까요?
per-cpu 타입의 runqueues.cfs_tasks 멤버를 찾으면 됩니다.
다음은 CPU4 runqueue의 예시입니다.
(struct rq *) [-] (struct rq*)(((void*)&runqueues)+__per_cpu_offset[4]) = 0xFFFFFFC73E0F2900 -> (
(raw_spinlock_t) [D:0xFFFFFFC73E0F2900] lock = ((arch_spinlock_t) [D:0xFFFFFFC73E0F2900] raw_lock = ((u16) [D:0xFFFF
(unsigned int) [D:0xFFFFFFC73E0F2918] nr_running = 0x3,
//...
(int) [D:0xFFFFFFC73E0F3298] cpu = 0x4,
(int) [D:0xFFFFFFC73E0F329C] online = 0x1,
(struct list_head) [D:0xFFFFFFC73E0F32A0] cfs_tasks = (
(struct list_head *) [D:0xFFFFFFC73E0F32A0] next = 0xFFFFFFC67B0CE9A8 -> (
(struct list_head *) [D:0xFFFFFFC67B0CE9A8] next = 0xFFFFFFC73E0F32A0,
(struct list_head *) [D:0xFFFFFFC67B0CE9B0] prev = 0xFFFFFFC73E0F32A0),
(struct list_head *) [D:0xFFFFFFC73E0F32A8] prev = 0xFFFFFFC67B0CE9A8),
runqueues.cfs_tasks.next는 해당 프로세스의 struct task_struct,se.group_node 멤버로 등록돼 있습니다.
따라서 다음 커맨드를 입력하면 프로세스 태스크 디스크립터 주소를 알아낼 수 있습니다.
(struct task_struct *) container_of(0xFFFFFFC67B0CE9A8, struct task_struct,se.group_node) = 0xFFFFFFC67B0CE900 -> (
(struct thread_info) thread_info = ((long unsigned int) flags = 0x00400000, (mm_segment_t) addr_limit = 0x0000008000000000, (int) pre
(long int) state = 0x0,
(void *) stack = 0xFFFFFFC6A295C000,
//...
(struct cred *) ptracer_cred = 0x0,
(struct cred *) real_cred = 0xFFFFFFC72D06E180,
(struct cred *) cred = 0xFFFFFFC72D06E180,
(char [16]) comm = "visualizer capt",
'[Debugging] Tips' 카테고리의 다른 글
[Best][Kernel][Stability] 스택 오염(Stack Corruption) 디버깅 (0) | 2023.05.04 |
---|---|
[Kernel] wakelock debug patch (0) | 2023.05.04 |
[Trace32] 폰트 색상 변경 - setup.color (0) | 2023.05.04 |
[리눅스커널][Trace32] wakelock 디버깅 - container_of (0) | 2023.05.04 |
[안드로이드][리눅스커널] 시그널 - 유저 공간 abort(SIGABRT) 시 동작 시 흐름 (0) | 2023.05.04 |