第四章Linux内核模块之十(使用模块“绕开”GPL)

4.10 使用模块“绕开”GPL

Linux内核有两种导出符号的方法给模块使用,一种方法是EXPORT_SYMBOL(),另外一种是EXPORT_SYMBOL_GPL()。这一点和模块A导出符号给模块B用是一致的。

内核的Documentation/DocBook/kernel-hacking(黑客).tmpl明确表明“the symbols exported by EXPORT_SYMBOL_GPL()can only be seen by modules with a MODULE_LICENSE()that specifies a GPL compatible license.”由此可见,内核用EXPORT_SYMBOL_GPL()导出的符号是不可以被非GPL模块引用的

由于相当多的内核符号都是以EXPORT_SYMBOL_GPL()导出的,所以历史上曾经有一些公司把内核的EXPORT_SYMBOL_GPL()直接改为EXPORT_SYMBOL(),然后将修改后的内核以GPL形式发布。这样修改内核之后,模块不再使用内核的EXPORT_SYMBOL_GPL()符号,因此模块不再需要GPL。因此,这种做法可能构成“蓄意侵权(willful infringement)”。

另外一种做法是写一个wrapper内核模块(这个模块遵循GPL),把EXPORT_SYMBOL_GPL()导出的符号封装一次后再以EXPORT_SYMBOL()形式导出,而其他的模块不直接调用内核而是调用wrapper函数,如图4.1所示。这种做法也具有争议


图4.1 将EXPORT_SYMBOL_GPL重新以EXPORT_SYMBOL导出

一般认为,保守的做法是Linux内核不能使用非GPL许可权

总结:

本章主要讲解了Linux内核模块的概念和基本的编程方法。内核模块由加载/卸载函数、功能函数以及一系列声明组成,它可以被传入参数,也可以导出符号供其他模块使用。由于Linux设备驱动以内核模块的形式存在,掌握这一章的内容是编写任何设备驱动的必需。

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80314032