├── .gitattributes ├── CODEOWNERS ├── contributing.md ├── package.json ├── code-of-conduct.md ├── README_MAINTENANCE.md ├── LICENSE ├── maintain_translation.py └── readme.md /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | readme.md merge=union 3 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | # These owners will be the default owners for everything in 2 | # the repo. Unless a later match takes precedence, 3 | # @global-owner1 and @global-owner2 will be requested for 4 | # review when someone opens a pull request. 5 | * @qmonnet @zoidbergwill 6 | -------------------------------------------------------------------------------- /contributing.md: -------------------------------------------------------------------------------- 1 | # 贡献指南 2 | 3 | 请注意,本项目采用 [参与者行为准则](code-of-conduct.md) 发布。参与此项目即表示您同意遵守其中的条款。 4 | 5 | "---" should be translated to "---" in Chinese because it is a symbol commonly used as a horizontal rule or divider, and does not have a direct translation. 6 | 7 | 确保您的拉取请求遵循以下准则: 8 | 9 | - 确保你照顾好这个 10 | - 还有这个 11 | - 别忘了检查这个 12 | 13 | 谢谢您的建议! 14 | 15 | ## 更新你的 PR 16 | 17 | 很多时候,要让一个PR符合上述规范可能很困难。 18 | 如果维护者发现有什么需要改变的,我们会要求您在合并之前编辑您的PR。不需要打开一个新的PR,只需编辑现有的PR。如果您不确定如何做到这一点,[这里有一个指南](https://github.com/RichardLitt/knowledge/blob/master/github/amending-a-commit-guide.md),介绍了不同的方法来更新您的PR,以便我们可以合并它。 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "awesome-lint": "^0.10.0", 4 | "remark": "^10.0.1", 5 | "remark-cli": "^6.0.1", 6 | "remark-lint": "^6.0.1", 7 | "remark-lint-are-links-valid-alive": "^0.3.0", 8 | "remark-preset-lint-recommended": "^3.0.1", 9 | "remark-validate-links": "^8.0.2" 10 | }, 11 | "scripts": { 12 | "lint-md": "node_modules/.bin/remark readme.md" 13 | }, 14 | "remarkConfig": { 15 | "plugins": [ 16 | "remark-preset-lint-recommended", 17 | "remark-validate-links", 18 | "remark-lint-are-links-valid-alive" 19 | ] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /code-of-conduct.md: -------------------------------------------------------------------------------- 1 | # 贡献者公约行为准则 2 | 3 | ## 我们的承诺 4 | 5 | 为了促进开放和友好的环境,我们作为贡献者和维护者承诺,无论年龄、身体大小、残疾、种族、性别认同和表达、经验水平、国籍、个人外貌、种族、宗教或性别身份和取向如何,使参与我们的项目和社区的体验不受骚扰。 6 | 7 | ## 我们的标准 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 创建积极环境的行为示例包括: 11 | 12 | * 使用欢迎和包容性语言 13 | * 尊重不同的观点和体验 14 | * 优雅地接受建设性的批评 15 | * 关注社区的最佳利益 16 | * 向其他社区成员展现同情心。 17 | 18 | 参与者不可接受的行为示例包括: 19 | 20 | * 使用性别暗示的语言或图像和不受欢迎的性关注或骚扰 21 | * 挑衅性的、侮辱性的评论、个人或政治攻击 22 | * 公开或私下骚扰 23 | * 未经明确许可发布他人的私人信息,比如实际或电子邮件地址 24 | * 其他在专业环境中被认为不当的行为。 25 | 26 | ## 我们的责任 27 | 28 | 项目维护者负责澄清可接受行为的标准,预计对任何不可接受行为的情况采取适当和公平的纠正行动。 29 | 30 | “项目维护者有权利和责任删除、编辑或拒绝与本行为准则不符的评论、提交、代码、维基编辑、问题和其他贡献,或者暂时或永久禁止任何贡献者因其他行为被认为是不适当的、具威胁性的、冒犯的或有害的。” 31 | 32 | ## 范围 33 | 34 | 本行为准则适用于项目空间和公共空间,当个人代表项目或其社区时。代表项目或社区的例子包括使用官方项目电子邮件地址,通过官方社交媒体帐户发布信息,或者担任在线或离线活动的指定代表。项目的代表可能会由项目维护人员进一步定义和澄清。 35 | 36 | ## 执行 37 | 38 | 如有滥用、骚扰或其他不可接受的行为,可以通过发送电子邮件至zoidbergwill@gmail.com报告给项目团队。所有的投诉都将得到审查和调查,并将得出被认为是必要和适当的回应,以应对情况。项目团队有责任对事件报告者进行保密。特定执行政策的进一步详细信息可能会单独发布。 39 | 40 | "如果项目维护者没有诚信地遵循或执行行为准则,可能会面临其他项目领导成员决定的临时或永久后果。" 41 | 42 | ## 归属 43 | 44 | 本行为准则改编自[贡献者公约][homepage]第1.4版,可在[http://contributor-covenant.org/version/1/4][版本]处获取。 45 | 46 | 【主页】:http://contributor-covenant.org 47 | 【版本】:http://contributor-covenant.org/version/1/4/ -------------------------------------------------------------------------------- /README_MAINTENANCE.md: -------------------------------------------------------------------------------- 1 | # 维护指南 / Maintenance Guide 2 | 3 | ## 关于维护脚本 / About the Maintenance Script 4 | 5 | `maintain_translation.py` 是用于维护 awesome-ebpf 中文翻译同步的脚本。 6 | 7 | ## 使用方法 / Usage 8 | 9 | ```bash 10 | # 完整检查 / Full check 11 | python3 maintain_translation.py 12 | 13 | # 仅检查缺失的 URLs / Check URLs only 14 | python3 maintain_translation.py --urls 15 | 16 | # 仅检查章节结构 / Check sections only 17 | python3 maintain_translation.py --sections 18 | ``` 19 | 20 | ## 功能特性 / Features 21 | 22 | 1. **章节对比**:检查原版和翻译版的章节结构差异 23 | 2. **URL 检查**:识别缺失的链接和项目 24 | 3. **最新内容检查**:特别关注 2023-2024 年的新增内容 25 | 4. **生成报告**:提供详细的对比报告和维护建议 26 | 27 | ## 维护建议 / Maintenance Recommendations 28 | 29 | 1. **定期运行**:建议每月运行一次脚本检查更新 30 | 2. **重点关注**: 31 | - 新增的工具和项目 32 | - 新发表的文章和教程 33 | - GitHub 项目链接的有效性 34 | 3. **更新记录**:在 README 中添加"最后更新"日期 35 | 36 | ## 已知需要添加的内容 / Known Missing Content 37 | 38 | ### 2023-2024 新增工具 39 | - bpfman - eBPF 管理器 40 | - Coroot - APM 工具 41 | - harpoon - 系统调用跟踪 42 | - ebpf-explorer - Web 界面 43 | - ebpfmon - TUI 监控 44 | - ptcpdump - 进程感知 tcpdump 45 | 46 | ### 新增文章系列 47 | - CloudChirp 系列文章 48 | - ArthurChiao 的防火墙文章 49 | - eBPF 单元测试指南 50 | 51 | ## 脚本依赖 / Dependencies 52 | 53 | ```bash 54 | pip install requests 55 | ``` 56 | 57 | ## 注意事项 / Notes 58 | 59 | - 脚本会自动从 GitHub 获取最新的原版 README 60 | - 中文版路径默认为当前目录的 `readme.md` 61 | - 如需修改路径,请编辑脚本中的常量定义 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | 118 | -------------------------------------------------------------------------------- /maintain_translation.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """ 3 | Maintenance script for awesome-ebpf Chinese translation 4 | 用于维护 awesome-ebpf 中文翻译的脚本 5 | 6 | Usage: 7 | python3 maintain_translation.py # Check all differences 8 | python3 maintain_translation.py --urls # Check only missing URLs 9 | python3 maintain_translation.py --sections # Check only sections 10 | """ 11 | 12 | import requests 13 | import re 14 | import sys 15 | from datetime import datetime 16 | from typing import List, Set, Tuple 17 | 18 | ORIGINAL_README_URL = "https://raw.githubusercontent.com/zoidyzoidzoid/awesome-ebpf/master/readme.md" 19 | CHINESE_README_PATH = "/root/yunwei37/awesome-ebpf-zh/readme.md" 20 | 21 | def fetch_original_readme() -> str: 22 | """Fetch the original README from GitHub""" 23 | try: 24 | response = requests.get(ORIGINAL_README_URL) 25 | response.raise_for_status() 26 | return response.text 27 | except requests.exceptions.RequestException as e: 28 | print(f"❌ Error fetching original README: {e}") 29 | sys.exit(1) 30 | 31 | def read_chinese_readme() -> str: 32 | """Read the Chinese translation""" 33 | try: 34 | with open(CHINESE_README_PATH, 'r', encoding='utf-8') as f: 35 | return f.read() 36 | except FileNotFoundError: 37 | print(f"❌ Chinese README not found at {CHINESE_README_PATH}") 38 | sys.exit(1) 39 | 40 | def extract_sections(content: str) -> List[str]: 41 | """Extract all section headers from markdown content""" 42 | sections = [] 43 | for line in content.split('\n'): 44 | if line.startswith('#'): 45 | # Clean up the section header 46 | section = line.strip('#').strip() 47 | sections.append(section) 48 | return sections 49 | 50 | def extract_links(content: str) -> List[Tuple[str, str]]: 51 | """Extract all links from markdown content""" 52 | # Pattern to match markdown links [text](url) 53 | pattern = r'\[([^\]]+)\]\(([^\)]+)\)' 54 | links = re.findall(pattern, content) 55 | return links 56 | 57 | def extract_github_projects(content: str) -> List[Tuple[str, str]]: 58 | """Extract GitHub project links""" 59 | github_pattern = r'\[([^\]]+)\]\((https://github\.com/[^\)]+)\)' 60 | return re.findall(github_pattern, content) 61 | 62 | def check_sections(original: str, chinese: str) -> None: 63 | """Compare sections between original and translation""" 64 | original_sections = extract_sections(original) 65 | chinese_sections = extract_sections(chinese) 66 | 67 | print("\n" + "="*60) 68 | print("📑 SECTION COMPARISON") 69 | print("="*60) 70 | print(f"Original sections: {len(original_sections)}") 71 | print(f"Chinese sections: {len(chinese_sections)}") 72 | 73 | # Find sections that might be missing 74 | missing_sections = [] 75 | for section in original_sections: 76 | found = False 77 | for ch_section in chinese_sections: 78 | if section.lower() in ch_section.lower() or ch_section.lower() in section.lower(): 79 | found = True 80 | break 81 | if not found and section not in ['Contents', 'Contributing', 'License', 'Acknowledgement']: 82 | missing_sections.append(section) 83 | 84 | if missing_sections: 85 | print("\n⚠️ Potentially missing sections:") 86 | for section in missing_sections: 87 | print(f" - {section}") 88 | else: 89 | print("\n✅ All major sections appear to be present") 90 | 91 | def check_urls(original: str, chinese: str) -> None: 92 | """Compare URLs between original and translation""" 93 | original_links = extract_links(original) 94 | chinese_links = extract_links(chinese) 95 | 96 | original_urls = set([url for _, url in original_links]) 97 | chinese_urls = set([url for _, url in chinese_links]) 98 | 99 | missing_urls = original_urls - chinese_urls 100 | 101 | print("\n" + "="*60) 102 | print("🔗 URL COMPARISON") 103 | print("="*60) 104 | print(f"Total URLs in original: {len(original_urls)}") 105 | print(f"Total URLs in Chinese: {len(chinese_urls)}") 106 | print(f"Missing URLs: {len(missing_urls)}") 107 | 108 | if missing_urls: 109 | # Categorize missing URLs 110 | github_urls = [url for url in missing_urls if 'github.com' in url] 111 | article_urls = [url for url in missing_urls if url not in github_urls] 112 | 113 | if github_urls: 114 | print(f"\n⚠️ Missing GitHub projects ({len(github_urls)}):") 115 | for url in sorted(github_urls)[:10]: 116 | print(f" - {url}") 117 | if len(github_urls) > 10: 118 | print(f" ... and {len(github_urls) - 10} more") 119 | 120 | if article_urls: 121 | print(f"\n⚠️ Missing articles/resources ({len(article_urls)}):") 122 | for url in sorted(article_urls)[:10]: 123 | print(f" - {url}") 124 | if len(article_urls) > 10: 125 | print(f" ... and {len(article_urls) - 10} more") 126 | else: 127 | print("\n✅ All URLs are present") 128 | 129 | def check_recent_additions(original: str, chinese: str) -> None: 130 | """Check for recent additions (2023-2024)""" 131 | recent_keywords = [ 132 | 'bpfman', 'coroot', 'harpoon', 'ptcpdump', 'ebpf-explorer', 'ebpfmon', 133 | 'cloudchirp', 'ebpfchirp', 'deepflow', 'ebpfguard', 'apfree-wifidog' 134 | ] 135 | 136 | print("\n" + "="*60) 137 | print("🆕 RECENT ADDITIONS CHECK (2023-2024)") 138 | print("="*60) 139 | 140 | missing_recent = [] 141 | for keyword in recent_keywords: 142 | if keyword.lower() in original.lower() and keyword.lower() not in chinese.lower(): 143 | missing_recent.append(keyword) 144 | 145 | if missing_recent: 146 | print("⚠️ Missing recent tools/projects:") 147 | for item in missing_recent: 148 | print(f" - {item}") 149 | # Find the full entry in original 150 | lines = original.split('\n') 151 | for line in lines: 152 | if item.lower() in line.lower() and ('github.com' in line or 'http' in line): 153 | print(f" Full entry: {line.strip()[:100]}...") 154 | break 155 | else: 156 | print("✅ All recent additions are present") 157 | 158 | def generate_report(original: str, chinese: str) -> None: 159 | """Generate a full comparison report""" 160 | print("\n" + "="*60) 161 | print(f"🔍 TRANSLATION MAINTENANCE REPORT") 162 | print(f"📅 Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") 163 | print("="*60) 164 | 165 | check_sections(original, chinese) 166 | check_urls(original, chinese) 167 | check_recent_additions(original, chinese) 168 | 169 | # Check specific important items 170 | print("\n" + "="*60) 171 | print("✅ SPECIFIC ITEMS CHECK") 172 | print("="*60) 173 | 174 | important_items = { 175 | 'zbpf': 'Zig framework', 176 | 'eBPF for Windows': 'Windows support', 177 | 'Testing in Virtual': 'Virtual environment testing' 178 | } 179 | 180 | for item, description in important_items.items(): 181 | in_original = item in original 182 | in_chinese = item in chinese 183 | status = "✅" if (not in_original or in_chinese) else "⚠️" 184 | print(f"{status} {description}: ", end="") 185 | if in_original and not in_chinese: 186 | print("Missing in Chinese") 187 | elif in_original and in_chinese: 188 | print("Present") 189 | else: 190 | print("Not in original") 191 | 192 | def main(): 193 | """Main function""" 194 | args = sys.argv[1:] if len(sys.argv) > 1 else [] 195 | 196 | print("Fetching original README...") 197 | original = fetch_original_readme() 198 | 199 | print("Reading Chinese translation...") 200 | chinese = read_chinese_readme() 201 | 202 | if '--urls' in args: 203 | check_urls(original, chinese) 204 | elif '--sections' in args: 205 | check_sections(original, chinese) 206 | else: 207 | generate_report(original, chinese) 208 | 209 | print("\n" + "="*60) 210 | print("📝 MAINTENANCE RECOMMENDATIONS:") 211 | print("="*60) 212 | print("1. Run this script monthly to check for updates") 213 | print("2. Pay special attention to new tools and articles") 214 | print("3. Verify that all GitHub project links are working") 215 | print("4. Consider adding a 'Last Updated' date to the Chinese README") 216 | print("="*60) 217 | 218 | if __name__ == "__main__": 219 | main() -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Awesome eBPF [![Awesome](https://awesome.re/badge.svg)](https://github.com/sindresorhus/awesome) 2 | 3 | > eBPF 相关项目的精选列表。 4 | 5 | BPF,即伯克利数据包过滤器(Berkeley Packet Filter),是一个运行从用户空间传递的程序的内核虚拟机。BPF 最初在 BSD 上实现,随后被移植到 Linux,在内核中运行"经典 BPF"或 cBPF 虚拟机,被 tcpdump 等工具用于过滤数据包,以避免将数据复制到用户空间。最近,Linux 中的 BPF 基础设施已经完全重构,产生了"扩展 BPF"(eBPF),它获得了新功能(程序安全性和终止检查、JIT 编译、持久化映射、标准库、硬件卸载支持等),现在可用于多种任务。在极低层级(XDP)处理数据包、跟踪和监控系统事件、为 cgroups 实施访问控制等,都是 eBPF 提供高性能、可编程性和灵活性的应用实例。 6 | 7 | 最近,[Cilium](https://cilium.io) 推出了一个关于 eBPF 的优秀网站 [ebpf.io](https://ebpf.io/)。它与本列表有相似的作用,提供了 [eBPF 简介](https://ebpf.io/what-is-ebpf) 以及相关项目的链接。 8 | 9 | > 注意:eBPF 是一项令人兴奋的技术,其生态系统正在快速发展。我们非常欢迎您的帮助,以保持这个列表的时效性,并以任何可能的方式提高其信噪比。请随时在[这里](https://github.com/zoidbergwill/awesome-ebpf/issues)留下您的反馈。 10 | 11 | ## 目录 12 | 13 | - [参考文档](#reference-documentation) 14 | - [文章和演示](#articles-and-presentations) 15 | - [教程](#tutorials) 16 | - [示例](#examples) 17 | - [eBPF 工作流:工具和实用程序](#ebpf-workflow-tools-and-utilities) 18 | - [eBPF 相关项目](#projects-related-to-ebpf) 19 | - [eBPF 在安全领域的应用](#ebpf-in-security) 20 | - [源代码](#the-code) 21 | - [开发和社区](#development-and-community) 22 | - [其他 eBPF 资源列表](#other-lists-of-resources-on-ebpf) 23 | - [致谢](#acknowledgement) 24 | 25 | ## 参考文档 26 | 27 | ### eBPF 基础知识 28 | 29 | - [ebpf.io](https://ebpf.io/) - eBPF 基础知识的门户网站,包括主要相关项目和社区资源列表。 30 | - [Cilium's BPF and XDP Reference Guide](http://docs.cilium.io/en/latest/bpf/) - 关于 eBPF 大多数特性和方面的深入文档。 31 | 32 | ### 内核文档 33 | 34 | - [BPF 文档](https://www.kernel.org/doc/html/latest/bpf/index.html) - Linux 内核 BPF 相关文档的索引。 35 | - [linux/Documentation/networking/filter.rst](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/filter.rst) - eBPF 规范(略有过时;信息仍然有效,但不全面)。 36 | - [BPF 设计问答](https://www.kernel.org/doc/html/latest/bpf/bpf_design_QA.html) - 关于 BPF 基础架构设计决策的常见问题。 37 | - [如何与 BPF 子系统交互](https://www.kernel.org/doc/html/latest/bpf/bpf_devel_QA.html) - 关于 eBPF 开发贡献的常见问题。 38 | 39 | ### 手册页面 40 | 41 | - [`bpf(2)`](http://man7.org/linux/man-pages/man2/bpf.2.html) - 用于从用户空间管理 BPF 程序和映射的系统调用 `bpf()` 的手册页。 42 | - [`tc-bpf(8)`](http://man7.org/linux/man-pages/man8/tc-bpf.8.html) - 关于如何与 tc 一起使用 BPF 的手册页,包括示例命令和代码示例。 43 | - [`bpf-helpers(7)` 手册页](http://man7.org/linux/man-pages/man7/bpf-helpers.7.html) - 描述组成 BPF 标准库的内核帮助程序函数。 44 | 45 | ### 其他 46 | 47 | - [IO Visor 的非官方 eBPF 规范](https://github.com/iovisor/bpf-docs/blob/master/eBPF.md) - eBPF 语法和操作码摘要。 48 | - [Jesper Dangaard Brouer的文档](https://prototype-kernel.readthedocs.io/en/latest/bpf/index.html) - 正在进行中,欢迎贡献。 49 | - 来自David Miller发送到[xdp-newbies](http://vger.kernel.org/vger-lists.html#xdp-newbies)邮件列表的邮件: 50 | 51 | - [bpf.h 和你](https://www.spinics.net/lists/xdp-newbies/msg00179.html) 52 | - [从上下文角度讲...](https://www.spinics.net/lists/xdp-newbies/msg00181.html) 53 | - [BPF 验证器概述](https://www.spinics.net/lists/xdp-newbies/msg00185.html) 54 | 55 | - [内核版本中的 BPF 特性列表](https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md) 56 | 57 | ## 文章和演示 58 | 59 | ### 通用的 eBPF 演示文稿和文章 60 | 61 | 如果您刚接触 eBPF,可能想先查看本节中标记为"介绍"的链接。 62 | 63 | - [XDP 和 eBPF 简介](https://blogs.igalia.com/dpino/2019/01/07/introduction-to-xdp-and-ebpf/) - 一篇通俗易懂的介绍,提供了 eBPF 的背景、历史和工作原理。 64 | - eBPF 概览 - Adrian Ratiu 的博客系列,涵盖了 eBPF 基础设施的许多方面。 65 | 66 | - [第一部分:介绍](https://www.collabora.com/news-and-blog/blog/2019/04/05/an-ebpf-overview-part-1-introduction/) 67 | - [第二部分:机器和字节码](https://www.collabora.com/news-and-blog/blog/2019/04/15/an-ebpf-overview-part-2-machine-and-bytecode/) 68 | 69 | - [Ferris Ellis 的 eBPF 博客文章](https://ferrisellis.com/tags/ebpf/) - 包含几篇关于 eBPF 的文章: 70 | - [第一部分:过去、现在和未来](https://ferrisellis.com/content/ebpf_past_present_future/) 71 | - [第二部分:系统调用和映射类型](https://ferrisellis.com/content/ebpf_syscall_and_maps/) 72 | - [BPF 参考指南](https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md) - 来自 bcc 仓库的 BPF C 和 bcc Python 辅助函数指南。 73 | - [使用 BPF 和 XDP 实现内核网络数据路径的可编程化](http://schd.ws/hosted_files/ossna2017/da/BPFandXDP.pdf) - 涵盖 eBPF 和 XDP 所有基础知识的幻灯片(主要针对网络处理)。 74 | - [BSD 数据包过滤器](https://speakerdeck.com/tuxology/the-bsd-packet-filter) - 主要关注跟踪方面。 75 | - [BPF:跟踪及更多](http://www.slideshare.net/brendangregg/bpf-tracing-and-more) - 主要关注跟踪方面。 76 | - [Linux BPF Superpowers](http://www.slideshare.net/brendangregg/linux-bpf-superpowers) - 主要关注跟踪方面,第一部分附带火焰图。 77 | - [IO Visor](https://www.socallinuxexpo.org/sites/default/files/presentations/Room%20211%20-%20IOVisor%20-%20SCaLE%2014x.pdf) - 也介绍了[IO Visor项目](https://www.iovisor.org/)。 78 | - [BPF - 内核虚拟机](http://vger.kernel.org/netconf2015Starovoitov-bpf_collabsummit_2015feb20.pdf) - eBPF的作者发表的演讲。 79 | - [扩展扩展BPF](https://lwn.net/Articles/603983/) - 2014年的一篇博客文章,介绍BPF的开发并演示了如何使用它进行有状态套接字过滤,通过将eBPF程序附加到套接字。 80 | - Greg Marsden制作了一些关于eBPF的文档: 81 | - [程序类型之旅](https://blogs.oracle.com/linux/notes-on-bpf-1) - 描述了所有现有的BPF程序类型的挂钩及其相关的兴趣点。 82 | - [BPF助手函数](https://blogs.oracle.com/linux/notes-on-bpf-2) - 对内核函数的回顾,这些函数可以从eBPF程序中调用。 83 | - [与用户空间通信](https://blogs.oracle.com/linux/notes-on-bpf-3) - BPF如何与用户空间通信 - BPF映射、perf事件、bpf_trace_printk。 84 | - [构建BPF程序](https://blogs.oracle.com/linux/notes-on-bpf-4) - 设置您的环境以构建BPF程序。 85 | - [BPF字节码和BPF验证器](https://blogs.oracle.com/linux/notes-on-bpf-5) - BPF如何确保程序安全? 86 | - [使用BPF进行数据包转换](https://blogs.oracle.com/linux/notes-on-bpf-6) - 关于数据包转换的一个eBPF用法。 87 | - [通过eBPF观测Linux内核](https://sematext.com/blog/linux-kernel-observability-ebpf/) - 一篇博客文章,介绍了eBPF的基础知识以及如何在Go中编写和加载最小的eBPF程序到内核中的代码示例。 88 | - [eBPF - 程序员的视角](https://www.researchgate.net/publication/349173667_eBPF_-_From_a_Programmer's_Perspective) - 一篇简短的论文,描述了eBPF的基本原理以及如何开始编写eBPF程序。 89 | - [Cloudflare关于eBPF的博客文章](https://blog.cloudflare.com/tag/ebpf/) - 不同的博客文章,涉及关于网络使用案例和eBPF低级方面的内容。 90 | - [Linux扩展BPF(eBPF)跟踪工具](https://www.brendangregg.com/ebpf.html) - 深入收集了使用eBPF的性能分析工具示例的信息。页面最后还有其他资源的部分。 91 | - [eBPF入门指南](https://github.com/lizrice/ebpf-beginners) - 一组现场编码讲座及其附带的代码示例,介绍使用各种库和程序类型进行eBPF编程。 92 | 93 | ### BPF 内部机制 94 | 95 | - Daniel Borkmann已经做了几次关于eBPF内部的演讲和论文,特别是关于它与tc一起使用的。 96 | 97 | - [eBPF 和 XDP 指南以及最新的更新 (2017)](https://fosdem.org/2017/schedule/event/ebpf_xdp/) 98 | - [tc的cls_bpf高级可编程性和最新更新](http://netdevconf.org/1.2/session.html?daniel-borkmann) - 有关eBPF,它在隧道和封装、直接数据包访问等方面的使用等详细信息。 99 | - [自netdev 1.1以来的cls_bpf/eBPF更新](http://netdevconf.org/1.2/slides/oct5/07_tcws_daniel_borkmann_2016_tcws.pdf) - 属于[tc研讨会](http://netdevconf.org/1.2/session.html?jamal-tc-workshop)的一部分。 100 | - [如何使 tc 分类器完全可编程化](http://www.netdevconf.org/1.1/proceedings/slides/borkmann-tc-classifier-cls-bpf.pdf) - 介绍 eBPF,包括几个特性 (映射管理,尾部调用,校验器等)。全文[此处也可获得](http://www.netdevconf.org/1.1/proceedings/papers/On-getting-tc-classifier-fully-programmable-with-cls-bpf.pdf)。 101 | - [Linux tc 和 eBPF](https://archive.fosdem.org/2016/schedule/event/ebpf/attachments/slides/1159/export/events/attachments/ebpf/slides/1159/ebpf.pdf)。 102 | 103 | - [IO Visor 博客](https://www.iovisor.org/resources/blog) 104 | - [Linux 网络解析](http://www.slideshare.net/ThomasGraf5/linux-networking-explained) - Linux 网络内部,其中包括关于 eBPF 的一部分。 105 | 106 | ### 内核跟踪 107 | 108 | - [Linux下的全系统动态追踪:eBPF和bpftrace](https://www.joyfulbikeshedding.com/blog/2019-01-31-full-system-dynamic-tracing-on-linux-using-ebpf-and-bpftrace.html) - 详细介绍了使用eBPF进行追踪的过程,包括列出可用的追踪点和运行bpftrace程序等。 109 | - [eBPF和内核跟踪的初次相遇](http://www.slideshare.net/vh21/meet-cutebetweenebpfandtracing) - Kprobes、uprobes、ftrace等。 110 | - [Linux内核跟踪](http://www.slideshare.net/vh21/linux-kernel-tracing) - Systemtap、Kernelshark、trace-cmd、LTTng、perf-tool、ftrace、hist-trigger、perf、function tracer、tracepoint、kprobe/uprobe等。 111 | - Brendan Gregg的博客,特别是[Linux BPF Superpowers](http://www.brendangregg.com/blog/2016-03-05/linux-bpf-superpowers.html)一文。 112 | 113 | ### XDP 114 | 115 | - [The eXpress Data Path](https://blogs.igalia.com/dpino/2019/01/10/the-express-data-path/) - 一篇介绍XDP的非常易懂的入门文章,提供了示例代码以展示如何处理数据包。 116 | - 所有XDP的细节都在这篇技术论文中:[The eXpress Data Path: Fast Programmable Packet Processing in the Operating System Kernel](https://github.com/tohojo/xdp-paper),作者为Toke Høiland-Jørgensen、Jesper Dangaard Brouer、Daniel Borkmann、John Fastabend、Tom Herbert、David Ahern和David Miller,他们都是重要的eBPF和XDP贡献者。 117 | - [XDP正在进行中的文档](https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/index.html) 118 | - [BPF和XDP参考指南](http://docs.cilium.io/en/latest/bpf/) - Cilium项目的指南。 119 | - [XDP项目概述](https://www.iovisor.org/technology/xdp) 120 | - [eXpress Data Path (XDP)](https://github.com/iovisor/bpf-docs/raw/master/Express_Data_Path.pdf) - 关于XDP的第一份演示文稿。 121 | - [BoF - BPF能为您做些什么?](https://events.linuxfoundation.org/sites/events/files/slides/iovisor-lc-bof-2016.pdf) 122 | - [eXpress Data Path](http://www.slideshare.net/IOVisor/express-data-path-linux-meetup-santa-clara-july-2016) - 包含mlx4驱动程序获得的一些基准测试结果。 123 | - Jesper Dangaard Brouer有几个幻灯片集,描述了XDP的内部内容: 124 | 125 | - [XDP − eXpress Data Path, Intro and future use-cases](http://people.netfilter.org/hawk/presentations/xdp2016/xdp_intro_and_use_cases_sep2016.pdf) - Linux内核与DPDK的比拼。目前(撰写本文时)的XDP未来计划以及与DPDK的比较。 126 | - [Network Performance Workshop](http://netdevconf.org/1.2/session.html?jesper-performance-workshop) - XDP内部机理的额外提示以及预期发展。 127 | - [XDP – eXpress Data Path, Used for DDoS protection](http://people.netfilter.org/hawk/presentations/OpenSourceDays2017/XDP_DDoS_protecting_osd2017.pdf) - 关于XDP详细信息和用例,包括基于IP黑名单方案的基准结果和基于eBPF / XDP的基本DDoS保护的代码片段。 128 | - [Memory vs. Networking, Provoking and fixing memory bottlenecks](http://people.netfilter.org/hawk/presentations/MM-summit2017/MM-summit2017-JesperBrouer.pdf) - XDP开发人员当前内存问题的高级细节。 129 | - [XDP for the Rest of Us](http://netdevconf.org/2.1/session.html?gospodarek) - 如何开始使用eBPF和XDP。Julia Evans也在[她的博客](http://jvns.ca/blog/2017/04/07/xdp-bpf-tutorial/)上对其进行了总结。 130 | - [XDP now with REDIRECT](http://people.netfilter.org/hawk/presentations/LLC2018/XDP_LLC2018_redirect.pdf) - XDP的更新,特别是重定向操作的更新。 131 | 132 | - [XDP工作坊 -- 介绍、经验及未来发展(视频)](http://netdevconf.org/1.2/session.html?herbert-xdp-workshop) 133 | - [Linux 上的高速数据包过滤](https://cdn.shopify.com/s/files/1/0177/9886/files/phv2017-gbertin.pdf) - 关于 Linux 上的数据包过滤、DDoS 保护、内核中的数据包处理、内核旁路、XDP 和 eBPF。 134 | - [如何每秒丢弃 1000 万个数据包](https://blog.cloudflare.com/how-to-drop-10-million-packets/) - Cloudflare 的博客文章,介绍了他们使用 XDP 进行数据包过滤的经验。 135 | 136 | ### AF_XDP 137 | 138 | - [AF_XDP](https://www.kernel.org/doc/html/latest/networking/af_xdp.html) - AF_XDP地址族的内核文档。 139 | - [在Linux中使用AF_XDP实现快速数据包处理](https://archive.fosdem.org/2018/schedule/event/af_xdp/)。 140 | 141 | ### bpfilter 142 | 143 | - [为什么内核社区要用BPF替换iptables?](https://cilium.io/blog/2018/04/17/why-is-the-kernel-community-replacing-iptables/) - Cilium的一篇博客文章,介绍eBPF和bpfilter的动机,并提供一些例子和链接到使用eBPF和bpfilter的其他项目。 144 | - [bpfilter:配有eBPF的Linux防火墙](https://qmo.fr/docs/talk_20180316_frnog_bpfilter.pdf) - Quentin Monnet的演讲幻灯片,介绍eBPF背景,将bpfilter与iptables进行比较。 145 | 146 | ### BTF 147 | ### BTF 148 | 149 | - [BPF类型格式(BTF)](https://www.kernel.org/doc/html/latest/bpf/btf.html) - 有关BTF的内核文档,解释了如何使用它。 150 | - [使用BTF类型信息增强Linux内核](https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html) - 介绍了使用BTF为BPF程序提供调试信息的工作。 151 | 152 | ### cBPF 153 | 154 | ### 传统BPF 155 | 156 | - [BSD 数据包过滤器:用户级数据包捕获的新架构](http://www.tcpdump.org/papers/bpf-usenix93.pdf) - 有关 (经典的) BPF 的原始论文。 157 | - [FreeBSD 中有关 BPF 的手册页面](https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4) 158 | - [Linux 的 packet mmap(2), BPF 和 Netsniff-NG](http://borkmann.ch/talks/2013_devconf.pdf) 159 | - [tc 和 cls bpf:使用 BPF 进行轻量级数据包分类](http://borkmann.ch/talks/2014_devconf.pdf) 160 | - [介绍 Cloudflare 的 BPF 工具](https://blog.cloudflare.com/introducing-the-bpf-tools/) - 使用 `xt_bpf` 模块和 BPF 字节码来操作 iptables。 161 | - [Libpcap 过滤器语法](http://biot.com/capstats/bpf.html) 162 | 163 | ### 硬件卸载 164 | 165 | - [eBPF/XDP 硬件卸载到 SmartNICs](http://netdevconf.org/1.2/session.html?jakub-kicinski) - Netronome 引入的针对带有 TC 或 XDP(Linux kernel 4.9+)的 eBPF 的硬件卸载方案。 166 | - [全面的 XDP 卸载——处理边缘情况](https://www.netdevconf.org/2.2/session.html?viljoen-xdpoffload-talk) - 上述主题的更新。 167 | - [hBPF - eBPF 在硬件中的实现](https://github.com/rprinz08/hBPF) - 针对 FPGAs 编写的 eBPF CPU。 168 | - [OpenCSD eBPF SSD 卸载](https://github.com/Dantali0n/qemu-csd) - 计算存储模拟(QEMU)平台,使用 FUSE LFS 文件系统和 uBPF 进行计算内核卸载,适用于分区命名空间 NVMe SSD,全部在用户空间中。 169 | 170 | ## 教程 171 | 172 | - [bcc 参考指南](https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md) - 许多增量步骤来开始使用 bcc 和 eBPF,大多集中在跟踪和监视上。 173 | - [bcc Python 开发者教程](https://github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.md) - 随 bcc 一起提供,但针对 Python 代码,共包含十七个“课程”。 174 | - [使用 libbpf-bootstrap 构建 BPF 应用程序](https://nakryiko.com/posts/libbpf-bootstrap/) - 帮助生成启动自己应用程序的最小或高级模板(内核侧和用户空间管理映射和程序),具有诸如 CO-RE、全局变量和环形缓冲区之类的功能。 175 | - [我是如何使用纯 C 和 eBPF 编写 opensnoop 的](https://bolinfest.github.io/opensnoop-native/) - 对如何编写 eBPF 程序进行彻底介绍,首先仅使用 bpf() 系统调用,然后使用 libbpf 库,以及可复现的代码示例。 176 | - [Linux 跟踪工作坊材料](https://github.com/goldshtn/linux-tracing-workshop) - 使用多个 BPF 工具进行跟踪。 177 | - [使用 Linux tracepoints、perf 和 eBPF 跟踪数据包行程](https://blog.yadutaf.fr/2017/07/28/tracing-a-packet-journey-using-linux-tracepoints-perf-ebpf/) - 使用 perf 和 bcc 程序解决 ping 请求和响应的问题。 178 | - [Open NFP 平台](https://open-nfp.org/dataplanes-ebpf/technical-papers/) - 由 Netronome 运营:一些与网络相关的 eBPF 应用实例教程,包括 eBPF 拦截入门指南。 179 | - [XDP for the Rest of Us](http://netdevconf.org/2.1/session.html?gospodarek) - 一个工作坊的第一版,用于开始学习 XDP。 180 | - [XDP for the Rest of Us](https://www.netdevconf.org/2.2/session.html?gospodarek-xdp-workshop) - 第二版,带有新的内容。 181 | - [使用 ip(iproute2)命令加载 XDP 程序](https://medium.com/@fntlnz/load-xdp-programs-using-the-ip-iproute2-command-502043898263) 182 | - [XDP 实践教程](https://github.com/xdp-project/xdp-tutorial) - 渐进式(包含三个难度级别)的教程,学习如何使用 XDP 处理数据包。 183 | - [所有的跟踪都属于 BPF](https://www.trailofbits.com/post/all-your-tracing-are-belong-to-bpf) - 一步步指导的过程,将跟踪能力集成到您的 C++ 应用程序中,使用 LLVM 库。 184 | 185 | ## 示例 186 | 187 | - [linux/samples/bpf/](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/samples/bpf) - 内核树:一些 eBPF 程序示例。 188 | - [linux/tools/testing/selftests/bpf](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/bpf) - 内核树:Linux BPF 自测,包含许多 eBPF 程序。 189 | - [prototype-kernel/kernel/samples/bpf](https://github.com/netoptimizer/prototype-kernel/tree/master/kernel/samples/bpf) - Jesper Dangaard Brouer 的原型内核存储库包含一些可以在内核基础设施之外编译的附加示例。 190 | - [iproute2/examples/bpf/](https://git.kernel.org/pub/scm/network/iproute2/iproute2-next.git/tree/examples/bpf) - 一些网络程序用于连接到 TC 接口。 191 | - [Netronome sample network applications](https://github.com/Netronome/bpf-samples/) - 提供基本但完整的 eBPF 应用程序示例,也与硬件卸载兼容。 192 | - [bcc/examples](https://github.com/iovisor/bcc/tree/master/examples) - 与 bcc 工具一起提供的示例,主要与跟踪有关。 193 | - [bcc/tools](https://github.com/iovisor/bcc/tree/master/tools) - 这些工具本身可以被视为 BPF 程序的示例用例,主要用于追踪和监视。 bcc 工具已针对一些 Linux 发行版进行了打包。 194 | - [MPLSinIP sample](https://github.com/fzakaria/eBPF-mpls-encap-decap) - 大量注释的示例,演示了如何在 IP 中封装和解封装 MPLS。 该代码适用于 BPF 开发新手。 195 | - [ebpf-samples](https://github.com/vbpf/ebpf-samples) - 多个项目中收集的编译(作为 ELF 对象文件)的示例集合,主要用作用户空间验证器的测试用例。 196 | - [ebpf-kill-example](https://github.com/niclashedam/ebpf-kill-example) - 完全记录和测试过的 eBPF 探针示例,可记录所有强制终止并在用户空间中将其打印出来。 197 | - [redbpf examples](https://github.com/foniod/redbpf/tree/main/examples) - 使用 RedBPF 编写 Rust eBPF 程序的示例程序。 198 | 199 | ## eBPF 工作流:工具和实用程序 200 | 201 | ### bcc 202 | 203 | - [bcc](https://github.com/iovisor/bcc/) - 框架和工具 - 一种处理 BPF 程序的方法,特别是用于跟踪和监控。还包括一些实用程序,可帮助检查系统中的映射或程序。 204 | - [bcc 的 Lua 前端](https://github.com/iovisor/bcc/tree/master/src/lua) - 另一种替代 C,甚至是 bcc 中大多数 Python 代码的选择。 205 | 206 | ### iproute2 207 | 208 | - [iproute2](https://git.kernel.org/pub/scm/network/iproute2/iproute2.git) - 这个软件包包含了在 Linux 上进行网络管理的工具,其中包括了用于管理 eBPF 过滤器和动作的 `tc`,以及用于管理 XDP 程序的 `ip`。大多数与 BPF 相关的代码都在 lib/bpf.c 中。 209 | - [iproute2-next](https://git.kernel.org/pub/scm/network/iproute2/iproute2-next.git) - 这是 iproute2 的开发树,与 net-next 同步更新。 210 | 211 | ### LLVM 212 | ### LLVM 213 | 214 | - [LLVM](https://llvm.org/) - 包含在 eBPF 工作流程中广泛使用的多个工具。最新版本的 Ubuntu/Debian 快照可以从 [这里](http://apt.llvm.org/) 获取。 215 | 216 | - clang被用来将C语言编译成eBPF格式的ELF目标文件(需使用clang v3.7.1+)。 BPF后端是通过[此提交](https://reviews.llvm.org/D6494)添加的。 217 | - llvm-objdump用于以人类可读的格式转储目标文件的内容,可能包括初始的C源代码(需使用llvm-objdump v4.0+)。 218 | - llvm-mc用于从LLVM中间表示编译成eBPF目标文件,因此可以从C语言编译成eBPF汇编语言,进而修改汇编代码,最后编译成ELF文件。 219 | 220 | ### libbpf 221 | 222 | - [libbpf](https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git/tree/tools/lib/bpf) - 一个用于处理BPF对象(程序和映射)和操作包含它们的ELF对象文件的C库。它随内核一起提供,并在[GitHub上进行了镜像](https://github.com/libbpf/libbpf)。 223 | - [libbpf-bootstrap](https://github.com/libbpf/libbpf-bootstrap) - 用于使用libbpf和BPF CO-RE进行BPF应用开发的脚手架。 224 | 225 | ### Go 库 226 | 227 | - [cilium/ebpf](https://github.com/cilium/ebpf) - 纯Go库,用于读取、修改、加载eBPF程序并将其附加到Linux内核中的各种钩子。 228 | - [libbpfgo](https://github.com/aquasecurity/libbpfgo) - 由libbpf支持的用于Go的eBPF库。 229 | - [gobpf](https://github.com/iovisor/gobpf) - 用于创建eBPF程序的BCC的Go绑定。 230 | 231 | ### Aya 232 | 233 | - [aya](https://github.com/aya-rs/aya) - 一种用纯 Rust 编写、加载和管理 eBPF 对象的库,专注于开发人员体验和可操作性。它支持在 Rust 中编写 eBPF 程序,并通过 crates.io 分发库代码以在 eBPF 程序之间共享。Aya 不依赖于 libbpf。 234 | - [aya-template](https://github.com/aya-rs/aya-template) - 用于在 Aya 中编写 BPF 应用程序的模板,可以与 [`cargo generate`](https://github.com/cargo-generate/cargo-generate) 一起使用。 235 | 236 | ### zbpf 237 | 238 | - [zbpf](https://github.com/tw4452852/zbpf) - 一个用纯 Zig 编写的跨平台 eBPF 程序框架,由 libbpf 和 Zig 工具链提供支持。 239 | 240 | ### eunomia-bpf 241 | 242 | - [eunomia-bpf](https://github.com/eunomia-bpf/eunomia-bpf) - 一个编译框架和运行库,可用于构建、分发、动态加载和运行多语言和WebAssembly的CO-RE eBPF应用程序。它支持仅写eBPF内核代码(以构建简单的CO-RE libbpf eBPF应用程序)、同时以BCC和libbpf风格编写内核部分,以及在WASM模块中以多种语言编写用户空间,并使用简单的JSON数据或WASM OCI镜像分发它。运行时仅基于libbpf,并提供CO-RE给BCC-style的eBPF程序,而不依赖于LLVM库。 243 | 244 | ### oxidebpf 245 | 246 | - [oxidebpf](https://github.com/redcanaryco/oxidebpf) - 一个纯Rust库,用于管理eBPF程序,专为安全用例设计。功能集比其他库更有限,但强调在广泛的内核范围和向后兼容的编译一次运行多个地方方面的稳定性。 247 | 248 | ### bpftool和内核树中的其他工具 249 | 250 | - [bpftool](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpftool) - 还有一些其他内核树中的工具,位于版本早于4.15的[linux/tools/net/](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/net?h=v4.14),或者之后的[linux/tools/bpf/](https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git/tree/tools/bpf)。 251 | 252 | - [`bpftool`](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpftool) - 一个通用的实用工具,可用于与eBPF程序和用户空间映射进行交互,例如显示、转储、加载、反汇编、附着和分离程序到控制组,或显示、创建、固定、更新、删除映射。 253 | - [`bpf_asm`](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpf_asm.c) - 一个最小的cBPF汇编器。 254 | - [`bpf_dbg`](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpf_dbg.c) - 一个用于cBPF程序的小型调试器。 255 | - [`bpf_jit_disasm`](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpf_jit_disasm.c) - 一种适用于两种BPF语言的反汇编器,对JIT调试非常有用。 256 | 257 | ### 用户空间 eBPF 258 | 259 | - [uBPF](https://github.com/iovisor/ubpf/) - 用 C 编写。包含一个解释器、一个用于 x86_64 架构的 JIT 编译器、一个汇编器和反汇编器。 260 | - [A generic implementation](https://github.com/YutaroHayakawa/generic-ebpf) - 支持 FreeBSD kernel、FreeBSD user space、Linux kernel、Linux user space 和 macOS user space。用于 [VALE 软件交换机](https://www.unix.com/man-page/freebsd/4/vale/) 的 [BPF 扩展模块](https://github.com/YutaroHayakawa/vale-bpf)。 261 | - [rbpf](https://github.com/qmonnet/rbpf) - 用 Rust 编写。用于 Linux、macOS 和 Windows 的解释器,以及在 Linux 下用于 x86_64 的 JIT 编译器。 262 | - [PREVAIL](https://github.com/vbpf/ebpf-verifier) - 用于 eBPF 的用户空间验证器,[使用抽象解释层实现](https://elazarg.github.io/pldi19main-final.pdf),支持循环。 263 | - [oster](https://github.com/grantseltzer/oster) - 用 Go 编写。通过将 eBPF 附加到 uprobes 来跟踪 Go 程序的执行的工具。 264 | - [wachy](https://rubrikinc.github.io/wachy/) - 一款追踪分析器,旨在通过将跟踪结果显示在源代码旁边并允许交互式分析以简化 eBPF uprobes 调试的使用。 265 | 266 | ### 其他平台上的eBPF 267 | 268 | - [eBPF for Windows](https://github.com/microsoft/ebpf-for-windows) - 这个项目还在进行中,它允许使用现有的eBPF工具链和Linux生态系统中熟悉的API在Windows上使用。 269 | 270 | ### 在虚拟环境中进行测试 271 | 272 | - [Vagrant设置](https://github.com/iovisor/xdp-vagrant) - 方便测试XDP。现在通用的XDP已经存在,所以用处较少(独立于驱动程序,主要用于测试)。 273 | - [Docker容器中的bcc](https://github.com/zlim/bcc-docker)。 274 | 275 | ## eBPF 相关项目 276 | 277 | ### 网络 278 | 279 | - P4 与 eBPF 有一些交互: 280 | 281 | - [P4 on the Edge](https://schd.ws/hosted_files/2016p4workshop/1d/Intel%20Fastabend-P4%20on%20the%20Edge.pdf) - 使用 eBPF 创建高性能可编程交换机的 P4。 282 | - [OvS Orbit episode (#11),名为 P4 on the Edge](https://ovsorbit.org/#e11) - 相关于前一条项目。由 Open vSwitch 核心维护者之一的 Ben Pfaff 对 John Fastabend 进行的音频采访。 283 | - [P4、EBPF 和 Linux TC Offload](https://open-nfp.org/m/documents/Open_NFP_P4_EBPF_Linux_TC_Offload_FINAL_5JHLETS.pdf) - 部分与 Netronome NFP 网络流处理器架构上的 eBPF 硬件卸载相关的 P4。 284 | - [P4 使用 eBPF 的旧文档](https://github.com/iovisor/bcc/tree/master/src/cc/frontends/p4) - 来自 bcc 存储库;由下面链接的 P4_16 后端弃用。 285 | - [eBPF 的 P4_16 后端](https://github.com/p4lang/p4c/blob/master/backends/ebpf/README.md)。 286 | 287 | - [Cilium](https://cilium.io/) 项目 ([GitHub 代码库](https://github.com/cilium/cilium)) 是一项依赖于 BPF 和 XDP 技术的项目,可为基于容器的快速内核网络和安全策略实施提供“即时生成的eBPF程序”的支持。有许多演示文稿可用(有些内容重复): 288 | 289 | - [Cilium:使用BPF和XDP为容器提供网络和安全性](http://www.slideshare.net/ThomasGraf5/clium-container-networking-with-bpf-xdp) - 还包括负载均衡用例 290 | - [Cilium:使用BPF和XDP为容器提供网络和安全性](http://www.slideshare.net/Docker/cilium-bpf-xdp-for-containers-66969823) - [视频](https://www.youtube.com/watch?v=TnJF7ht3ZYc&list=PLkA60AVN3hh8oPas3cq2VA9xB7WazcIgs) 291 | - [Cilium: 使用BPF和XDP实现快速IPv6容器网络](http://www.slideshare.net/ThomasGraf5/cilium-fast-ipv6-container-networking-with-bpf-and-xdp) 292 | - [Cilium:容器的BPF和XDP](https://fosdem.org/2017/schedule/event/cilium/) 293 | - [OvS Orbit 第四集](https://ovsorbit.benpfaff.org/) - Ben Pfaff采访了Thomas Graf。 294 | - [Cilium的通用介绍](https://opensource.googleblog.com/2016/11/cilium-networking-and-security.html) 295 | - [采访Thomas Graf的播客](http://blog.ipspace.net/2016/10/fast-linux-packet-forwarding-with.html) - Ivan Pepelnjak在2016年十月采访了Thomas,谈论了eBPF、P4、XDP和Cilium。 296 | 297 | - Open vSwitch (OvS)以及相关项目Open Virtual Network (OVN,一款开源的网络虚拟化解决方案)正在考虑在各个级别上使用eBPF: 298 | 299 | - [使用eBPF卸载OVS流处理](http://openvswitch.org/support/ovscon2016/7/1120-tu.pdf) 300 | - [将OVN的灵活性与IOVisor的效率相结合](http://openvswitch.org/support/ovscon2016/7/1245-bertrone.pdf) 301 | 302 | - [Katran](https://code.fb.com/open-source/open-sourcing-katran-a-scalable-network-load-balancer/) - 一个基于XDP且由Facebook开源的第四层负载均衡器。 303 | - [XDP实践:将XDP集成到我们的DDoS应对流程中](http://netdevconf.org/2.1/session.html?bertin) - Cloudflare使用XDP进行DDoS防护。 304 | - [Droplet: 由BPF + XDP驱动的DDoS应对措施](http://netdevconf.org/2.1/session.html?zhou) - Facebook使用XDP进行DDoS防护。 305 | - [DPDK有一个基于AF_XDP的轮询模式驱动程序(PMD)](https://dpdkuserspace2018.sched.com/event/G45Z/dpdk-pmd-for-afxdp) 306 | - [XDP的CETH](http://www.slideshare.net/IOVisor/ceth-for-xdp-linux-meetup-santa-clara-july-2016) - 用于更快速的网络输入/输出的通用以太网驱动程序框架,由Mellanox发起。 307 | - Suricata是一款开源入侵检测系统,[依赖于eBPF组件](https://www.stamus-networks.com/2016/09/28/suricata-bypass-feature/)来实现其“捕获绕过”功能。 308 | 309 | - [Suricata文档中“eBPF和XDP”部分](http://suricata.readthedocs.io/en/latest/capture-hardware/ebpf-xdp.html?highlight=XDP#ebpf-and-xdp) 310 | - [SEPTun-Mark-II](https://github.com/pevma/SEPTun-Mark-II) - 极致性能调优指南 - Mark II。 311 | - [介绍此特性的博客文章](https://www.stamus-networks.com/2016/09/28/suricata-bypass-feature/) 312 | - [一只Suricate在eBPF领域的冒险经历](http://netdevconf.org/1.2/slides/oct6/10_suricata_ebpf.pdf) 313 | - [一只浣熊的视角看eBPF和XDP](https://www.slideshare.net/ennael/kernel-recipes-2017-ebpf-and-xdp-eric-leblond)。 314 | 315 | - [Project Calico](https://projectcalico.docs.tigera.io/about/about-calico) - Calico是一个开源的网络和网络安全解决方案,针对容器、虚拟机和本地主机负载。Calico的eBPF数据平面提供低延迟、高吞吐量的数据平面和丰富的网络安全策略模型。 316 | - [使用Calico启用eBPF数据平面](https://projectcalico.docs.tigera.io/maintenance/ebpf/enabling-bpf) 317 | - [merbridge](https://github.com/merbridge/merbridge/) - 使用eBPF加速您的Service Mesh。Merbridge使用eBPF替换iptables规则以拦截流量。它还结合了msg_redirect以减少延迟,并在sidecars和服务之间缩短了数据路径。 318 | 319 | ### 可观测性 320 | 321 | - [InKeV: In-Kernel Distributed Network Virtualization for DCN](https://github.com/iovisor/bpf-docs/blob/master/university/sigcomm-ccr-InKev-2016.pdf) 322 | - [DEEP-mon](https://www.slideshare.net/necstlab/deepmon-dynamic-and-energy-efficient-power-monitoring-for-containerbased-infrastructures) - 用于测量服务器能耗的工具,利用eBPF程序进行数据聚合处理。 323 | - [pixie](https://github.com/pixie-io/pixie) - 使用eBPF进行Kubernetes的可观测性分析。支持协议跟踪,应用程序分析以及分布式bpftrace部署等功能。 324 | - [SkyWalking Rover](https://github.com/apache/skywalking-rover) - [Apache SkyWalking](https://skywalking.apache.org/)是一个专门为分布式微服务、云原生和基于容器(Kubernetes)架构而设计的开源应用程序性能监控(APM)平台。SkyWalking Rover是一个基于eBPF的调试器和度量收集器,支持C、C++、Golang和Rust应用程序。 325 | - [parca-agent](https://github.com/parca-dev/parca-agent) - 基于eBPF的持续分析CPU和内存使用情况的分析器,可分析到代码行和时间流逝情况。 326 | - [rbperf](https://github.com/javierhonduco/rbperf) - 用于Ruby的采样分析器和跟踪器。 327 | - [Hubble](https://github.com/cilium/hubble) - 使用eBPF为Kubernetes提供网络、服务和安全可观测性。 328 | - [Caretta](https://github.com/groundcover-com/caretta) - 通过eBPF生成的即时Kubernetes服务依赖图,可直接输出到Grafana示例。 329 | 330 | ### 安全 331 | 332 | - [Falco](https://falco.org/) - 一款云原生的运行时安全项目,用作 Kubernetes 威胁检测引擎。 333 | - [Sysmon for Linux](https://github.com/Sysinternals/SysmonForLinux) - 一款安全监控工具。它依赖于[SysinternalsEBPF](https://github.com/Sysinternals/SysinternalsEBPF)。 334 | - [Red Canary Linux Agent](https://redcanary.com/blog/ebpf-for-security) - Red Canary 已经开始将 eBPF 纳入其 Linux 安全传感器。 335 | - [Tracee](https://github.com/aquasecurity/tracee) - 一款用于 Linux 的运行时安全和取证工具,它使用 eBPF 技术对系统和应用程序进行跟踪,在运行时分析收集的事件以检测可疑的行为模式。 336 | - [redcanary-ebpf-sensor](https://github.com/redcanaryco/redcanary-ebpf-sensor) - 一组 BPF 程序,从 Linux 内核中收集与安全相关的事件数据。BPF 程序组合成一个单独的 ELF 文件,可以根据运行的操作系统和内核版本选择性加载单个探针。 337 | - [bpflock - 锁定 Linux 机器](https://github.com/linux-lock/bpflock) - 一种基于 eBPF 的安全工具,用于锁定和审计 Linux 机器。 338 | - [Tetragon](https://github.com/cilium/tetragon) - 面向 Kubernetes、基于 eBPF 的安全监测和运行时强制执行工具。 339 | 340 | ### 工具 341 | 342 | - [ply](https://wkz.github.io/ply/) - 一个 Linux 的小型而灵活的开源动态跟踪器,具有类似于 bcc 工具的功能,但语言更简单,灵感来自 awk 和 DTrace。 343 | - [bpftrace](https://bpftrace.org/) - 一个使用自己的高级跟踪语言进行跟踪的工具。它足够灵活,可以被想象成 DTrace 和 SystemTap 的 Linux 替代品。 344 | - [bpftrace Cheat Sheet](https://www.brendangregg.com/BPF/bpftrace-cheat-sheet.html) - bpftrace 编程的摘要和备忘单。 包含有关语法,探针类型,变量和函数的信息。 345 | - [kubectl trace](https://github.com/iovisor/kubectl-trace) - 一个用于在 Kubernetes 集群中执行 bpftrace 程序的 kubectl 插件。 346 | - [inspektor-gadget](https://github.com/inspektor-gadget/inspektor-gadget) - 基于 eBPF 的工具集合,用于调试和检查 Kubernetes 资源和应用程序。 347 | - [bpfd](https://github.com/genuinetools/bpfd) - 运行带有 Linux 规则的 BPF 程序的框架。 容器感知。 348 | - [BPFd](https://github.com/joelagnel/bpfd) - 明显的 BPF 守护程序,试图利用 bcc 工具的灵活性来跟踪和调试远程目标,特别是在运行 Android 的设备上。 349 | - [adeb](https://github.com/joelagnel/adeb) - 用于在拥有 BPFd 的 Android 上使用跟踪工具的 Linux shell 环境。 350 | - [greggd](https://github.com/olcf/greggd) - 系统守护进程,用于将 eBPF 程序编译和加载到内核中,并将程序输出转发到套接字以进行度量聚合。 351 | - [FUSE](https://events.linuxfoundation.org/wp-content/uploads/2017/11/When-eBPF-Meets-FUSE-Improving-Performance-of-User-File-Systems-Ashish-Bijlani-Georgia-Tech.pdf) - 考虑使用 eBPF。 352 | - [upf-bpf](https://github.com/navarrothiago/upf-bpf) - 基于 XDP 的内核解决方案,适用于 5G UPF。 353 | - [redbpf](https://github.com/foniod/redbpf) - 用于高效编写 Rust 中的 eBPF 代码的工具和框架。 354 | 355 | # eBPF 在安全领域的应用 356 | 357 | - [Embrace The Red: Offensive BPF!](https://embracethered.com/blog/tags/ebpf) - 一系列关于BPF介绍的文章,侧重于攻击性场景,以及如何检测其滥用。其中包括关于eBPF的rootkit能力的讨论,或者哪种追踪类型适用于不同的用例。 358 | - [eBPF: Block Linux Fileless Payload "Malware" Execution with BPF LSM](https://djalal.opendz.org/post/ebpf-block-linux-fileless-payload-execution-with-bpf-lsm/) - 关于BPF如何帮助检测和阻止无文件恶意软件的博客文章。 359 | - [Blackhat 2021: With Friends Like eBPF, Who Needs Enemies?](https://www.blackhat.com/us-21/briefings/schedule/#with-friends-like-ebpf-who-needs-enemies-23619) - 讲述一种eBPF rootkit以及eBPF能力的滥用。此rootkit也成为Defcon上的一个演讲主题,[eBPF, I thought we were friends !](https://defcon.org/html/defcon-29/dc-29-speakers.html#fournier)。 360 | - [ebpfkit](https://github.com/Gui774ume/ebpfkit) - 利用多种eBPF特性实施攻击性安全技术的rootkit。 361 | - [ebpfkit-monitor](https://github.com/Gui774ume/ebpfkit-monitor) - 一个实用程序,可在运行时静态分析eBPF字节码或监视可疑的eBPF活动。它专为检测ebpfkit而设计。 362 | - [Bad BPF](https://github.com/pathtofile/bad-bpf) - 恶意eBPF程序的集合,利用eBPF在用户模式程序和内核之间读写用户数据的能力。 363 | - [TripleCross](https://github.com/h3xduck/TripleCross) - 一个Linux eBPF rootkit,具有后门、C2、库注入、执行劫持、持久性和隐蔽性能力。 364 | 365 | ## 代码 366 | 367 | - [linux/include/linux/bpf.h](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/bpf.h) - 包含与eBPF相关定义的头文件,适用于内核开发和用户空间交互。 368 | - [linux/include/linux/filter.h](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/filter.h) - 包含用于运行BPF程序本身的信息。 369 | - [linux/kernel/bpf/](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/bpf) - 此目录包含大部分与BPF相关的代码。特别是以下文件值得关注:。 370 | 371 | - [`syscall.c`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/bpf/syscall.c) - 系统调用允许的各种操作,如程序加载或映射管理。 372 | - [`core.c`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/bpf/core.c) - BPF 解释器。 373 | - [`verifier.c`](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/bpf/verifier.c) - BPF 验证器。 374 | 375 | - [linux/net/core/filter.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/net/core/filter.c) - 与网络相关的函数和 eBPF 帮助程序(TC,XDP 等);还包含将 cBPF 字节码迁移到 eBPF 的代码(所有 cBPF 程序在近期内核中都被转换为 eBPF)。 376 | - [linux/kernel/trace/bpf_trace.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/trace/bpf_trace.c) - 与跟踪和监控相关的函数和 eBPF 帮助程序(kprobes,tracepoints 等)。 377 | - JIT 编译器位于其各自体系结构的目录下,例如文件 [linux/arch/x86/net/bpf_jit_comp.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/net/bpf_jit_comp.c) 用于 x86. 对于用于硬件卸载的 JIT 编译器,其驱动程序会有相应的文件,例如 [linux/drivers/net/ethernet/netronome/nfp/bpf/jit.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/net/ethernet/netronome/nfp/bpf/jit.c) 是针对 Netronome NFP 的。 378 | - [linux/net/sched/](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/net/sched) - 特别是在文件 `act_bpf.c`(操作)和 `cls_bpf.c`(过滤器)中:与使用 TC 的 BPF 操作和过滤器相关的代码。 379 | - [linux/kernel/seccomp.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/seccomp.c) 380 | - [linux/net/core/dev.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/net/core/dev.c) - 包含函数 `dev_change_xdp_fd()`,该函数通过一个 Netlink 命令调用,将 XDP 程序钩到设备上,然后将从用户空间加载到内核的程序。该函数会使用相关驱动程序的回调函数。 381 | 382 | ## 开发和社区 383 | 384 | - [bpf-next 树](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/) - BPF 补丁会被合并进这棵树。它会被定期合并到 [net-next](https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git),然后每个版本的发布都会合并到 Linus 的树。 385 | - [内核文档](https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git/tree/Documentation/bpf/bpf_devel_QA.rst) - 关于对 BPF 的贡献。 386 | - [netdev 邮件列表](http://lists.openwall.net/netdev/) - 用于 Linux 内核网络栈开发的邮件列表。所有补丁都会发送到此处进行审核和合并。 387 | - [XDP-newbies](http://vger.kernel.org/vger-lists.html#xdp-newbies) - 专门用于 XDP 编程(包括架构和求助)的邮件列表。 388 | - [IO Visor 邮件列表](http://lists.iovisor.org/pipermail/iovisor-dev/) - BPF 是该项目的核心,经常在邮件列表上讨论。 389 | - [@IOVisor Twitter 账号](https://twitter.com/IOVisor) 390 | - [XDP 协作项目](https://github.com/xdp-project/xdp-project) - 一个 GitHub 仓库,提供关于 XDP 未来发展的笔记和想法。 391 | 392 | ## 其他 eBPF 资源列表 393 | 394 | 395 | - [IO Visor 的 bcc 文档](https://github.com/iovisor/bcc/tree/master/docs) 396 | - [IO Visor 的 bpf-docs 仓库](https://github.com/iovisor/bpf-docs/) 397 | - [深入理解 BPF:阅读材料列表](https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf/) 398 | 399 | ## 致谢 400 | 401 | 感谢 Quentin Monnet 和 Daniel Borkmann 对[深入理解 BPF:阅读材料列表](https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf/)的原创工作,为该列表奠定了基础。 402 | 403 | ## 贡献 404 | 405 | 欢迎贡献!首先请阅读[贡献指南](contributing.md)。 406 | 407 | ## 许可证 408 | 409 | [![知识共享CC0](http://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg)](http://creativecommons.org/publicdomain/zero/1.0) 410 | 411 | 在法律允许的最大范围内,zoidbergwill 已放弃对此作品的所有版权和相关权利。 --------------------------------------------------------------------------------