Kprobes와 Ftrace: 작동 원리 및 아키텍처
Kprobes는 인터럽트 예외 처리 메커니즘을 이용해 동작합니다. 등록 시 프로브 대상 명령어의 첫 바이트를 중단점 명령어(int3 등)로 치환하고, CPU가 이를 실행하면 트랩이 발생하여 핸들러가 호출됩니다. 이후 원본 명령어의 복사본이 싱글-스텝으로 실행되고 post_handler가 동작합니다. kretprobe(반환 프로브)는 함수 진입 시 반환 주소를 트램폴린 주소로 교체하여 함수 종료 시 핸들러를 실행합니다.
Ftrace는 컴파일 타임에 모든 함수에 mcount 호출을 삽입하고, 부트 시 nop 명령어로 변환합니다. 추적 활성화 시 nop을 ftrace 호출로 동적 변경하여 최소 오버헤드를 유지합니다. 함수 진입/종료 시점 모두에서 추적하는 function_graph 모드는 함수 실행 시간 측정과 호출 그래프 생성을 가능하게 합니다.
최적화 기법과 실무 주의사항
Kprobes의 점프 최적화(CONFIG_OPTPROBES)는 중단점 대신 점프 명령어를 사용하여 오버헤드를 0.05~0.1 마이크로초로 단축합니다. 하지만 post_handler 존재 여부, 다중 프로브 상황, 비활성화 상태에서는 최적화가 억제됩니다. 실무에서는 피해야 할 함수 블랙리스트(nokprobe_inline 주석, NOKPROBE_SYMBOL 매크로)를 반드시 확인하고, 재귀 트랩이나 커널 자체 instrumentation 코드는 프로브할 수 없습니다. Ftrace 기반 kprobe 이벤트를 사용하면 perf-probe를 통해 지역 변수나 함수 인자도 추적 가능합니다.