カーネルシンボルのエクスポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/12/23 16:24 UTC 版)
「ローダブル・カーネル・モジュール」の記事における「カーネルシンボルのエクスポート」の解説
概要で述べた通り、通常カーネル内にある関数名、構造体名などのシンボルはカーネルの外からは直接見えない。LKMのロードにはシンボル解決が必要であるが、シンボル解決するためにはinsmod等のモジュールローダを起動し、様々なチェックに通る必要がある。この時前述の通り、MODULE_LICENSEマクロにある文字列がチェックされる。シンボル名は通常、EXPORT_SYMBOLまたは、GPLにライセンスされたモジュールのみが参照可能なEXPORT_SYMBOL_GPLマクロに記述する。このマクロに記述されたシンボル名はモジュールローディング時にモジュールから参照できるようになるが、あらゆるライセンス用に提供されるEXPORT_SYMBOLとは異なり、EXPORT_SYMBOL_GPLマクロはプロプライエタリなモジュールからは一切参照できない。すなわちプロプライエタリなモジュールを作成する場合はEXPORT_SYMBOL_GPLマクロでエクスポートされている関数を利用できないことになる。プロプライエタリなモジュールを作成する企業にとっては、これは前述の汚染フラグとは比べものにならないほど厳しい制限に思える。しかし、Linuxカーネル開発者にとってはカーネル内の重要な処理に関する決定のイニシアティブを一貫してLinuxカーネルコミュニティが持つことができるという大きな利点がある。プロプライエタリなドライバはソースコードがない、もしくは自由な改変を許可していないものが多く、状況によりカーネルのAPIをはじめとして最新のカーネル開発状況に追随できていないものが存在する。そのようなドライバによるバグやシステムクラッシュが発生したとしてもソースコードを改変できないため、Linuxカーネルコミュニティ側では全く解決できない。これは昔からコミュニティの悩みの種となっているため、カーネル内の極めて重要なオブジェクトや、問題がひとたび発生するとシステムがクラッシュするような処理を最初からバイナリオンリードライバには実行できないようにしようとしたのである。
※この「カーネルシンボルのエクスポート」の解説は、「ローダブル・カーネル・モジュール」の解説の一部です。
「カーネルシンボルのエクスポート」を含む「ローダブル・カーネル・モジュール」の記事については、「ローダブル・カーネル・モジュール」の概要を参照ください。
- カーネルシンボルのエクスポートのページへのリンク