Linux kernel 如何关闭自己的linux内核驱动程序(非开源)?

Linux kernel 如何关闭自己的linux内核驱动程序(非开源)?,linux-kernel,linux-device-driver,embedded-linux,Linux Kernel,Linux Device Driver,Embedded Linux,嗨,我有一个驱动程序,但我想让它成为专有的,我如何才能做到这一点。是否可以将我的驱动程序设置为.so,我将创建一个包装驱动程序。通过包装器驱动程序,我可以访问我的.so库。可能您对开放/封闭源代码不太清楚 快速描述: 打开:执行驱动程序并分发源代码 关闭:执行驱动程序,编译并分发编译后的文件 在您的情况下,您必须分发.ko文件。正如tangrs所说,每次内核松弛都会带来麻烦。对于每个版本,您都必须重新编译驱动程序并分发它 你能做一个.so文件吗?不,因为您编写的是内核驱动程序,而不是您所说的库。

嗨,我有一个驱动程序,但我想让它成为专有的,我如何才能做到这一点。是否可以将我的驱动程序设置为.so,我将创建一个包装驱动程序。通过包装器驱动程序,我可以访问我的.so库。

可能您对开放/封闭源代码不太清楚

快速描述:

打开:执行驱动程序并分发源代码

关闭:执行驱动程序,编译并分发编译后的文件

在您的情况下,您必须分发.ko文件。正如tangrs所说,每次内核松弛都会带来麻烦。对于每个版本,您都必须重新编译驱动程序并分发它


你能做一个.so文件吗?不,因为您编写的是内核驱动程序,而不是您所说的库。

可能您对开放/封闭源代码还不清楚

快速描述:

打开:执行驱动程序并分发源代码

关闭:执行驱动程序,编译并分发编译后的文件

在您的情况下,您必须分发.ko文件。正如tangrs所说,每次内核松弛都会带来麻烦。对于每个版本,您都必须重新编译驱动程序并分发它


你能做一个.so文件吗?不,因为您正在编写内核驱动程序,而不是您所说的库。

您不能。如果您为Linux内核编写驱动程序,这意味着它是从Linux内核1派生的。Linux内核在GPLv2下,这意味着GPL许可代码的任何派生作品也必须具有GPL兼容许可

换句话说,如果您为Linux内核编写驱动程序并分发其二进制文件,那么如果有人要求,您也必须分发其源代码。因此,你的司机必须是自由的。请注意,这与言论自由一样是免费的,而不是免费啤酒,也就是说,您仍然可以出售您的驱动程序,但您不能限制任何人免费发布其源代码

为了避免在目标Linux内核上编译该模块,您可能会为此付出巨大的代价。基本上,您必须为希望安装驱动程序的每台机器获取配置文件,编译具有该确切配置的内核,在其上编译驱动程序,然后传递二进制文件,尽管如此,这是非法的

1如果我理解正确,如果您的驱动程序最初是为另一个操作系统编写的,而您只是将其移植到Linux内核,那么它就不被视为衍生产品2,您的手也会有点空闲3。我认为这是GPLv2和GPLv3之间的区别之一,也是Linux内核中没有采用GPLv3的原因之一

2阅读下面的注释时,请记住Linus是指衍生作品,而不是衍生作品

3:

我听过很多人提到,虽然Linux 内核是在GNU GPL许可下的,该代码是通过 表示二进制可加载模块不必 在GPL下

没有。不存在这样的例外情况

有一个澄清,用户空间程序使用的标准 系统调用接口不被认为是派生工作,但即使如此 这并不是一个例外——它只是一个关于事物边界的陈述 显然被认为是衍生作品。用户程序显然不是 内核的派生作品,因此无论内核许可证是什么 只是没关系

事实上,当涉及到模块时,GPL问题正是关键所在 相同的内核是GPL。没有如果,但是,也许就是这样。作为一个 结果,任何衍生作品都必须是GPL'd。就是这样 简单

