专有设备驱动程序

专有设备驱动程序（Proprietary device driver）是指仅以二进制代码发布的闭源设备驱动程序。在自由及开放源代码的语境中，专有设备驱动程序称为blob或二进制 blob（binary blob）。尽管 blob 可以作为十六进制数组包含在源代码中，就像一些在 Linux 内核中的 blob 一样，该术语通常是指加载到开源操作系统内核中的专有内核模块。这个术语有时也适用于在外部运行的代码内核，例如系统固件映像、微代码更新或使用者空间程序。术语 blob 最初指二进制大型物件，即在数据库管理系统中将二进制资料储存为一个单一个体的集合。

当计算机硬件供应商为其产品提供完整的技术文档时，操作系统开发人员能够编写硬件设备驱动程序以包含在操作系统内核中。但是，一些供应商，例如英伟达，不为其某些产品提供完整的文档，而是仅提供二进制格式的驱动程序。这种做法最常见于被加速的图形处理器驱动程序、无线网卡和硬件 RAID 控制器。值得注意的是，二进制 blob 对于非无线网络接口控制器非常少见，它们几乎总是可以通过开箱即用的标准实用程序（如ifconfig）进行配置。

## 开源操作系统

一些自由软件基金会批准的项目力求提供完全自由的操作系统。因此，在硬件文档或设备驱动程序和所有适用固件的源代码不可用时，将删除所有相关二进制 blob；此类项目包括来自FSFLA、Parabola、Devuan、Trisquel和LibreCMC的Linux-libre内核打包。然而，绝大多数开源项目都区分了仅二进制设备驱动程序（blob）和仅二进制固件（固件不被视作 blob )，允许某些专有固件作为其内核的一部分自由分发，并且，对于一些核心贡献者的不同意见，还支持使用外部分发的专有设备驱动程序，为此类专有驱动程序和用户空间提供内部兼容接口组件与他们的系统一起工作。遵循此政策的项目包括Linux内核本身、NetBSD、FreeBSD、DragonFly BSD和大多数Linux发行版。其中一些项目提供了在没有专有固件的情况下安装系统的选项，因此非自由源代码的微代码是可选的。

OpenBSD项目有一个值得注意的政策，不仅不接受任何二进制设备驱动程序进入其源代码树，而且官方也不在其平台上支持任何第三方专有设备驱动程序组件，因为这不仅导致了无法检测或无法修复的安全漏洞的可能性，而且还导致了对其软件的开放性和自由度的侵犯。自由软件基金会正在积极反对二进制 blob。自由软件基金会还认为 OpenBSD 的政策措辞令人困惑，因为 BSD 社区中的“blob”仅指其认为的非自由驱动程序，不适用于专有固件和无源代码的微代码。Debian项目包括来自Linux 内核的自由和非自由二进制固件，并根据 Debian 社会契约清楚地标记和分隔非自由软件包。从 Debian 6.0 开始，这些 blob 已被删除。

对于 OpenBSD，项目负责人西奥·德若特捍卫了只为微代码固件请求分发权的政策。“一旦它们被分发……至少设备可以工作”，暗示他的小项目的成员可以用许多芯片组的汇编语言自己编写免费固件，他恳求“不要让我们承担更多任务”。尽管如此，他还是偏爱无需固件即可运行的芯片组。

<image>

在Linux内核开发社区中，林纳斯·托瓦兹就纯二进制模块的问题发表了强有力的声明，声称：“我什至拒绝考虑将我的手绑在一些纯二进制模块上……我希望人们知道当他们使用纯二进制模块时，这是他们的问题。”2008 年，176位 Linux 内核开发人员签署了一份《关于 Linux 内核模块的立场声明》。我们，以下签名的 Linux 内核开发人员，认为任何闭源 Linux 内核模块或驱动程序都是有害且不受欢迎的。……我们一再发现它们对 Linux 用户、企业和更大的 Linux 生态系统有害。

Linux 内核维护者葛雷格·克罗哈曼表示，为GNU通用公共许可证之下授权的Linux 内核重新分发封闭源代码模块是非法的。

但是，Linux 内核包含各种设备驱动程序所需的闭源固件。Linux-libre是 Linux 内核的一个版本，它试图删除所有二进制 blob，包括无源微码。其维护者Alexandre Oliva在 2011 年写道：“自 1996 年以来，Linux 一直不是自由软件，当时Torvalds 先生接受了他自 1991 年以来发布的 Linux 发行版中的第一批非自由软件。这些年来，虽然这个内核增长了 14 倍，但 Linux 驱动程序所需的非自由固件数量增长了 83 倍，令人震惊。

