IT/Linux Kernel 30

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 30 - Soft IRQ 처리 시점 확인

안녕하세요. Soft IRQ 이어서 확인해 보겠습니다. 어떤 프로세스가 언제 처리하는지 확인하는 내용입니다. 1. Soft IRQ 서비스 실행 요청 점검 이전 내용을 확인하면, Soft IRQ 서비스는 인터럽트 핸들링을 마무리한 후 처리했고 커널에서 인터럽트 처리를 시작하고 종료하는 __handle_domain_irq() 함수를 보면 내용을 확인할 수 있었습니다. __handle_domain_irq() 내에서 generic_handle_irq() 함수 호출(인터럽트 핸들러) 처리를 마치고 irq_exit() 함수를 호출합니다. 바로 Soft IRQ 서비스를 처리하는 시작점이라고 볼 수 있습니다. 1) irq_exit() 함수 확인 Soft IRQ 서비스 실행의 시작점인 내용으로 생각하고 확..

IT/Linux Kernel 2025.06.24

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 29 - Soft IRQ 요청 시점 확인

안녕하세요. Soft IRQ를 이어서 언제 요청하는지 대해서 좀 더 확인해보려고 합니다. 1. Soft IRQ 서비스 요청의 전체 흐름 전체 흐름을 보면서 Soft IRQ 서비스 요청하는 시점을 알아보겠습니다. 아래 그림은 Soft IRQ 서비스 요청 시의 자료구조입니다. 인터럽트 핸들러나 인터럽트 핸들러 서브루틴에서 호출하는 함수의 동작의미 합니다. __raise_softirq_irqoff는 Soft IRQ 서비스를 요청하는 동작을 하며, or_softirq_pending 함수로 irq_stat[cpu].__softirq_pending에 Soft IRQ 서비스 비트를 활성화하는 역할을 합니다. irq_stat는 배열이 percpu 타입의 변수로 CPU 코어의 개수만큼 존재합니다. ..

IT/Linux Kernel 2025.06.19

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 28 - Soft IRQ 서비스 확인

안녕하세요. IRQ 스레드를 끝내고 Soft IRQ에 대해서 확인해 보겠습니다. 책 내용이 많아서 내용은 요약정도로 정리하고 실습하는 내용으로 조금 빠르게 진행해 보겠습니다. 1. Soft IRQ 서비스 Soft IRQ 실행한다 의미는 Soft IRQ 서비스를 요청을 받아 이를 처리하는 과정이라고 볼 수 있습니다. 1) Soft IRQ 서비스 소개 리눅스 커널에서 10가지 정도의 Soft IRQ 서비스를 지원합니다. linux# vim kernel/softirq.c 우선순위Soft IRQ 서비스설 명0HI_SOFTIRQ가장 우선 순위가 높으며 TASKET_HI로 적용1TIMER_SOFTIRQ동적 타이머 사용2NET_TX_SOFTIRQ네트워크 패킷 송신용으로 사용3NET_RX_SOFTIRQ..

IT/Linux Kernel 2025.06.17

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 27 - IRQ 스레드 디버깅 실습

안녕하세요. 이번에는 이전 글에 본 IRQ 스레드에 대해서 라즈베리 파이에서 디버깅을 하는 내용입니다. 1. ftrace를 이용한 IRQ 스레드 동작 확인 1) IRQ 스레드를 확인하기 위한 ftrace 설정 아래 내용으로 셀 스크립트를 만들어 저장합니다. 중요한 부분만 보면echo bcm2835_mmc_thread_irq bcm2835_mmc_irq > /sys/kernel/debug/tracing/set_ftrace_filter bcm2835_mmc_thread_irq() 함수와 bcm2835_mmc_irq() 함수에 대해 set_ftrace_filter에 저장합니다. echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enablee..

IT/Linux Kernel 2025.06.13

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 26 - IRQ 스레드 생성 설명

