MODULE_LICENSE("GPL")
的作用
在 Linux 内核模块中,MODULE_LICENSE
是用于声明模块许可证的宏。它告诉内核该模块使用的许可证类型,从而决定是否允许加载该模块。
语法
MODULE_LICENSE("license_name");
- 1
license_name
: 一个字符串,用于指定模块的许可证类型。
MODULE_LICENSE
的具体作用
-
与内核 GPL 合规性检查相关:
- Linux 内核是基于 GPL(GNU General Public License)许可证发布的。
- 如果模块声明使用的是兼容 GPL 的许可证,模块将被视为“开放源代码”,可以自由使用内核提供的符号和接口。
- 如果声明的许可证不兼容(或未声明),内核会将该模块视为闭源模块,某些内核的核心符号将无法使用。
-
加载时的合法性检查:
- 当加载模块时,内核会检查
MODULE_LICENSE
声明的许可证。 - 如果未声明或声明了非 GPL 的许可证,内核会发出警告(通常在
dmesg
中可见),并标记为“Tainted Kernel
”(被污染的内核)。
- 当加载模块时,内核会检查
-
社区规范和道德约束:
- Linux 社区鼓励使用 GPL 或兼容许可证开发内核模块。
- 违反 GPL 可能导致法律和社区问题。
常见的许可证声明
以下是内核模块开发中常见的许可证类型:
"GPL"
: 模块遵循 GPL 协议。"GPL v2"
: 模块明确遵循 GNU General Public License Version 2。"Dual BSD/GPL"
: 模块可以在 BSD 和 GPL 协议下分发。"Dual MIT/GPL"
: 模块可以在 MIT 和 GPL 协议下分发。"Proprietary"
: 声明为专有闭源模块。
在例子中的作用
MODULE_LICENSE("GPL");
- 1
- 声明模块使用的是 GPL 许可证,表明该模块遵循开源协议。
- 内核会认为该模块是开放源码的,可以使用所有导出的内核符号(包括仅对 GPL 模块开放的符号)。
为什么需要 MODULE_LICENSE
?
-
确保模块合规性:
- 内核符号的使用受到 GPL 保护,未声明许可证或声明为非 GPL 的模块无法使用某些重要符号。
-
便于社区共享和协作:
- 开发者可以通过许可证声明明确模块的使用和分发方式,便于他人贡献和改进。
-
防止内核污染:
- 内核通过
MODULE_LICENSE
判断是否加载闭源模块,加载非 GPL 模块时标记为“Tainted
”。
- 内核通过
示例: 加载闭源模块的警告
如果将许可证声明为非 GPL,例如 "Proprietary"
,加载模块时可能会看到以下警告:
WARNING: kernel tainted: Proprietary module loaded
- 1
运行 dmesg
命令查看内核日志可能会输出:
Proprietary module loaded. Tainting the kernel.
- 1
此时,内核会标记为“污染状态”(Tainted Kernel)。
注意事项
-
缺少声明的后果:
- 如果没有使用
MODULE_LICENSE
声明许可证,内核会默认认为模块为闭源。 - 无法使用某些仅对 GPL 模块开放的核心符号。
- 如果没有使用
-
法律风险:
- 如果声明为 GPL,但实际并未开源代码,可能违反 GPL 协议,存在法律风险。
总结
MODULE_LICENSE("GPL")
是告诉内核该模块是遵循 GPL 协议的开源模块。它是内核模块开发中的重要组成部分,直接影响模块的加载、符号使用权限以及内核的“污染”状态。开发者应根据模块的实际使用和分发需求正确声明许可证。

昊虹嵌入式技术交流群
QQ群名片


评论记录:
回复评论: