6

ロード可能なすべてのカーネル モジュールで、が指定されると、 に加えてmakeというファイルが生成されます。modulename.mod.cmodulename.ko

次のコードの抜粋は、ペア.mod.cを含むファイルからのものです。{number, function}この数字の意味は何ですか?この数値はコンパイラによってどのように生成されますか?

static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {

        { 0xa6d8dcb5, "module_layout" },
        { 0x16c2b958, "register_netdevice" },
        { 0x609f1c7e, "synchronize_net" },
        { 0x90a60c63, "kmem_cache_destroy" },
        { 0x402b8281, "__request_module" },
        { 0x844a8af7, "netdev_info" },
        { 0xdfdb0ee8, "kmalloc_caches" },
        { 0x12da5bb2, "__kmalloc" },
        { 0x92d42843, "cfg80211_cqm_rssi_notify" },
        { 0xc86289e8, "perf_tp_event" },
...
...
}
4

1 に答える 1

6

すべての__versions個別*.mod.cファイルに含まれるセクション

  CRC         Symbol
{ 0xa6d8dcb5, "module_layout" },
{ 0x16c2b958, "register_netdevice" },
  ...         ...

シンボルとそれに対応する CRC のリストです。これには 2 つの主な用途があります。

  1. エクスポートされたすべてのシンボルのグローバル リスト。
  2. モジュールをロードするときのモジュールのバージョン管理チェックko

モジュールのバージョン管理の根拠

モジュールのバージョン管理はCONFIG_MODVERSIONSタグによって有効になり、単純な ABI 整合性チェックとして使用されます。エクスポートされたシンボルの完全なプロトタイプの CRC 値が作成されます。モジュールがロード/使用されると、カーネルに含まれる CRC 値がモジュール内の同様の値と比較されます。それらが等しくない場合、モジュールが Linux カーネル ソースの異なるバージョンを参照してビルドされていることを示しているため、カーネルはモジュールのロードを拒否します。

コンパイルが成功すると、エクスポートされたすべてのシンボルのすべての CRC のグローバル リストがModule.symversLinux カーネル ソース ディレクトリのファイルに保存されます。基本的に、このチェックは、カーネル モジュールから呼び出されているエクスポートされたシンボルが、モジュールによって期待されるのと同じ場所 (カーネル内のオフセット) に存在することを確認します。

modpostツールは、Linux カーネルのコンパイル中に CRC を生成しますmodpost スクリプトによって呼び出されます。全体のプロセスはDocumentation/kbuild/modules.rst:450で詳細に説明されています。

modpost ツールのソース コード全体は、Linux カーネル ソースで入手できます。各ファイルのセクションadd_depends()全体を生成する関連関数です。__versions*.mod.c

于 2013-07-29T12:40:45.973 に答える