## 问题

二进制 blob 存在问题的原因有很多，主要有四：

第一，使用者无法准确知道它们的行为，且无法通过源代码审计发现错误；错误通常只有在系统开始出现意外行为时才能通过艰苦的调查来诊断。此类未检测到的错误也可能默默地将用户和系统暴露于安全隐患之中。也因此无法检查驱动程序是否符合其目的，即使发现错误也没有简单的方法来修复它。

其次，由于源代码不可用，驱动程序不能被用户轻易改进，不能移植到最初不支持的架构，也不能适应硬件的轻微改变或在具有更改了 API 和架构的更新版本上运作。

第三，使用该软件会迫使用户相信供应商或第三方不会将后门、间谍软件或恶意代码放入 blob。同样，硬件供应商可以决定不支持给定的操作系统并随时放弃驱动程序维护，或者，如果公司倒闭，驱动程序将完全不受支持。

最后，二进制 blob 可以被视为在相信自由软件理想、拒绝专有软件的社区部分和出于纯技术原因认为开源是可取的部分之间划清界限，“只要他们工作”，社群通常缺乏对二进制 blob 的强烈反对。这种碎片化，以及越来越多的专有组件被接受到 Linux 中，被视为削弱了社区抵制制造商越来越多地拒绝为其二进制文件提供文档的趋势的能力。

## 通过包装使用

包装器是允许一个操作系统使用为另一个操作系统编写的二进制专有设备驱动程序的软件。包装器的例子有Linux的NdisWrapper和FreeBSD和NetBSD的Project Evil。这些包装器允许这些操作系统通过实现微软的网络驱动程式界面规范接口来使用为Microsoft Windows编写的网络驱动程序。

另一个例子是提供兼容层，以便可以使用外部实用程序来为硬件提供服务。示例包括 FreeBSD 中的一些RAID 控制器驱动程序，其中系统管理员必须在FreeBSD中启用Linux 兼容层，并直接从硬件制造商独立采购特定于 Linux 的二进制 blob，以便监控和服务硬件。大约在 2005 年，这种情况促使OpenBSD创建并推广其bio(4)、 bioctl和传感器驱动概念，作为RAID监控的替代解决方案。这两个概念随后都进入了NetBSD。

## 设备固件

固件是一些硬件附带的板载微控制器所需的软件，通常不被认为是二进制 blob。. .在许多设备中，固件存储在非挥发性内存中，但为了降低成本和简化升级，一些设备仅包含静态随机存取存储器，并且每次连接时都需要主机操作系统上传固件（尤其是USB设备）。尽管固件因此存在于操作系统驱动程序中，但它只是复制到设备而不由 CPU 执行，即使固件已经存储在设备中，也消除了对额外安全漏洞（例如DMA攻击）的担忧。OpenBSD 项目接受二进制固件或微码映像，如果许可证允许，将重新分发这些映像；如果供应商不允许免费和无条件重新分发，则可以在Ports Tree中提供有关获取这些映像的指令码（这会阻止某些受阻的无线设备（例如，英特尔无线）在初始安装系统的过程中安装）。

## BIOS 和 UEFI

<image>

BIOS作为引导加载程序并支持传统实模式应用程序，是许多IBM PC兼容计算机的关键组件。BIOS 可以是一个安全后门。在 1990 年代后期，可扩展固件接口的工作开始了，目标是将旧版 BIOS 迁移到具有模块化驱动程序模型的现代接口。EFI 是封闭源代码的，并最终被许多行业领先的硬件制造商采用为统一可延伸固件界面。EFI 开发工具包（EFI Development Kit）旨在协助开发 EFI 固件。

同样在 1990 年代后期，coreboot项目开始从头开始创建传统 BIOS 的开源替代方案。Coreboot 开发者社区围绕斯特凡·赖诺组织，由具有提交权限的固件开发者领导。尽管闭源二进制固件一直是x86架构的核心，但 coreboot 仅包含为用户提供基本硬件支持所必需的少数专有二进制文件。libreboot是 BIOS 和 UEFI 的完全开源替代方案，它由自由软件基金会推广。

## 外部链接

- KernelTrap article on Damien Bergamini's wpi(4) driver, a blobless ipw3945 alternative for OpenBSD
- KernelTrap interview with Jonathan Gray and Damien Bergamini regarding binary blobs
- The Black Hat Wireless Exploit Interview, Verbatim by Brian Krebs on the Washington Post's website, archived on May 5, 2012
- A creative example of the value of free drivers , LWN.net