Guillermo Austin Kim
Posts
998 posts[리눅스커널] 프로세스: struct thread_info 구조체 주소 위치는 어디일까?
struct thread_info 구조체 필드에 대해 소개했습니다. 이어서 이 구조체가 어느 위치에 있는지 알아볼까요? 프로세스 스택에서 struct thread_info 구조체 위치 확인하기struct thread_info 구조체는 프로세스 세부 실행 속성 정보를 담고 있으며 프로세스 마다 1개씩 존재합니다. 다음 그림을 보면서 struct thread_info 구조체 위치를 알아볼까요? [그림 4.15] 프로세스 스택에서 struct thread_info 구조체 위치 위 그림에서 프로세스 스택 최상단 주소는 0x80C00000 그리고 스택 최하단 주소는 0x80C02000입니다. 그런데 struct thread_info 구조체 주소는 위 그림과 같이 프로세스 스택 최상단 주소인 0x8
[리눅스커널] 프로세스: struct thread_info 구조체 분석하기
struct thread_info 구조체는 프로세스 실행 흐름을 관리하는 중요한 정보를 저장합니다. 프로세스 스케줄링 실행 시 이전에 실행했던 레지스터 정보와 프로세스 컨택스트 정보를 이 구조체 필드에서 확인할 수 있습니다. struct thread_info 구조체 선언부 분석하기struct thread_info 구조체 선언부를 볼까요? [https://github.com/raspberrypi/linux/blob/rpi-4.19.y/arch/arm/include/asm/thread_info.h]struct thread_info { unsigned long flags; /* low level flags */ int preempt_count; /* 0 => preemptable, <0 =&g
[리눅스커널] 프로세스: current 매크로란
이제껏 알아봤듯 프로세스 속성 정보를 관리하는 struct task_struct 타입인 태스크 디스크립터는 커널에서 가장 중요하게 관리하는 자료구조입니다. 여기에는 그럴만한 이유가 있습니다. 커널은 태스크 디스크립터에 접근해 프로세스 정보를 수시로 접근하고 저장한다. 태스크 디스크립터에 속성 정보로 함수 실행 흐름이 바뀐다. 그렇다보니 다음 요건을 충족하는 태스크 디스크립터 주소에 접근하는 매크로 코드가 있으면 좋겠다고 생각합니다. 간단한 형태의 코드 시스템에 부하를 주지 않는 코드 커널에서는 이런 요구 사항을 만족하는 매크로를 제공하는데 이를 current 매크로라고 부릅니다. current 매크로는 현재 구동 중인 프로세스의 태스크 디스크립터 주소을 알려줍니다.
[리눅스커널] 프로세스: do_task_dead() 함수 분석하기
do_task_dead() 함수 분석하기이어서 do_task_dead() 함수 코드를 분석하겠습니다.[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/kernel/sched/core.c]01 void __noreturn do_task_dead(void)02 {03 set_special_state(TASK_DEAD);04 current->flags |= PF_NOFREEZE;05 06 __schedule(false);07 BUG();08 for (;;)09 cpu_relax();10 } 03 번째 줄 코드에서 set_special_state() 함수를 호출해 프로세스 상태를 TASK_DEAD 플래그로 바꿉니다. 04 번째 줄에서는 프로세스 태스
[리눅스커널] 스케줄링: struct sched_info 구조체 알아보기
struct sched_info 구조체는 프로세스의 스케줄링 동작 세부 정보를 저장하며 실체는 다음과 같습니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/sched.h] struct sched_info {#ifdef CONFIG_SCHED_INFO /* Cumulative counters: */ /* # of times we have run on this CPU: */ unsigned long pcount; /* Time spent waiting on a runqueue: */ unsigned long long run_delay; /* Timestamps: */ /* When did we last run on a CP



