为什么Linux驱动程序模块的C文件末尾要加上`MODULE_LICENSE(“GPL“);`

MODULE_LICENSE("GPL") 的作用

在 Linux 内核模块中,MODULE_LICENSE 是用于声明模块许可证的宏。它告诉内核该模块使用的许可证类型,从而决定是否允许加载该模块。


语法

MODULE_LICENSE("license_name");
  • license_name: 一个字符串,用于指定模块的许可证类型。

MODULE_LICENSE 的具体作用

  1. 与内核 GPL 合规性检查相关:

    • Linux 内核是基于 GPL(GNU General Public License)许可证发布的。
    • 如果模块声明使用的是兼容 GPL 的许可证,模块将被视为“开放源代码”,可以自由使用内核提供的符号和接口。
    • 如果声明的许可证不兼容(或未声明),内核会将该模块视为闭源模块,某些内核的核心符号将无法使用。
  2. 加载时的合法性检查:

    • 当加载模块时,内核会检查 MODULE_LICENSE 声明的许可证。
    • 如果未声明或声明了非 GPL 的许可证,内核会发出警告(通常在 dmesg 中可见),并标记为“Tainted Kernel”(被污染的内核)。
  3. 社区规范和道德约束:

    • 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

  1. 确保模块合规性:

    • 内核符号的使用受到 GPL 保护,未声明许可证或声明为非 GPL 的模块无法使用某些重要符号。
  2. 便于社区共享和协作:

    • 开发者可以通过许可证声明明确模块的使用和分发方式,便于他人贡献和改进。
  3. 防止内核污染:

    • 内核通过 MODULE_LICENSE 判断是否加载闭源模块,加载非 GPL 模块时标记为“Tainted”。

示例: 加载闭源模块的警告

如果将许可证声明为非 GPL,例如 "Proprietary",加载模块时可能会看到以下警告:

WARNING: kernel tainted: Proprietary module loaded

运行 dmesg 命令查看内核日志可能会输出:

Proprietary module loaded. Tainting the kernel.

此时,内核会标记为“污染状态”(Tainted Kernel)。


注意事项

  1. 缺少声明的后果:

    • 如果没有使用 MODULE_LICENSE 声明许可证,内核会默认认为模块为闭源。
    • 无法使用某些仅对 GPL 模块开放的核心符号。
  2. 法律风险:

    • 如果声明为 GPL,但实际并未开源代码,可能违反 GPL 协议,存在法律风险。

总结

MODULE_LICENSE("GPL") 是告诉内核该模块是遵循 GPL 协议的开源模块。它是内核模块开发中的重要组成部分,直接影响模块的加载、符号使用权限以及内核的“污染”状态。开发者应根据模块的实际使用和分发需求正确声明许可证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊虹AI笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值