안녕하세요. IRQ 스레드를 실행하려면 IRQ 스레드를 생성해야 합니다. 생성하는 과정과 관련 코드를 확인해 보겠습니다. 1. IRQ 스레드 생성 흐름 디바이스 드라이버의 초기화 코드는 대부분 부팅 과정에서 실행되며, 이 과정에서 request_threaded_irq() 함수를 호출해 IRQ 스레드를 생성합니다. IRQ 스레드는 생성된 후 시스템 전원이 공급돼 동작하는 동안 해당 인터럽트 후반부를 처리하는 기능을 수행합니다. IRQ 스레드의 생성흐름은 아래와 같습니다. 여기서 kthread_create(), kthread_create_on_node() 함수 이해를 위해 호출하는 것처럼 표현한 것이고 실제는 치환되는 것입니다. request_thread_irq() 함수를 호출하면 (1) 전달..

IT/Linux Kernel 2025.06.10

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 25 - 인터럽트 후반부 처리와 IRQ 스레드(Threaded IRQ) 설명

안녕하세요. 조금 긴 인터럽트 장을 끝냈고, 이번 장은 인터럽트 후반부 처리에 대한 내용을 확인합니다. 이 장도 양이 많기 때문에, 보면서 테스트하는데 시간이 좀 걸릴 것으로 생각됩니다. 1. 인터럽트 후반 처리에 대해서 인터럽트 핸들러는 짧고 간결하게 코드가 실행돼야 하기 때문에, 급하게 처리하지 않아도 되는 일은 조금 후에 처리한다는 기법입니다. 인터럽트가 발생했을 때 빨리 실행할 코드(인터럽트 핸들러 및 인터럽트), 실시간으로 빨리 실행하지 않아도 되는 코드(인터럽트 후반부 기법)로 나눌 수 있습니다. 1) Top Half/Bottom Half 란? 전문용어가 나 올 수가 있어서 확인해 보면, 인터럽트가 발생한 후 빨리 처리해야 하는 일은 Top Half(인터럽트가 하는 일), 조금 있다..

IT/Linux Kernel 2025.06.06

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 24 - 인터럽트 디버깅

안녕하세요. 이전 인터럽트 내용들을 복습 및 간단한 인터럽트 디버깅으로 이렇게 하는 것이구나 확인하는 시간으로 생각하면 될 듯합니다. 1. /proc/interrupts 확인 이전 글에서도 /proc/interrupts를 통해서 인터럽트 발생종류를 확인했습니다. 이 파일을 읽을 때 어느 코드가 실행되면서 인터럽트의 정보를 출력하는지 확인해 보겠습니다. 출력하면, 인터럽트 번호, 인터럽트 이름, CPU별 인터럽트가 발생한 횟수를 알 수 있습니다. pi# cat /proc/interrupts 가장 왼쪽 숫자 17 이 인터럽트 번호이며, CPU별로 인터럽트 횟수가 나오고 인터럽트 식별방식(Level, Edge-High(High나 Low로 올라가거나 내려갈 때 발생판단)) 인터럽트 이름으로 되어 ..

IT/Linux Kernel 2025.06.04

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 23 - 인터럽트는 비활성화할 시점 확인

안녕하세요. 인터럽트가 발생하는 보았는데, 조금 다르게 중요한 작업을 하고 있을 때는 인터럽트가 발생하면 안 되는 상황도 있습니다. 이 부분에 대해서 확인해 보겠습니다. 1. 인터럽트가 발생하면 안 되는 상황 인터럽트는 보통 백그라운드에서도 계속 발생합니다. 그렇기 때문에 디바이스 드라이버를 개발하다 보면 특정 상황에서는 발생하면 안 되는 조건이 있습니다. (1) SoC에서 정의한 하드웨어 블록에 정확한 시퀀스를 줘야 할 경우(2) 시스템이 유휴 상태에 진입하기 직전의 시스템의 상태 정보 값을 저장하는 동작(3) 각 디바이스 드라이버가 서스펜드 모드로 진입할 때 디바이스 드라이버에 데이터 시트에서 명시한 대로 정확한 특정 시퀀스를 줘야 할 경우(4) 예외가 발생해서 시스템 리셋을 시키기 전 종합..

IT/Linux Kernel 2025.05.30

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 22 - 인터럽트 핸들러 등록 과정 분석