现在,版权法中的衍生作品问题是唯一 导致任何灰色区域。有些区域根本不是灰色的: 用户空间显然不是派生的工作,而内核补丁显然是 都是衍生作品

但有一个灰色区域特别像一个司机 最初是为另一个操作系统编写的,显然不是 源代码中Linux的派生工作。它到底在什么时候变成 内核的派生工作,因此属于GPL

这是一个灰色地带,我个人认为这是一个灰色地带 有些模块可能被认为不是派生模块,这很简单 因为它们不是为Linux设计的,也不依赖于任何 Linux的特殊行为

基本上:

任何用Linux编写的东西,无论它当时是否 在其他操作系统上工作与否显然部分取决于 工作 任何对基本的内部控制有了解并发挥作用的事物 Linux行为显然是一个衍生作品。如果你需要到处乱搞 有了核心代码,您就可以派生,毫无疑问

从历史上看,存在类似于原始Andrew文件系统的东西 module:一个标准的文件系统,实际上不是为Linux编写的 金融机构 首先,它只实现了一个UNIX文件系统。是吗 仅仅是因为它被移植到Linux,而Linux具有合理的 类似于其他Unix的VFS接口?就我个人而言,我没有 我觉得我可以做出判断。也许是,也许是 没有,但显然是灰色地带

就我个人而言,我认为那个案子不是衍生作品,我愿意 告诉AFS的人

这是否意味着任何内核模块都不会自动派生 工作他妈的不!它与模块本身无关,只是 非模块显然是派生的作品,如果它们对 内核,您不能将它们作为模块加载,它们显然是派生的 工作仅仅是因为非常亲密——因为GPL 明确提到链接

因此,作为一个模块并不是不是一个衍生作品的标志。只是 一个迹象表明,也许它可能有其他理由来解释为什么它不是 衍生的

莱纳斯

以及:

几周前,我发表了一篇关于可能违反GPL的文章。 这是关于一个设备驱动程序的帧抓取器,可能是 与Linux动态链接或静态链接

有些人,也就是莱纳斯本人,说这是合理使用 GPLd代码支持内核,因为没有明显的代码行 使用,并且司机足够独立

我不是律师,但我不能接受这种对代码重用的解释。 设备驱动程序在任何方面都不独立于使用它的内核 它相互作用。我说的不是界面版权或专利,而是 关于逻辑依赖

请注意,没有动态链接到内核的东西 在Linux中。取而代之的是可加载的模块

现在,有些人可能会觉得以上这些都是吹毛求疵,但有一个 关于可加载模块,相当重要的一点是:它们不能链接 他们自己反对任何随机内核例程。以及他们的日常活动 可以链接到我认为是逻辑上的例程 独立于内核实现

本质上,内核模块接口是 内核和内核模块被认为是在GNU之下 图书馆许可证。事实上,由于内核模块的工作方式,您 根据LGPL自动执行,因此这不是显式的 任何地方都有,但你应该这样想

另一种看待这一点的方式——使用法律而不是道德 视点-只是将模块加载视为内核的使用, 而不是与之相联系。我更愿意解释理由 在它背后,用道德的理由来做这件事,尽管:

内核在使用时以这种LGPLd方式公开的原因 模块就是有很多内核设备驱动程序 Unix是可用的,并且它们并非都是在Linux下编写的。如果有人 我想将他的SVR4驱动程序移植到Linux,但不想GPL 认为他应该有权使用模块来实现这一点。之后 总之,这个驱动程序并不是从Linux本身派生出来的:它是一个真正的驱动程序 司机有自己的权利,所以我觉得我没有道义上的权利 强迫他转换版权

现在,如上所述,我更喜欢GPLd驱动程序,即使它们是 仅作为模块提供。特别是如果他们本来就是 编写Linux时,我认为不使用GPL是有点冒险的。 可以被认为是衍生作品,即使你没有 实际上,将它们链接到内核本身。但我不想 把它强加于那些可能不做衍生工作的人身上。会的 把安德鲁文件系统称为衍生作品是相当荒谬的 比如说Linux,所以我认为有一个AFS是完全可以的 例如,模块

