Skip to content
Tools/eBPF 놀이터

eBPF 놀이터

eBPF Playground

브라우저에서 eBPF 명령어 세트(ISA)와 커널 검증기를 순수 TypeScript로 시뮬레이션합니다. 어셈블리 에디터, 레지스터·스택·맵 시각화, 스텝 디버거, 검증기 거부 사례, 예제 갤러리(기본·응용·심화), 미션 8개로 커널 안에서 프로그램이 어떻게 검증·실행되는지 눈으로 배웁니다. (실제 커널 훅은 실행하지 않는 개념 학습 도구입니다.)

🐝 eBPF 놀이터 — 커널의 프로그램 VM을 눈으로

이 도구는 eBPF 명령어 세트검증기를 브라우저에서 시뮬레이션합니다. 실제 커널 훅(kprobe/XDP/tracepoint)은 실행하지 않습니다 — 개념 학습용입니다. 레지스터는 BigInt(64bit), 스택은 512바이트, 헬퍼는 결정론적으로 흉내 냅니다.

어셈블리 에디터
명령어 (2)
0 r0 = 42
1 exit
레지스터
r0ret
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10fp
스택 (r10 = 512, 하위 64바이트)
r10-6400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
r10-4800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
r10-3200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
r10-1600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

little-endian · 0이 아닌 바이트만 초록색. r10 기준 음수 오프셋으로 접근합니다.

맵(map)
#0 counter_maparray · max 16
(비어 있음)
#1 hist_maphash · max 64
(비어 있음)
bpf_trace_printk 출력
(출력 없음) — call 6 으로 출력해 보세요.

실제로는 /sys/kernel/debug/tracing/trace_pipe 로 나갑니다.

예제 갤러리

미션

완료 0 / 8
기본r0에 10을 리턴

r0 에 10 을 넣고 exit 하세요.

기본두 값 중 큰 값

r1=17, r2=42 가 주어졌다고 치고, 둘 중 큰 값을 r0로 리턴하세요. (정답=42)

응용bounded loop 로 1~5 합

유한 루프로 1+2+3+4+5=15 를 계산해 r0로 리턴하세요. (검증기 통과 필수)

응용map 카운터 증가

array 맵 0번의 key=0 값을 1 로 만드세요. (bpf_map_update_elem 사용)

심화검증기 통과시키기 (초기화 추가)

starter 는 r3 를 초기화하지 않아 검증기에 걸립니다. r3 를 먼저 초기화해서 검증기를 통과시키고, r0=r3 로 그 값을 리턴하세요. (정답 r0 = 7)

심화printk 로 42 출력

bpf_trace_printk 로 42 를 출력하세요. 출력 콘솔에 "printk: 42 0 0" 이 나오면 성공.

심화XDP: 짧은 패킷 DROP

r1(패킷 길이)이 40 이라고 치고, 60 미만이면 XDP_DROP(1) 을 리턴하세요. (그 이상이면 XDP_PASS(2))

심화스택 왕복

99 를 스택(r10-4)에 저장했다가 다시 읽어 r0 로 리턴하세요. (정답 r0 = 99)

개념 카드

eBPF(extended Berkeley Packet Filter)는 커널을 다시 컴파일하거나 모듈을 올리지 않고, 커널 안에서 안전하게 실행되는 작은 프로그램을 붙이는 기술입니다. 네트워킹, 관측(observability), 보안, 트레이싱에 널리 쓰입니다.

사용자 공간에서 바이트코드를 커널에 로드하면, 커널의 검증기(verifier)가 안전성을 증명한 뒤 JIT가 네이티브 기계어로 변환해 실행합니다. 그래서 "샌드박스된 커널 확장"이라고 부릅니다.