안녕하세요. 인터럽트가 발생했을 때 인터럽트 핸들러(함수)가 호출되기 위해서는, 먼저 디바이스 드라이버 코드에서 해당 인터럽트를 초기화했는지 확인하고 인터럽트 발생한 후 처리하는 것이 필요합니다. 이번 내용은 인터럽트 핸들러를 등록하는 방법과 이를 검증하는 내용입니다. 1. 인터럽트 핸들러의 등록과정 분석 인터럽트가 발생한 후 지정한 인터럽터 핸들러가 호출되려면 먼저 인터럽트 핸들러를 등록해야 합니다. 인터럽트 핸들러의 등록은 인터럽트를 초기화하는 과정이 포함되어 있습니다. 인터럽트 초기화하는 과정에서 호출하는 request_irq() 함수를 확인해 보겠습니다. linux# vim include/linux/interrupt.h 선언부는 아래와 같고 인터럽트를 제대로 등록하면 true, 오류..

IT/Linux Kernel 2025.05.28

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 21 - in_interrupt() 함수

안녕하세요. 이전 내용에서 인터럽트와 인터럽트 컨텍스트에 대해서 확인했습니다. 이번에는 인터럽트 컨텍스트 구간인지 어떻게 알 수 있는지 확인합니다. 1. in_interrupt() 함수란? 결론적으로 말하면, 인터럽트 컨텍스트 구간이면 in_interrupt() 함수는 true를 반대면 false를 반환하는 함수입니다. 이 함수를 알고 있어야 하는 이유는 커널 코드 내에서는 수많은 함수를 호출되므로 함수 호출 흐름을 파악하기가 어렵습니다. 그렇기 때문에 커널 혹은 드라이버 코드에서 인터럽트 컨텍스트에서 실행 중인지 알기가 어렵습니다. 다시 인터럽트 컨텍스트에서 실행 중인지 확인이 필요한지 의문이 생깁니다. 그것은 인터럽트 서비스 루틴은 실행 중인 프로세스를 멈추고 동작하기 때문에, 커널 혹은 드..

IT/Linux Kernel 2025.05.20

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 20 - 인터럽트(interrupt), 인터럽트 컨텍스트란?

안녕하세요. 프로세스에 관한 내용을 지나 5장 인터럽트 내용으로 왔습니다. 인터럽터가 OS에 중요한 부분을 차지하고 있으니 5, 6장에 걸쳐 소개하고 있습니다. 천천히 책 내용을 따라가 보겠습니다. 진도가 너무 느려져서, 요약하면서 조금 빠르게 진행해 보도록 하겠습니다. 1. 인터럽트 소개 인터럽터라는 단어 자체는 생활에서도 사용하고 있는 용어입니다. 끼어들다는 말로 사용하고 있습니다. 대화를 하는 중에 다른 사람이 와서 끼어들기도 하고 공부하는 중에 전화가 온다던지 이상생활에서 인터럽트가 발생합니다. 실제적으로 컴퓨터 입장에서 인터럽터를 확인해 보겠습니다. 1) 하드웨어 관점의 인터럽트 하드웨어 관정에서 인터럽트란 하드웨어의 변화를 감지해서 외부 입력으로 전달되는 전기 신호입니다. 예를 들..

IT/Linux Kernel 2025.05.13

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 19 - 리눅스 유틸리티 프로그램을 이용해한 실행 추적(whoami)

안녕하세요. 이번 글은 ftrace를 이용해서 whoami 유틸리티 프로그램을 간단하게 추적해 보는 것입니다. 이미 ftrace는 이전 내용을 보셨다면 어렵지 않게 따라 할 수 있을 것입니다. 유저 공간에서 fork() 시스템 콜 함수를 호출하면 유저 프로세스가 실행된다고 이미 알고 있을 것입니다. 그런데 유저 프로세스를 생성하는 목적은 크게 2가지로 분류할 수 있습니다. - fork() 시스템 콜 함수로 호출해 같은 작업을 프로그램을 여러 프로세스가 나눠서 실행 - exec() 시스템 콜 함수로 새로운 프로그램을 생성해서 실행 보통 첫 번째 방법을 대부분 방식을 이용하지만 이번에는 두 번째 방법인 이미 만들어 놓은 프로그램 파일을 실행할 때를 알아보겠습니다. 1. ftrace 로그 설정 ..

