운영체제/리눅스

[리눅스_커널 디버깅] 6. 인터럽트 (rpi4 6.6.x)

IT 기술자 2025. 5. 16. 11:00

"디버깅을 통해 배우는 리눅스 커널의 구조와 원리" 책의 "5.2.2 ftrface와 커널 로그로 인터럽트 컨텍스트 확인하기"에서 소개하는 인터럽트 디버깅을 실습했다.

 

디렉토리를 만들고 ftrace 로그 작성

usb 인터럽트가 발견되지 않아 이더넷 인터럽트를 추적했다.

root@raspberrypi:/project/linuxSrc # mkdir ch05_02_02 && cd $_
root@raspberrypi:/project/linuxSrc/ch05_02_02 # vi irq_stack_trace.sh

#!/bin/bash

echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"

echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"

#echo  secondary_start_kernel  > /sys/kernel/debug/tracing/set_ftrace_filter	
echo  cpu_startup_entry  > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter init"

echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"

#echo dwc_otg_common_irq  > /sys/kernel/debug/tracing/set_ftrace_filter
echo bcmgenet_isr0 bcmgenet_isr1 > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"

echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo "event enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo "function stack trace enabled"

echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"

스크립트 실행 가능하게 만들기

 

실행

1. ./irq_stack_trace.sh

2. ../get_trace.sh

 

네트워크 인터럽트 로그 확인

root@raspberrypi:/project/linuxSrc/ch05_02_02 # vi ftrace_log.c

 349           <idle>-0       [000] d.h1.  3711.974045: irq_handler_entry: irq=28 name=eth0
 350           <idle>-0       [000] d.h1.  3711.974046: bcmgenet_isr0 <-__handle_irq_event_percpu
 351           <idle>-0       [000] d.h1.  3711.974050: <stack trace>
 352  => bcmgenet_isr0
 353  => __handle_irq_event_percpu
 354  => handle_irq_event
 355  => handle_fasteoi_irq
 356  => handle_irq_desc
 357  => generic_handle_domain_irq
 358  => gic_handle_irq
 359  => call_on_irq_stack
 360  => do_interrupt_handler
 361  => el1_interrupt
 362  => el1h_64_irq_handler
 363  => el1h_64_irq
 364  => default_idle_call
 365  => do_idle
 366  => cpu_startup_entry
 367  => rest_init
 368  => arch_call_rest_init
 369  => start_kernel
 370  => __primary_switched
 371           <idle>-0       [000] d.h1.  3711.974052: irq_handler_exit: irq=28 ret=handled
 372           <idle>-0       [003] d.h1.  3711.974053: irq_handler_entry: irq=2 name=IPI
 373           <idle>-0       [003] dNh1.  3711.974055: irq_handler_exit: irq=2 ret=handled