MODULE_LICENSE("GPL") 的作用
在 Linux 内核模块中,MODULE_LICENSE 是用于声明模块许可证的宏。它告诉内核该模块使用的许可证类型,从而决定是否允许加载该模块。
语法
MODULE_LICENSE("license_name");
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");
- 声明模块使用的是 GPL 许可证,表明该模块遵循开源协议。
- 内核会认为该模块是开放源码的,可以使用所有导出的内核符号(包括仅对 GPL 模块开放的符号)。
为什么需要 MODULE_LICENSE?
-
确保模块合规性:
- 内核符号的使用受到 GPL 保护,未声明许可证或声明为非 GPL 的模块无法使用某些重要符号。
-
便于社区共享和协作:
- 开发者可以通过许可证声明明确模块的使用和分发方式,便于他人贡献和改进。
-
防止内核污染:
- 内核通过
MODULE_LICENSE判断是否加载闭源模块,加载非 GPL 模块时标记为“Tainted”。
- 内核通过
示例: 加载闭源模块的警告
如果将许可证声明为非 GPL,例如 "Proprietary",加载模块时可能会看到以下警告:
WARNING: kernel tainted: Proprietary module loaded
运行 dmesg 命令查看内核日志可能会输出:
Proprietary module loaded. Tainting the kernel.
此时,内核会标记为“污染状态”(Tainted Kernel)。
注意事项
-
缺少声明的后果:
- 如果没有使用
MODULE_LICENSE声明许可证,内核会默认认为模块为闭源。 - 无法使用某些仅对 GPL 模块开放的核心符号。
- 如果没有使用
-
法律风险:
- 如果声明为 GPL,但实际并未开源代码,可能违反 GPL 协议,存在法律风险。
总结
MODULE_LICENSE("GPL") 是告诉内核该模块是遵循 GPL 协议的开源模块。它是内核模块开发中的重要组成部分,直接影响模块的加载、符号使用权限以及内核的“污染”状态。开发者应根据模块的实际使用和分发需求正确声明许可证。
845

被折叠的 条评论
为什么被折叠?



