專有設備驅動程序

专有设备驱动程序（）是指仅以二进制代码发布的闭源设备驱动程序。在自由及开放源代码的語境中，专有设备驱动程序称为blob或二进制 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，项目负责人西奧·德若特捍卫了只为微代码固件请求分发权的政策。“一旦它们被分发……至少设备可以工作”，暗示他的小项目的成员可以用许多芯片组的汇编语言自己编写免费固件，他恳求“不要让我们承担更多任务”。尽管如此，他还是偏爱无需固件即可运行的芯片组。

在Linux内核开发社区中，林纳斯·托瓦兹就纯二进制模块的问题发表了强有力的声明，声称：“我什至拒绝考虑将我的手绑在一些纯二进制模块上……我希望人们知道当他们使用纯二进制模块时，这是他们的问题。”2008 年，176位 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 

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

驱动程序