Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 209|Відповідь: 3

[Знання з безпеки] Посилання на знання, пов'язані з EBPF

[Копіювати посилання]
Опубліковано 2025-10-20 16:47:02 | | |
Цей допис востаннє відредаговано Саммер 2025-10-21 09:20

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框架,探针 *




Попередній:. Пріоритетна черга PriorityQueue у NET6
Наступний:Агент ШІ та ШІ MCP
 Орендодавець| Опубліковано 2025-10-20 16:50:38 |
І EBPF, і модулі ядра відповідають джерелу даних ядрених зондів, а не власному EBPF
 Орендодавець| Опубліковано 2025-10-20 16:59:33 |
Джерела з Linux: Автор Brother Bird's Linux, тайванська

Вхід за гіперпосиланням видно.
 Орендодавець| Опубліковано 2025-10-20 19:30:47 |
https://www.cnblogs.com/revercc/p/17803876.html
Зв'язок між програмою uprobe eBPF і kernel/events/uprobe.c фактично полягає в тому, що механізм eBPF повторно використовує власну інфраструктуру uprobe ядра для реалізації функції hook функцій стану користувача. Зокрема, uprobe eBPF — це «застосування» фреймворку ядра, який пов'язаний внутрішнім ланцюгом викликів ядра та структурою даних.
Основний зв'язок: eBPF покладається на фреймворк uprobe ядра для реалізації хуків
Ядро uprobe.c є основною реалізацією нативного зонда стану користувача ядра Linux (uprobe) і відповідає за:
Керування реєстрацією та скасуванням зондів у стані користувача (наприклад, register_uprobe(), unregister_uprobe()).
Обробляє вставку точки зупину (запис інструкцій на адресу цільової функції, наприклад, int3 у x86).
Захоплення тригерних подій точки зриву (застрягають у обробці стану ядра, коли програма виконується до точки зупину).
Викликайте попередньо зареєстровану функцію зворотного виклику (тобто логіку зачіпа).
Програма uprobe eBPF (наприклад, у прикладі hook libc.so, який ви написали) фактично реєструє функцію зворотного виклику eBPF на основі uprobe, з ядром через eBPF-завантажувач (наприклад, bcc, libbpf), яка повністю покладається на інфраструктуру, надану uprobe.c.
Специфічний ланцюг дзвінків: потік від програми eBPF до uprobe.c
Коли ви реєструєте апроб через eBPF-завантажувач (наприклад, attach_uprobe bcc), основний процес виглядає так:
Завантажувач eBPF ініціює запит на реєстрацію. Завантажувач (наприклад, код на Python від bcc) повідомляє ядро через системний виклик (наприклад, bpf() або perf_event_open()), що «Я хочу підвішити eBPF-гачок на функцію openat libc.so» і передає байткод програми eBPF.
Верифікація та підготовка програм eBPF ядра Перевірка ядра eBPF перевіряє легітимність програми, щоб переконатися, що вона не порушує безпеку ядра. Після передачі завантажте програму eBPF у ядро і отримайте «функцію зворотного виклику eBPF» (тобто uprobe_openat логіку, яку ви написали).
Повторне використання ядра інтерфейсу реєстрації uprobe.c викликає функцію register_uprobe() в uprobe.c, реєструє «рідний uprobe» і використовує функцію зворотного виклику eBPF як «тригерний обробник» цього uprobe.
Головне тут таке: суть uprobe eBPF полягає в прив'язанні callback типу eBPF до нативного упроба ядра.
uprobe.c вставляє точку зупину і чекає на її активацію. Uprobe.c записує інструкцію точки зупину (наприклад, int3 у x86) у пам'ять стану користувача на основі зареєстрованої цільової адреси (адреса openat у libc.so) і записує початкову інструкцію точки розриву (для відновлення виконання після тригерування).
Виклики функцій тригерних точок розриву, uprobe.c викликає зворотні виклики eBPF Коли додаток викликає libc.so:openat, виконання інструкції breakpoint запускає пастку і переходить у стан ядра. На цей момент:
Ядро викликає функцію uprobe_handler() (логіка обробки ядра) в uprobe.c.
uprobe_handler() перевірить реєстраційну інформацію, що відповідає точці зупину, і виявить, що вона прив'язана до eBPF-callback, тому викликає програму eBPF (тобто uprobe_openat, яку ви написали).
Після виконання програми eBPF (наприклад, збір параметрів, запис у ringbuf) uprobe_handler() відновлює початкову інструкцію і дозволяє програмі продовжити виконання.
Резюме: Взаємозв'язок між двома
kernel/events/uprobe.c — це базова інфраструктура, яка забезпечує основні можливості, такі як вставка, захоплення та відновлення точок зупину стану користувача, і є основою для всіх зондів стану користувача (включаючи eBPF-апроб, налагодження gdb тощо).
Програма uprobe eBPF — це додаток верхнього рівня, заснований на цій інфраструктурі, який реєструє функції зворотного виклику eBPF і дозволяє ядрі виконувати логіку eBPF при запуску uprobe, досягаючи ефективного відстеження стану користувача.
Коротко кажучи: uprobe для eBPF — це «користувач», а uprobe.c — «постачальник послуг», і перший покладається на другого для завершення реєстрації, запускання та виконання хуків.
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com