IT/Linux Kernel 2025.05.06

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 18 - 프로세스 디버깅, gdb로 glibc 디버깅

안녕하세요. 책에서 부분 분량이 조금 있다 보니, 글에 다 담기는 어려울 것으로 생각됩니다. 그래서 필요하다고 생각하는 부분을 요약해 보았습니다. 1. glibc의 fork() 함수를 gdb로 디버깅 1) 실습을 위한 예제 코드작성 프로세스 디버깅하기 위한 app 소스코드에 fork() 함수한 새로운 프로세스를 생성해서 부모 프로세스와 자식 프로세스로 만들어 확인합니다. 코드는 핵심적인 부분만 확인하겠습니다. 전체 소스코드는 글 마지막에 첨부했습니다. 26번 줄에서 fork() 함수를 호출해 반환값을 pid에 저장합니다. pid가 0이면 자식프로세스로 0보다 크면 부모 프로세스가 생성되었다고 판단합니다. fork() 함수 실행 시 오류가 발생하면 -1을 반환합니다. Makefile을 만..

IT/Linux Kernel 2025.04.30

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 17 - 태스크 디스크립터(task_struct) 접근 매크로 함수(current)

안녕하세요. 이전 글에서는 프로세스를 관리하는 자료 구조로 task_struct, thread_info 구조체를 확인했습니다. 커널 입장에서는 프로세스 속성 정보가 있는 이 구조체에 자주 접근해서 프로세스를 처리가 필요합니다. 그런데 디바이스 드라이버 코드에서는 이 구조체에 접근하지 못하게 하고 있으나 매크로 함수(current_thread_info(), current)로 대신 접근할 수 있게 하고 있습니다. 1. current 매크로 current 매크로의 제공 배경은 책에서 설명 있긴한데, 여기서는 간단하게 요약하자면 시스템에 영향을 주지 않는 형태로 태스크 디스크립터의 주소에 접근하는 매크로를 필요 요구사항에 의해 만들어졌다고 합니다. current 매크로는 현재 구동 중인 프로세스..

IT/Linux Kernel 2025.04.24

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 16 - 스레드 정보(thread_info)

안녕하세요. 이전 글에서는 프로세스 속성을 관리하는 자료구조인 태스크 디스크립터를 확인했습니다. 이번 글에서는 프로세스 실행동작은 관리하는 thread_info에 대해서 확인합니다. 이번 부분은 내용이 조금 많아서, 빠르게 요약하면서 따라가 보겠습니다. 그래서 지루할 수 있습니다. 1. thread_info 구조체란? 태스크 디스크립터(task_struct)는 프로세스의 공통 속성 정보를 저장, 관리를 합니다. thread_info 구조체는 프로세스의 세부 실행 정보를 저장하거나 로딩하는 자료구조를 관리합니다. 핵심 실행정보 저장하는 하는 내용은 - 선점 스케줄링 실행 여부 - 시그널 전달 여부 - 인터럽트 컨텍스트와 Soft IRQ 컨텍스트 상태 - 휴먼 상태로 진입하기 직전 레지스터를..

IT/Linux Kernel 2025.04.20

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 15 - 태스크 디스크립터(task_struct)

안녕하세요. 유저 프로세스와 커널 프로세스에 전반전 내용은 끝내고 이제 중요한 구조체 2개(태스크 디스크립터(task_struct 구조체), 스레드 정보(thread_info 구조체))를 확인하려고 합니다. 그중에 태스크 디스크립터(task_struct 구조체) 먼저 확인해 보겠습니다. 태스크 디스크립터(task_struct 구조체)에는 많은 필드가 있어서 책에서 소개하는 정도만 따라가 보겠습니다. struct task_struct 정의한 내용만 봐도 참 따라가기 쉽지 않겠구나 생각이 듭니다. 1. 프로세스 식별 필드 ps를 통해 systemd, kthreadd, rcu_gp 등 프로세스 이름을 확인할 수 있습니다. 이것은 task_struct의 comm 필드에 접근해서 가져옵니다. l..

