web-dev-qa-db-ja.com

LinuxカーネルコードのEXPORT_SYMBOL_GPLとは何ですか?

LinuxカーネルコードのEXPORT_SYMBOL_GPLとは何ですか?

以下は、EXPORT_SYMBOL_GPLを含むコードの一部です。

62 struct resource *platform_get_resource(struct platform_device *dev,
 63                                        unsigned int type, unsigned int num)
 64 {
 65         int i;
 66 
 67         for (i = 0; i < dev->num_resources; i++) {
 68                 struct resource *r = &dev->resource[i];
 69 
 70                 if (type == resource_type(r) && num-- == 0)
 71                         return r;
 72         }
 73         return NULL;
 74 }
 75 EXPORT_SYMBOL_GPL(platform_get_resource);

そのマクロはカーネルコードに何度も現れます...

17
Sagar Jain

一部のシンボル(関数など)をエクスポート可能(カーネルのロード可能なモジュールから見たもの)として定義するのはマクロです。シンボルに「EXPORT_SYMBOL」がない場合、モジュールからアクセスできません。

EXPORT_SYMBOL_GPLは、GPLライセンスのモジュールでのみシンボルを表示します。EXPORT_SYMBOL-任意のライセンスを持つモジュール内。

http://lwn.net/Articles/154602/ -EXPORT_SYMBOL_GPL(2005、corbet)の値について

ロード可能なモジュールを挿入する場合、カーネル関数およびデータ構造への参照は、現在実行中のカーネルにリンクする必要があります。ただし、モジュールローダーはすべてのカーネルシンボルへのアクセスを提供するわけではありません。明示的にエクスポートされたもののみが使用可能です。

エクスポートには、バニラ(EXPORT_SYMBOL)とGPLのみ(EXPORT_SYMBOL_GPL)の2つのフレーバーがあります。前者はすべてのカーネルモジュールで使用できますが、後者はGPL互換ライセンスを持たないモジュールでは使用できません。

19
osgx