Microsoft 开源 eBPF for Windows 项目

1,415 阅读4分钟

Microsoft 发布了新的开源项目 eBPF for Windows,以使 eBPF 在 Windows 10 和 Windows Server 2016 及更高版本上工作。eBPF 是kernel 3.15 中引入的新设计,可以在不改变内核源代码或加载内核模块的情况下,在Linux内核中运行沙盒程序。

下文来自 微软官方公告

eBPF 是一项众所周知的革命性技术--提供可编程性、可扩展性和敏捷性。eBPF已被应用于拒绝服务保护和可观察性等用例。随着时间的推移,围绕eBPF已经建立了一个重要的工具、产品和经验的生态系统。尽管对eBPF的支持首先是在Linux内核中实现的,但人们对允许eBPF在其他操作系统上使用的兴趣越来越大,而且除了内核之外,还可以扩展用户模式服务和守护程序。

今天,我们很高兴地宣布了一个新的微软开源项目,以使eBPF在Windows 10和Windows Server 2016及更高版本上工作。ebpf-for-windows项目旨在让开发者在现有版本的Windows之上使用熟悉的eBPF工具链和应用编程接口(API)。在其他人的工作基础上,该项目采用了几个现有的eBPF开源项目,并添加了 "胶水",使其在Windows上运行。

我们现在宣布这个项目,因为我们的目标是与强大的eBPF社区合作,以确保eBPF在Windows和其他地方都能正常运行。

架构概述

下图说明了本项目的架构和相关组件。

image.png

如图所示,现有的eBPF工具链,如clang,可用于从各种语言的源代码生成eBPF字节码。然后,生成的字节码可以被任何应用程序使用,或者通过Windows netsh命令行工具手动使用,这两个工具都使用一个暴露Libbpf API的共享库,尽管这项工作仍在进行中。

该库将eBPF字节码发送到一个静态验证器(PREVAIL验证器),该验证器托管在一个用户模式保护进程中,这是一个Windows安全环境,允许内核组件信任一个由其信任的密钥签署的用户模式守护程序。如果字节码通过了验证器的所有安全检查,该字节码可以被加载到运行在Windows内核模式执行上下文中的uBPF解释器中,或者由uBPF即时编译器JIT)进行编译,并将本地代码加载到内核模式执行上下文中。

安装到内核模式执行上下文的eBPF程序可以附加到各种钩子上,以处理事件和调用eBPF shim暴露的各种辅助API,它在内部包装了公共的Windows内核API,允许在现有版本的Windows上使用eBPF。到目前为止,已经添加了两个钩子(XDP和socket bind),虽然这些是网络专用的钩子,但我们希望随着时间的推移,将添加更多的钩子和助手,而不仅仅是与网络有关的_。_

这是eBPF的一个分支吗?

简而言之,不是。

eBPF for Windows项目利用了现有的开源项目,包括IOVisor uBPF项目PREVAIL验证器,通过为该代码添加Windows特定的托管环境,在Windows之上运行它们。

这是否提供了与为Linux编写的eBPF程序的应用兼容性?

其目的是为使用通用钩子和助手的代码提供源代码兼容性,这些钩子和助手适用于整个操作系统的生态系统。

Linux提供了许多钩子和助手,其中一些是非常具体的Linux(使用Linux内部数据结构,例如),将不适用于其他平台。其他的钩子和助手是普遍适用的,目的是为了支持他们的eBPF程序。

同样,eBPF for Windows项目暴露了Libbpf APIs,为与eBPF程序交互的应用程序提供源代码兼容性。

了解更多和贡献

ebpf-for-windows项目为Windows用户带来了eBPF的力量,并打算最终驻扎在eBPF生态系统中一个社区管理的基础。有了你的投入和帮助,我们可以达到这个目标。

请联系我们或在GitHub上创建一个问题。我们很高兴能继续完善和扩展ebpf-for-windows,使每个人都能从这个项目中受益。我们渴望看到你对这个项目的发现以及它的发展。