IT/Linux Kernel 2025.04.15

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 14 - 커널 내부 프로세스 생성과 종료 과정

안녕하세요.   이전 내용에서는 유저프로세스, 커널 프로세스에 대해서 확인했습니다. 이번에는 이 내용을 간단히 정리하면서 나머지 부분을 확인합니다.  1. 프로세스 생성 과정 확인, _do_fork() 함수  유저 프로세스는 fork -> sys_clone -> _do_fork 흐름으로 호출했고, 커널 프로세스에서 kthread_create -> ... -> kthread 스레드 요청 -> ... -> _do_fork 흐름으로 프로세스를 생성했습니다.  최종적으로 동일하게 _do_fork() 함수를 호출했습니다.  _do_fork() 함수의 동작은 크게 두 단계로 볼 수 있습니다. 1단계는 프로세스 생성, 2단계는 프로세스의 실행요청으로 볼 수 있습니다. 1) _do_fork() 함수 소스코드 분석  한..

IT/Linux Kernel 2025.04.09

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 13 - 커널 스레드

안녕하세요.   이전 글에서는 유저공간에서 실행되는 프로세스를 봤습니다. 이제 커널 공간에서 실행하는 프로세스에 대해 알아보는 시간입니다.   1. 커널 스레드  커널 프로세스는 커널 공간에서만 실행되는 프로세스이며 대부분 커널 스레드 형태로 동작합니다. 리눅스 시스템 프로그래밍에서 데몬과 비슷한 처리를 하는데 데몬과 커널 스레드는 백그라운드 작업을 실행하면서 시스템 메모리, 전원 제어동작 수행합니다. 커널 스레드 특징  커널 공간에서만 실행함  유저 영역과 시스템 콜을 받지 않고 동작하는 것이 데몬과 차이  실행, 휴면 등 모든 동작을 커널에서 직접 제어 관리  대부분 커널 스레드는 시스템이 부팅할 때 생성하고 종료할 때까지 백그라운드로 실행  2. 커널 스레드 종류 1) 커널 스레드 항목 확인  ps..

IT/Linux Kernel 2025.04.02

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 12 - 4_4_user_process생성과 종료 과정 분석

안녕하세요.  이전 글에서 4_4_user_process라는 사용자 프로그램을 만들어 ftrace 메시지까지 만들어 봤습니다. 책에서는 raspbian_proc로 만들어 테스트한 내용입니다. 내용은 거의 동일합니다.   ftrace 메시지를 바탕으로 프로세스가 어떻게 생성되고 종료하는지 과정을 분석하는 내용입니다.  1. ftrace_log.c 분석 준비  분석할 내용은 get_ftrace.sh를 실행 디렉터리에 ftrace_log.c 파일로 되어 있을 것입니다.파일을 열어 확인합니다.  이전에 봤던 메시지 형태입니다. 그런데 얼마 실행하지 않은 것 같은데 많은 양의 메시지가 저장되어 있습니다. 전체 다 보는 것은 아니고 실행했던 파일 부분을 찾아서 보겠습니다.  rpi_kernel_src $ vim f..

IT/Linux Kernel 2025.03.23

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 11 - _do_fork() 흐름 파악과 ftrace 메시지 추출

안녕하세요.    _do_fork() 함수를 알아보기 위한 사전 정보가 조금 필요에 _do_fork() 마무리하지 못해서 추가 부분을 정리해 봅니다.  1. 유저 레벨 프로세스 생성 시 _do_fork() 함수처리 흐름  유저 레벨 프로세서 생성할 때 흐름은 아래와 같이 fork() 함수 호출하면 glibc 통해 시스템콜을 발생하고 이에 대응하는 sys_clone() 함수 호출합니다. 이후 호출을 따라가면 _do_fork() 함수를 호출합니다.  1) sys_clone 함수  sys_clone() 함수 내부를 보면 return 값(PID)을 받기 위해 _do_fork() 함수를 호출합니다.  SYSCALL_DEFINE5 매크로와 함께 커널 소스 빌드하는 과정에서 sys_ 접두사가 붙여 sys_clone으..

IT/Linux Kernel 2025.03.20