리눅스 커널의 시스템 콜 처리 경로 — arm64 예외 벡터부터 핸들러까지
x86-64에서는 syscall 명령이 MSR_LSTAR에 적힌 주소로 곧장 점프한다. 시스템 콜 전용 진입점이 레지스터 하나에 박혀 있는 구조다. arm64에는 그런 전용 레지스터가 없다. svc 명령이 만드는 것은 "동기 예외" 하나일 뿐이고,…
x86-64에서는 syscall 명령이 MSR_LSTAR에 적힌 주소로 곧장 점프한다. 시스템 콜 전용 진입점이 레지스터 하나에 박혀 있는 구조다. arm64에는 그런 전용 레지스터가 없다. svc 명령이 만드는 것은 "동기 예외" 하나일 뿐이고,…
커널이 제공하는 트레이스 이벤트는 Ubuntu 24.04 기준 1789개다. 어떤 이벤트를 봐야 할지 모르겠다고 events/enable에 1을 써버리면 1초 만에 수십만 건이 링 버퍼에서 밀려나 사라지고, 정작 보려던 이벤트도 그 안에 묻힌다.…
특정 syscall이나 함수 하나가 얼마나 걸리는지, 그 안에서 어떤 하위 함수가 시간을 잡아먹는지 알고 싶을 때 perf는 샘플링 기반이라 호출 빈도가 낮은 함수는 놓치기 쉽다. ftrace의 function_graph 트레이서는 지정한 함수의…
커널 함수 호출이나 스케줄링 이벤트가 실제로 어떤 순서로 일어나는지 확인하고 싶을 때, printk를 여기저기 넣고 재빌드하는 건 비효율적이다. ftrace(Function Tracer)는 커널을 재빌드하지 않고도 함수 호출과 이벤트를 추적할 수 있게 해주는…
커널 코드에 printk를 넣고 재빌드/재부팅하는 것은 확인할 지점이 늘어날수록 비용이 커진다. tracepoint와 kprobe는 커널을 재빌드하지 않고도 특정 함수의 호출, 인자, 리턴값을 실시간으로 들여다볼 수 있게 해주는 두 가지 트레이싱 메커니즘이다.…
ftrace는 리눅스 커널에 내장된 강력한 추적 도구로, 함수 호출, 스케줄 및 이벤트 추적을 가능하게 하는 강력한 디버깅 및 프로파일링 도구이다. 이 블로그 글에서는 ftrace를 사용하여 리눅스 커널 함수를 추적하는 방법에…