eBPF 놀이터
eBPF Playground
브라우저에서 eBPF 명령어 세트(ISA)와 커널 검증기를 순수 TypeScript로 시뮬레이션합니다. 어셈블리 에디터, 레지스터·스택·맵 시각화, 스텝 디버거, 검증기 거부 사례, 예제 갤러리(기본·응용·심화), 미션 8개로 커널 안에서 프로그램이 어떻게 검증·실행되는지 눈으로 배웁니다. (실제 커널 훅은 실행하지 않는 개념 학습 도구입니다.)
이 도구는 eBPF 명령어 세트와 검증기를 브라우저에서 시뮬레이션합니다. 실제 커널 훅(kprobe/XDP/tracepoint)은 실행하지 않습니다 — 개념 학습용입니다. 레지스터는 BigInt(64bit), 스택은 512바이트, 헬퍼는 결정론적으로 흉내 냅니다.
| r0ret | — | — | |
| r1 | — | — | |
| r2 | — | — | |
| r3 | — | — | |
| r4 | — | — | |
| r5 | — | — | |
| r6 | — | — | |
| r7 | — | — | |
| r8 | — | — | |
| r9 | — | — | |
| r10fp | — | — |
little-endian · 0이 아닌 바이트만 초록색. r10 기준 음수 오프셋으로 접근합니다.
실제로는 /sys/kernel/debug/tracing/trace_pipe 로 나갑니다.
예제 갤러리
미션
완료 0 / 8r0 에 10 을 넣고 exit 하세요.
r1=17, r2=42 가 주어졌다고 치고, 둘 중 큰 값을 r0로 리턴하세요. (정답=42)
유한 루프로 1+2+3+4+5=15 를 계산해 r0로 리턴하세요. (검증기 통과 필수)
array 맵 0번의 key=0 값을 1 로 만드세요. (bpf_map_update_elem 사용)
starter 는 r3 를 초기화하지 않아 검증기에 걸립니다. r3 를 먼저 초기화해서 검증기를 통과시키고, r0=r3 로 그 값을 리턴하세요. (정답 r0 = 7)
bpf_trace_printk 로 42 를 출력하세요. 출력 콘솔에 "printk: 42 0 0" 이 나오면 성공.
r1(패킷 길이)이 40 이라고 치고, 60 미만이면 XDP_DROP(1) 을 리턴하세요. (그 이상이면 XDP_PASS(2))
99 를 스택(r10-4)에 저장했다가 다시 읽어 r0 로 리턴하세요. (정답 r0 = 99)
개념 카드
eBPF(extended Berkeley Packet Filter)는 커널을 다시 컴파일하거나 모듈을 올리지 않고, 커널 안에서 안전하게 실행되는 작은 프로그램을 붙이는 기술입니다. 네트워킹, 관측(observability), 보안, 트레이싱에 널리 쓰입니다.
사용자 공간에서 바이트코드를 커널에 로드하면, 커널의 검증기(verifier)가 안전성을 증명한 뒤 JIT가 네이티브 기계어로 변환해 실행합니다. 그래서 "샌드박스된 커널 확장"이라고 부릅니다.