이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 209|회답: 3

[안전 지식] EBPF 관련 지식 링크

[링크 복사]
2025-10-20 16:47:02에 게시됨 | | |
이 글은 2025-10-21 09:20에 Summer가 마지막으로 편집했습니다

https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md  ebpf对应的 内核版本特性 能解决什么问题 *
https://lore.kernel.org/bpf/ ebpf对应的内核ebpf补丁的信息讨论 *
https://juejin.cn/post/7084515511576313864 linux tracing system 各种tracing框架的对比 分为前端,tracing框架,探针 *




이전의:. NET6의 우선순위 큐
다음:AI 에이전트와 AI MCP
 집주인| 2025-10-20 16:50:38에 게시됨 |
EBPF와 커널 모듈 모두 커널 프로브의 데이터 소스에 해당하며, EBPF 자체 데이터에는 해당하지 않습니다
 집주인| 2025-10-20 16:59:33에 게시됨 |
리눅스 참고문헌: 브라더 버드의 리눅스 저자 대만어

하이퍼링크 로그인이 보입니다.
 집주인| 2025-10-20 19:30:47에 게시됨 |
https://www.cnblogs.com/revercc/p/17803876.html
eBPF의 uprobe 프로그램과 kernel/events/uprobe.c 간의 연결고리는 eBPF 메커니즘이 사용자 상태 함수의 훅 기능을 구현하기 위해 커널의 네이티브 uprobe 인프라를 재사용한다는 점입니다. 구체적으로, eBPF의 uprobe는 내부 커널 호출 체인과 데이터 구조를 통해 연결된 커널 uprobe 프레임워크의 "응용"입니다.
핵심 연결: eBPF는 커널 uprobe 프레임워크를 통해 훅을 구현합니다
커널 uprobe.c는 리눅스 커널의 네이티브 사용자 상태 탐침(uprobe)의 핵심 구현체이며, 다음을 책임집니다:
사용자 상태 프로브(예: register_uprobe(), unregister_uprobe())의 등록 및 취소를 관리합니다.
브레이크포인트 삽입(x86의 int3과 같은 대상 함수 주소에 브레이크포인트 명령어 쓰기)을 처리합니다.
캡처 브레이크포인트 트리거 이벤트(프로그램이 브레이크포인트로 실행될 때 커널 상태 처리에 멈추는 경우).
사전 등록된 콜백 함수(즉, 훅 로직)를 호출합니다.
eBPF uprobe 프로그램(예시 libc.so 당신이 쓴 훅)은 본질적으로 uprobe 기반의 eBPF 콜백 함수를 eBPF 로더(예: bcc, libbpf)를 통해 커널에 등록하며, 이는 uprobe.c가 제공하는 인프라에 전적으로 의존합니다.
특정 호출 체인: eBPF 프로그램에서 uprobe.c 로의 흐름
uprobe를 eBPF 로더(예: bcc attach_uprobe)로 등록할 때, 기본 과정은 다음과 같습니다:
eBPF 로더는 등록 요청을 시작합니다. 로더(예: bcc의 Python 코드)는 시스템 호출(예: bpf() 또는 perf_event_open()))을 통해 커널에 "libc.so 의 openat 함수에 eBPF 훅을 걸고 싶다"고 알리고 eBPF 프로그램의 바이트코드를 전달합니다.
커널 검증 및 eBPF 프로그램의 준비 커널 eBPF 검증기는 프로그램의 정당성을 확인하여 커널 보안을 침해하지 않도록 합니다. 통과 후에는 eBPF 프로그램을 커널에 로드하고 "eBPF 콜백 함수"(즉, 작성한 uprobe_openat 로직)를 설정하세요.
uprobe.c의 등록 인터페이스 커널을 재사용하면 uprobe.c의 register_uprobe() 함수를 호출하고, "네이티브 uprobe"를 등록하며, eBPF 콜백 함수를 이 uprobe의 "트리거 핸들러"로 사용합니다.
여기서 핵심은 이렇습니다: eBPF uprobe의 본질은 eBPF 타입의 콜백을 커널의 네이티브 uprobe에 결합하는 것입니다.
uprobe.c는 브레이크포인트를 삽입하고 트리거될 때까지 기다립니다. Uprobe.c는 등록된 대상 주소(libc.so 의 openat 주소)를 기반으로 사용자의 상태 메모리에 브레이크포인트 명령어(예: x86의 int3)를 기록하고, 트리거 후 실행 재개를 위해 브레이크포인트의 원래 명령어를 기록합니다.
함수 호출은 브레이크포인트를 트리거하고, uprobe.c는 eBPF 콜백을 호출합니다. 애플리케이션이 libc.so:openat을 호출하면 브레이크포인트 명령어를 실행하면 트랩이 발생하고 커널 상태로 전환됩니다. 현재 시점:
커널은 uprobe.c에서 uprobe_handler() 함수(커널 처리 논리)를 호출합니다.
uprobe_handler()는 브레이크포인트에 대응하는 등록 정보를 확인하고, eBPF 콜백에 묶여 있음을 확인해 eBPF 프로그램(즉, 작성한 uprobe_openat)을 호출합니다.
eBPF 프로그램이 실행된 후(예: 매개변수 수집, ringbuf에 쓰기), uprobe_handler()는 원래 명령어를 복원하고 프로그램이 계속 실행될 수 있게 합니다.
요약: 두 사람 간의 관계
kernel/events/uprobe.c는 기본 인프라로, 사용자 상태 중단점의 삽입, 캡처, 복구와 같은 핵심 기능을 제공하며, eBPF uprobe, GDB 디버깅 등 모든 사용자 상태 탐침의 기초가 됩니다.
eBPF의 uprobe 프로그램은 이 인프라를 기반으로 한 상위 계층 애플리케이션으로, eBPF 콜백 함수를 등록하고 uprobe가 트리거될 때 커널이 eBPF 논리를 실행할 수 있도록 하여 효율적인 사용자 상태 기능 추적을 달성합니다.
요약하자면: eBPF의 uprobe는 "사용자"이고 uprobe.c는 "서비스 제공자"이며, 전자는 후자의 후크에 의존해 후크의 등록, 트리거 및 실행을 완료합니다.
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com