앞 글에서 eBPF가 왜 안전한지까지 봤다.
- 커널을 직접 수정하는 건 아니고
- hook에 붙어서 실행되고
- verifier가 위험한 코드를 막는다
여기까지 보면 자연스럽게 이런 궁금증이 생긴다.
“그래서 이 코드는 도대체 어떻게 실행되는 거지?”
커널 안에서 돌아간다고 했는데,
그게 그냥 C 코드가 그대로 들어가는 건 아닐 거다.
eBPF는 “그대로 실행되는 코드”가 아니다
처음에 많이 오해하는 부분이 이거다.
“내가 C로 짠 코드가 커널에서 그대로 실행된다”
그건 아니다.
실제로는 중간에 한 단계가 더 있다.
흐름을 보면
C 코드
↓
eBPF bytecode
↓
커널에서 실행
즉,
eBPF는 일종의 “가상 머신(VM)” 위에서 돌아간다
왜 굳이 VM을 쓰는 걸까
이건 이유가 꽤 명확하다.
1. 안전성
- 직접 커널 코드 실행 ❌
- 제한된 명령만 실행 ⭕
2. 검증 가능
- verifier가 코드 분석 가능
3. 제어 가능
- 허용된 동작만 수행
👉 그래서 eBPF는
“커널 안에서 도는, 제한된 프로그램”
이다.
eBPF 프로그램은 어떻게 생겼을까
내부적으로 보면 꽤 단순하다.
기본 구조
- 레지스터 기반
- 명령어 리스트
- 스택
느낌만 보면
R1 = input
R2 = map lookup
if (조건)
jump
return
👉 완전한 언어라기보다
작은 instruction 집합
에 가깝다.
레지스터 기반 구조
일반적인 C 코드랑 다른 점이 하나 있다.
레지스터 기반이다
즉:
- 변수 대신 레지스터 사용
- 계산도 레지스터 중심
예 느낌
R1 = arg
R2 = 10
R1 += R2
이 구조 덕분에:
- 빠르고
- 단순하고
- 검증하기 쉽다
map — 사용자 공간과 연결되는 핵심
여기서 중요한 개념이 하나 나온다.
map
eBPF는 혼자 실행되는 게 아니라
데이터를 주고받아야 한다.
그래서 등장한 게 map이다.
역할
- 커널 ↔ 사용자 공간 데이터 공유
- 상태 저장
예
- counter 저장
- PID별 통계
- latency 기록
개념적으로 보면
eBPF
↓
map
↓
user space
👉 즉,
eBPF는 map을 통해 바깥과 연결된다
helper 함수
eBPF는 마음대로 아무 함수나 호출할 수 없다.
대신:
허용된 helper 함수만 사용 가능하다
예
- 현재 PID 가져오기
- 시간 조회
- map 접근
👉 이유
- 안전성 유지
- 커널 보호
실행은 언제 일어나나
이건 앞에서 봤지만, 한 번 더 정리하면
이벤트 발생
↓
hook
↓
eBPF 실행
👉 즉,
항상 “이벤트 기반”이다
JIT — 실제로는 더 빠르게 실행된다
한 가지 더 중요한 포인트가 있다.
처음에는 bytecode로 실행되지만,
대부분의 시스템에서는:
기계어로 변환(JIT)해서 실행한다
그래서 성능이 좋다.
정리하면 구조는 이렇다
C 코드
↓
eBPF bytecode
↓
verifier 검사
↓
커널 VM
↓
(선택) JIT → native 실행
여기까지 이해하면 보이는 것
왜 안전한지
→ VM + verifier 때문
왜 빠른지
→ JIT + 단순 구조
왜 강력한지
→ hook + map
다음으로 이어지는 질문
이제 자연스럽게 궁금해진다.
“그 hook 종류는 뭐가 있지?”
“kprobe, tracepoint 이런 건 뭐가 다른 거지?”
한 줄 정리
eBPF는 가상 머신 기반으로 동작하며, 제한된 instruction과 map, helper를 통해 커널 안에서 안전하게 실행된다.
'프로그래밍공부(Programming Study) > CS-운영체제(OS)' 카테고리의 다른 글
| 실제 메모리 문제를 분석하는 흐름 (0) | 2026.04.10 |
|---|---|
| eBPF hook 종류 (kprobe, tracepoint, uprobe) (0) | 2026.04.09 |
| eBPF는 왜 안전한가 (그리고 언제 위험한가) (0) | 2026.04.07 |
| eBPF로 메모리를 추적하는 방법 (0) | 2026.04.06 |
| /proc/smaps로 메모리를 제대로 분석하는 방법 (0) | 2026.04.05 |
댓글