出于几个原因,Linux模块也不总是很有用 如果一些商业公司认为,除非它有来源,否则是有意义的 Linux非常重要,他们想做一个商业广告 对于Linux模块,他们也可能会认识到二进制模块不会 例如,适用于大多数使用实验内核的Linux用户

最后一点注意:Linux解释不是正常情况。我 不会用它来指导其他任何事情,尤其是在 用户模式

莱纳斯


你不能。如果您为Linux内核编写驱动程序,这意味着它是从Linux内核1派生的。Linux内核在GPLv2下,这意味着GPL许可代码的任何派生作品也必须具有GPL兼容许可

换句话说,如果您为Linux内核编写驱动程序并分发其二进制文件,那么如果有人要求,您也必须分发其源代码。因此,你的司机必须是自由的。请注意,这和言论自由一样是免费的,不是免费的啤酒,也就是说,你仍然可以卖掉你的司机,但是 您不能限制任何人免费发布其源代码

为了避免在目标Linux内核上编译该模块,您可能会为此付出巨大的代价。基本上,您必须为希望安装驱动程序的每台机器获取配置文件,编译具有该确切配置的内核,在其上编译驱动程序,然后传递二进制文件,尽管如此,这是非法的

1如果我理解正确,如果您的驱动程序最初是为另一个操作系统编写的,而您只是将其移植到Linux内核,那么它就不被视为衍生产品2,您的手也会有点空闲3。我认为这是GPLv2和GPLv3之间的区别之一,也是Linux内核中没有采用GPLv3的原因之一

2阅读下面的注释时,请记住Linus是指衍生作品,而不是衍生作品

3:

我听过很多人提到,虽然Linux 内核是在GNU GPL许可下的,该代码是通过 表示二进制可加载模块不必 在GPL下

没有。不存在这样的例外情况

有一个澄清,用户空间程序使用的标准 系统调用接口不被认为是派生工作,但即使如此 这并不是一个例外——它只是一个关于事物边界的陈述 显然被认为是衍生作品。用户程序显然不是 内核的派生作品,因此无论内核许可证是什么 只是没关系

事实上,当涉及到模块时,GPL问题正是关键所在 相同的内核是GPL。没有如果,但是,也许就是这样。作为一个 结果,任何衍生作品都必须是GPL'd。就是这样 简单

现在,版权法中的衍生作品问题是唯一 导致任何灰色区域。有些区域根本不是灰色的: 用户空间显然不是派生的工作,而内核补丁显然是 都是衍生作品

但有一个灰色区域特别像一个司机 最初是为另一个操作系统编写的,显然不是 源代码中Linux的派生工作。它到底在什么时候变成 内核的派生工作,因此属于GPL

这是一个灰色地带,我个人认为这是一个灰色地带 有些模块可能被认为不是派生模块,这很简单 因为它们不是为Linux设计的,也不依赖于任何 Linux的特殊行为

基本上:

任何用Linux编写的东西,无论它当时是否 在其他操作系统上工作与否显然部分取决于 工作 任何对基本的内部控制有了解并发挥作用的事物 Linux行为显然是一个衍生作品。如果你需要到处乱搞 有了核心代码,您就可以派生,毫无疑问

从历史上看,存在类似于原始Andrew文件系统的东西 module:一个标准的文件系统,实际上不是为Linux编写的 首先,它只是实现了一个UNIX文件系统。是吗 仅仅是因为它被移植到Linux,而Linux具有合理的 类似于其他Unix的VFS接口?就我个人而言,我没有 我觉得我可以做出判断。也许是,也许是 没有,但显然是灰色地带

就我个人而言,我认为那个案子不是衍生作品,我愿意 告诉AFS的人

