Skip to content
Beside the Wheel
Search
Ctrl
K
Cancel
Email
GitHub
Select theme
Dark
Light
Auto
공부
(5)
spot 인스턴스에서 서버 가용성 개선하기
eBPF로 서버 성능 Profiling하는 법: Pyroscope의 구현 살펴보기
정수론부터 RSA까지
strace로 shaka-packager 버그 추적
Kubernetes The Hard Way
TIL
(937)
AI
(43)
DevOps
(230)
Network
(61)
OS
(155)
개발
(113)
과학
(1)
데이터베이스
(64)
서버
(72)
수학
(20)
알고리즘
(24)
암호학
(32)
언어
(95)
컴퓨터구조
(3)
코드
(24)
독후감
(43)
과학
(1)
사회
(2)
산문
(3)
소설
(12)
인문
(11)
자기계발
(7)
철학
(7)
생각
(6)
고민
변화에 대하여
의식의 영역에 대하여
본질을 보려면
짧은 생각들
소유냐 존재냐
회고
(13)
2022.03-04 대덕소마고 입학소감/다짐
2022.05-08 프로젝트와 인간관계
2022.09-2023.02 불안과 판단
2023.03-07 DMS 리더 회고
2023.08-11 나는 누구인가?
2023.12 더 많은 걸 배우기 위한 경험
2024.01-02 회사 인턴 회고
2024.03-04 3학년으로서 근황
2024.05-07 나름 알찬 3학년
2024.08-12 첫 회사
2025.01-03 입출력
2025.03-08 효능감이란 무엇일까
2025.09-12 연말회고
Email
GitHub
Select theme
Dark
Light
Auto
태그: bpf
총 13개의 글이 있습니다.
BPFDoor
bpf
2025. 5. 5.
BPFDoor를 활용한 백도어 악성코드로서 2021년 PWC 사의 위협 보고서를 통해 최초로 공개되었다. BPF의 필터링 기능을 악용하여, 방화벽을 우회하고 패킷 기반 명령 수신이 가능하도록 구성된 백도어이다. 동작 방식 Github에 공개된 [BPFDoor 코드 중 하나]( 의 동작 과정을 상세히 살펴보
메모리 로딩
bpf
2024. 4. 28.
BPF는 일반적인 프로그램과 유사한 방식으로 개발하기 때문에 유사한 실행파일 및 메모리 구조를 가지고 있지만, 커널 안에서 제한된 환경으로 실행되기 때문에 로딩(loading) 또한 다른 방식으로 실행된다 데이터 유형 일반적인 실행파일에서 가장 중요한 두 가지는 코드와 데이터이다. 코드는 말그대로 상위언어를 컴파일한 머신코드를 의미하고, 데이터는 실행시 코드가 참조하는 메모리를 의미한다. 데이터는 스택과 힙같이 실행시 메모리가 할당/해제되는 동적 데이터와 전역변수처럼 코드에서 선언되는 정적 데이터로 나뉘는데, 정적 데이터는 실행파일을 로딩할 때 메모리가 할당되고 해당 메모리를 참조하는 코드도 재배치(relocation)된다. 그리고 정적 데이터는 크게 읽기전용 변수, 초기화된 전역변수 그리고
서브프로그램
bpf
2024. 4. 28.
BPF는 일반적으로 하나의 함수(main 함수)가 하나의 섹션이 되고, 하나의 섹션이 하나의 프로그램이 된다. 그리고 커널에서 해당 프로그램을 실행할 때는 프로그램의 시작 위치가 메인함수의 시작 위치이기 때문에 간단히 처음부터 실행하면 된다. 하지만 아래와 같이 메인함수에서 공통함수를 호출하는 경우처럼 두 개 이상의 함수가 필요한 경우에는 프로그램의 시작 위치를 어떻게 보장할까? BPF는 이러한 상황에서 시작 위치 보장을 위해 서브프로그램이라는 기능을 제공한다. 아래 코드는 bcc의 [filetop]( 예제코드이다. 해당 예제는 `vfs_read`와 `vfs_write` 커널함수
BPF communicates with userspace
bpf
2024. 4. 19.
프로그램이 attach 되어 실행되고 나면 어떻게 정보를 수집할 수 있을까요? 세 가지 방법이 있습니다. BPF 맵, perf 이벤트, bpf_trace_printk를 사용하는 것입니다. 1. BPF maps When should I use maps? BPF maps are useful for gathering information during BPF programs to share with other running BPF programs, or with userspace programs which can also see the map data. How can I use it The set of map types is described in [`include/linux/uapi/bpf.h`](
BPF System Call
bpf
2024. 4. 9.
c include int bpf(int cmd, union bpf_attr *attr, unsigned int size); `bpf()` 시스템 콜은 eBPF와 관련된 다양한 동작을 수행한다. 이 시스템 콜을 사용해 커널 내 eBPF 헬퍼 함수들을 호출할 수 있으며 eBPF Map 같은 공유 자료 구조에 접근할 수 있다. 각 eBPF 프로그램은 완료 때까지 안전하게 실행할 수 있는 명령어들의 집합이다. 커널 내 검증기가 eBPF 프로그램이 안전한지 여부를 정적으로 판단한다. 검증하는 동안 커널에서 그 eBPF 프로그램이 쓰는 맵 각각에 참조 카운터를 올려서 프로그램이 내려갈 때까지 관련 맵들이 제거되지 않도록 한다. cmd `bpf()` 시스템 호출이 수행할 동작을 cmd 인자로 결
libbpf helper 함수
bpf
2024. 3. 28.
`libbpf_register_prog_handler()` rust LIBBPF_API int libbpf_register_prog_handler(const char *sec, enum bpf_prog_type prog_type, enum bpf_attach_type exp_attach_type, const struct libbpf_prog_handler_opts *opts); `libbpf_register_prog_handler()`는 커스텀 BPF 프로그램을 `SEC()` handler로 등록해준다. 모든 커스텀 handler(sec 파라미터가 NULL인 것은 제외)는 libbpf에서 정의하는 `SEC()` handler보다 전에 등록된
BPF ring buffer
bpf
2024. 3. 25.
BPF 프로그램은 수집한 데이터를 후처리하고 로깅하기 위해 정보를 User space로 전송하는데, 대부분의 경우 이를 위해 BPF Perf buffer(Perfbuf)를 사용한다. Perfbuf는 CPU마다 하나씩 생성되는 순환 버퍼로, Kernel space와 Use space간 데이터를 효율적으로 교환할 수 있도록 한다. 하지만 Perfbuf에는 두가지의 문제점이 있었다. 1. 각 CPU에 대해 별도의 버퍼를 사용하기 때문에 데이터 스파이크에 대응하기 위해서 각각의 버퍼크기를 크게 할당해주어야 한다. 이 때문에 필요한 것 보다 더 많은 메모리 공간이 낭비될 수 있다. 2. 연관된 이벤트가 서로 다른 CPU에서 빠르게 발생하는 경우 이벤트가 순서대로 전달되지 않을 수 있다. 이 때문에 이벤트를
libbpf
bpf
2024. 3. 25.
libbpf is a C-based library containing a BPF loader that takes compiled BPF object files and prepares and loads them into the Linux kernel. libbpf takes the heavy lifting of loading, verifying, and attaching BPF programs to various kernel hooks, allowing BPF application developers to focus only on BPF program correctness and performance. The following are the high-level features supported by libb
XDP
bpf
2024. 3. 19.
XDP(eXpress Data Path)는 운영체제 네트워킹 스택의 대부분을 우회하여 높은 속도로 네트워크 패킷을 송수신할 수 있는 eBPF 기반 고성능 데이터 경로이다. Data path 위 그림은 Linux 커널의 패킷 흐름 경로를 나타낸다. XDP는 네트워킹 스택과 패킷 메타데이터를 위한 메모리 할당을 우회한다. XDP의 핵심 아이디어는 커널 RX 경로 초입에 hook을 걸어, 사용자가 제공한 eBPF 프로그램이 패킷 처리 방향을 결정하게 하는 것이다. 이 hook은 NIC 드라이버의 인터럽트 처리 직후, 네트워크 스택의 메모리 할당 전에 위치한다. 메모리 할당 비용이 크기 때문이다. 이 덕분에 일반 하드웨어에서도 코어당 초당 2,600만 패킷을 드롭할 수 있다. e
BCC
bpf
2024. 3. 13.
BPF는 c언어로 작성할 수 있고, LLVM의 clang과 같은 컴파일러를 활용해 C언어로 된 BPF 프로그램 코드를 eBPF 바이트코드로 컴파일할 수 있다. linux man 페이지 __attribute__((section(x), used)) endif __section("classifier") int cls_main(struct __sk_buff *skb) { return -1; } char __license[] __section("license") = "GPL
BPF
bpf
2024. 3. 13.
For connected systems evolving these days, the amount of data transfer is huge, and the support infrastructure for the network analysis needed a way to filter out things pretty fast. BPF는 1992년 패킷 분석 및 필터링을 위해 개발된 in-kernel virtual machine이다. BSD라는 OS에서 처음 도입했으며 리눅스에서도 이 개념을 빌려와서 서브시스템을 만들었다. in-kernel virtual machine이라고 함은 정말로 가상의 레지스터와 스택 등을 갖고 있으며 이를 바탕으로 코드를 실행한다는 뜻이다. 커널 레벨의 프로그램을 개발하기 위한 일종
BPF 프로그램 타입
bpf
2024. 3. 13.
BPF 프로그램의 종류는 다양하다. BPF 프로그램은 이벤트를 중심으로 작성되는데, 프로그램 타입에 따라 사용할 수 있는 이벤트가 제한적이므로 작성하고자 하는 프로그램이 어떤 범주에 속하는지 잘 알고 있어야 한다. 작성한 프로그램은 해당하는 이벤트가 발생할 때 실행되고, 실행 시점에 프로그램에서 필요로 하는 정보가 컨텍스트로 제공될 것이다. 프로그램 타입 [커널 내 소스]( 커널에서 지원하는 BPF 프로그램의 타입 전체가 나열되어 있다. c /* Note that tracing related programs such as * BPF_PROG_TYPE_{KPRO
BTF
bpf
2024. 3. 13.
BTF is the metadata format which encodes the debug info related to BPF program/map. The name BTF was used initially to describe data types. The BTF was later extended to include function info for defined subroutines, and line info for source/line information. The debug info is used for map pretty print, function signature, etc. The function signature enables better bpf program/function kernel sym