프로그래밍공부(Programming Study)/CS-운영체제(OS)

eBPF는 내부적으로 어떻게 동작할까

Chann._.y 2026. 4. 8.
728x90

 

앞 글에서 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를 통해 커널 안에서 안전하게 실행된다.

728x90

댓글