这是否意味着任何内核模块都不会自动派生 工作他妈的不!它与模块本身无关,只是 非模块显然是派生的作品,如果它们对 内核,您不能将它们作为模块加载,它们显然是派生的 工作仅仅是因为非常亲密——因为GPL 明确提到链接

因此,作为一个模块并不是不是一个衍生作品的标志。只是 一个迹象表明,也许它可能有其他理由来解释为什么它不是 衍生的

莱纳斯

以及:

几周前,我发表了一篇关于可能违反GPL的文章。 这是关于一个设备驱动程序的帧抓取器,可能是 与Linux动态链接或静态链接

有些人,也就是莱纳斯本人,说这是合理使用 GPLd代码支持内核,因为没有明显的代码行 使用,并且司机足够独立

我不是律师,但我不能接受这种对代码重用的解释。 设备驱动程序在任何方面都不独立于使用它的内核 它相互作用。我说的不是界面版权或专利,而是 关于逻辑依赖

请注意,没有动态链接到内核的东西 在Linux中。取而代之的是可加载的模块

现在上面 有些人可能会觉得这是吹毛求疵,但有一个 关于可加载模块,相当重要的一点是:它们不能链接 他们自己反对任何随机内核例程。以及他们的日常活动 可以链接到我认为是逻辑上的例程 独立于内核实现

本质上,内核模块接口是 内核和内核模块被认为是在GNU之下 图书馆许可证。事实上,由于内核模块的工作方式,您 根据LGPL自动执行,因此这不是显式的 任何地方都有,但你应该这样想

另一种看待这一点的方式——使用法律而不是道德 视点-只是将模块加载视为内核的使用, 而不是与之相联系。我更愿意解释理由 在它背后,用道德的理由来做这件事,尽管:

内核在使用时以这种LGPLd方式公开的原因 模块就是有很多内核设备驱动程序 Unix是可用的,并且它们并非都是在Linux下编写的。如果有人 我想将他的SVR4驱动程序移植到Linux,但不想GPL 认为他应该有权使用模块来实现这一点。之后 总之,这个驱动程序并不是从Linux本身派生出来的:它是一个真正的驱动程序 司机有自己的权利,所以我觉得我没有道义上的权利 强迫他转换版权

现在,如上所述,我更喜欢GPLd驱动程序,即使它们是 仅作为模块提供。特别是如果他们本来就是 编写Linux时,我认为不使用GPL是有点冒险的。 可以被认为是衍生作品,即使你没有 实际上,将它们链接到内核本身。但我不想 把它强加于那些可能不做衍生工作的人身上。会的 把安德鲁文件系统称为衍生作品是相当荒谬的 比如说Linux,所以我认为有一个AFS是完全可以的 例如,模块

出于几个原因,Linux模块也不总是很有用 如果一些商业公司认为,除非它有来源,否则是有意义的 Linux非常重要,他们想做一个商业广告 对于Linux模块,他们也可能会认识到二进制模块不会 例如,适用于大多数使用实验内核的Linux用户

最后一点注意:Linux解释不是正常情况。我 不会用它来指导其他任何事情,尤其是在 用户模式

莱纳斯


