BPF and XDP Reference Guide
BPF and XDP Reference Guide
BPF와 XDP를 깊이 있는 기술적 수준으로 이해하고 싶은 개발자와 사용자를 위한 레퍼런스 문서예요. eBPF의 개념, 명령어 집합, 헬퍼 함수, 맵, 그리고 tc·XDP로 BPF 프로그램을 로드하는 네트워킹 활용까지 폭넓게 다뤄요.
본문
Note: 이 문서 섹션은 BPF와 XDP를 깊이 있는 기술적 수준으로 이해하고 싶은 개발자와 사용자를 대상으로 해요. 이 레퍼런스 가이드를 읽는 것이 Cilium을 더 폭넓게 이해하는 데 도움이 될 수는 있지만, Cilium을 사용하기 위한 필수 요건은 아니에요. 보다 높은 수준의 소개는 Getting Started 가이드와 eBPF Datapath를 참고하세요.
BPF는 리눅스 커널에서 매우 유연하고 효율적인 가상 머신 같은 구조로, 다양한 훅 지점에서 바이트코드를 안전하게 실행할 수 있게 해줘요. 여러 리눅스 커널 서브시스템에서 사용되는데, 가장 눈에 띄는 것은 네트워킹, 추적(tracing), 보안(예: 샌드박싱)이에요.
BPF는 1992년부터 존재해 왔지만, 이 문서는 커널 3.18에서 처음 등장한 확장된 Berkeley Packet Filter(eBPF) 버전을 다뤄요. eBPF는 요즘 "classic" BPF(cBPF)라고 불리는 원래 버전을 대부분 쓸모없게 만들었어요. cBPF는 많은 사람이 tcpdump가 사용하는 패킷 필터 언어로 알고 있지요. 오늘날 리눅스 커널은 eBPF만 실행하며, 로드된 cBPF 바이트코드는 프로그램 실행 전에 커널에서 투명하게 eBPF 표현으로 변환돼요. 이 문서는 eBPF와 cBPF의 명시적 차이점을 지적하는 경우가 아니면 일반적으로 BPF라는 용어를 사용해요.
Berkeley Packet Filter라는 이름이 패킷 필터링 전용 목적을 암시하지만, 요즘 명령어 집합은 충분히 일반적이고 유연해서 네트워킹 외에도 많은 사용 사례가 있어요. BPF를 사용하는 프로젝트 목록은 Further Reading을 참고하세요.
Cilium은 데이터 경로에서 BPF를 많이 사용해요. 자세한 내용은 eBPF Datapath를 참고하세요. 이 장의 목표는 BPF를 이해하고, tc(traffic control)와 XDP(eXpress Data Path)로 BPF 프로그램을 로드하는 네트워킹 특정 사용법을 익히며, Cilium의 BPF 템플릿 개발을 돕기 위한 BPF 레퍼런스 가이드를 제공하는 것이에요.
이 섹션에서 다루는 문서는 다음과 같아요.
- BPF Architecture: eBPF의 구조와 동작 원리를 다뤄요.
- Instruction Set: eBPF의 명령어 집합을 설명해요.
- Helper Functions: BPF 헬퍼 함수를 다뤄요.
- Maps: BPF 맵을 설명해요.
- Object Pinning: 오브젝트 피닝을 다뤄요.
- Tail Calls: 테일 콜을 설명해요.
- BPF to BPF Calls: BPF 간 호출을 다뤄요.
- JIT: JIT 컴파일을 설명해요.
- Hardening: 보안 강화를 다뤄요.
- Offloads: 하드웨어 오프로드를 설명해요.
- BPF sysctls: BPF 관련 sysctl 설정을 다뤄요.
- Development Tools: 개발 도구를 소개해요 (LLVM, iproute2).
- Debugging and Testing: 디버깅·테스트 방법을 다뤄요 (bpftool, Kernel Testing, JIT Debugging).
- Introspection: 내부 조사를 설명해요 (Tracing pipe, Miscellaneous).
- Program Types: 프로그램 타입을 다뤄요 (XDP, tc).
- Further Reading: 추가 자료를 안내해요 (Kernel Developer FAQ, Projects using BPF, XDP Newbies, BPF Newsletter, Podcasts, Blog posts, Books, Talks, Further Documents).