你打算分发吗?我强烈建议您不要关闭驱动程序的源代码,否则您会发现自己很难使其与最新内核保持同步。@tangrs,是否与最新内核保持同步?它应该适用于每个内核配置!在这种情况下,你可能会进入受伤的世界。首先,您应该知道,内核中没有稳定的ABI或向后兼容性,因此您将经常更新驱动程序,考虑到内核开发的速度,我怀疑您是否能够跟上。其次,因为没有稳定的ABI,我假设它是为一个内核编译的二进制文件,你不会分发源代码,因为它可能会完全破坏另一个内核——即使它是完全相同的版本,并且配置了相同的选项。即使使用不同的编译器,也会改变它的构建方式。世界上没有多少人能够让树外模块与最新内核保持同步。Nvidia就是这样一个组织,但请记住,他们的资源比你多得多。然后,围绕着GPL是否允许分发专有内核模块,存在着所有的法律问题。请参阅Shahbaz的优秀答案。听起来您可能想创建一种用户模式驱动程序,其中大部分代码将作为用户空间守护程序运行,利用内核中现有的精简接口,或者更可能是一个新接口。您打算分发它吗?我强烈建议您不要关闭驱动程序的源代码,否则您会发现自己很难使其与最新内核保持同步。@tangrs,是否与最新内核保持同步?它应该适用于每个内核配置!在这种情况下,你可能会进入受伤的世界。首先,您应该知道,内核中没有稳定的ABI或向后兼容性,因此您将经常更新驱动程序,考虑到内核开发的速度,我怀疑您是否能够跟上。其次,因为没有稳定的ABI,我假设它是为一个内核编译的二进制文件,你不会分发源代码,因为它可能会完全破坏另一个内核——即使它是完全相同的版本,并且配置了相同的选项。即使使用不同的编译器也会改变它的构建方式
使用最新内核更新odule。Nvidia就是这样一个组织,但请记住,他们的资源比你多得多。然后,围绕着GPL是否允许分发专有内核模块,存在着所有的法律问题。请看Shahbaz的精彩答案。听起来您可能想创建一种用户模式驱动程序,其中大部分代码将作为用户空间守护程序运行,利用内核中现有的精简接口,或者更可能是一个新接口。甚至对于每个版本,这取决于使用的编译器和用户配置,它可能不会在最终用户的系统上运行。是的,有很多问题:甚至对于每个版本,根据使用的编译器和用户的配置,它也可能不会在最终用户的系统上运行。是的,有很多问题:有什么理由投反对票吗?我不是律师,所以信息可能不完全准确。我很感谢您的输入,这样我也可以学习。像nvidia这样的公司会做什么,分发驱动程序二进制文件呢?非常确定nvidia会分发包装层的源代码,该层在安装时编译到用户系统的内核模块中。该包装层将实际的驱动程序(一个二进制blob)包装起来。即使如此,nVidia也必须跟上其包装层的最新内核。@hemerly,nVidia不分发二进制文件。它发布了一个自解压bash脚本,该脚本提取代码并进行编译。我自己也看过代码,因为我必须用内核3.11来修复一个构建问题,就像Ubuntu 13.10出来一样。@ HeMeLy,修正:英伟达驱动程序是一个Linux特定源代码的混合代码,它是编译的,一个可移植的二进制块连接到它。莱纳斯允许这一点的原因是英伟达GPL,来自GPL的任何派生代码必须是免费的,但是NVIDIA驱动程序是从Windows派生的,移植到Linux,所以它不是派生的工作。顺便说一句,史泰尔曼不同意,所以这充其量只是一个灰色地带。有没有理由投反对票?我不是律师,所以信息可能不完全准确。我很感谢您的输入,这样我也可以学习。像nvidia这样的公司会做什么,分发驱动程序二进制文件呢?非常确定nvidia会分发包装层的源代码,该层在安装时编译到用户系统的内核模块中。该包装层将实际的驱动程序(一个二进制blob)包装起来。即使如此,nVidia也必须跟上其包装层的最新内核。@hemerly,nVidia不分发二进制文件。它发布了一个自解压bash脚本,该脚本提取代码并进行编译。我自己也看过代码,因为我必须用内核3.11来修复一个构建问题,就像Ubuntu 13.10出来一样。@ HeMeLy,修正:英伟达驱动程序是一个Linux特定源代码的混合代码,它是编译的,一个可移植的二进制块连接到它。莱纳斯允许这一点的原因是英伟达GPL,来自GPL的任何派生代码必须是免费的,但是NVIDIA驱动程序是从Windows派生的,移植到Linux,所以它不是派生的工作。顺便说一句,史泰尔曼不同意,所以这充其量只是一个灰色地带。