linux-2.6.33/__EXPORT_SYMBOL()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#a5f90f4e]
#backlinks
*説明 [#c33c9997]
-パス: [[linux-2.6.33/include/linux/module.h]]
-関数や変数の名前をカーネルのシンボルテーブルに登録する。
--他のモジュールから名前が見えるようになる。
--関数内で宣言しても正常に動作しない。
**引数 [#r2408d46]
-sym
--カーネルのシンボルテーブルに登録したいシンボルを指定す...
-sec
--シンボルテーブルを表すセクション(__ksymtab)に追加する...
---今のところ "_gpl", "_gpl_future" が使われている。
**返り値 [#td8d0b41]
-なし
**参考 [#g79384e7]
#ifndef __GENKSYMS__
-__GENKSYMS__ が宣言されていないときに有効である。
--[[linux-2.6.33/__GENKSYMS__]]
*実装 [#f9fac02b]
**マクロの宣言部分 [#o31efeac]
#define __EXPORT_SYMBOL(sym, sec) ...
**1行目 [#d07b6ede]
extern typeof(sym) sym; ...
-シンボルがオブジェクト外部にあるかもしれないと宣言(exte...
これによって別のオブジェクトで定義されている関数もリンク...
エクスポートできる。たぶん。
--なのでエクスポート専用のソースファイルが書けるはずです。
--typeof は gcc の拡張構文で、指定した変数の型を表す。
**2行目 [#n3e187e8]
__CRC_SYMBOL(sym, sec) ...
-モジュールのバージョン管理に使うシンボルの定義をする。
--[[linux-2.6.33/__CRC_SYMBOL()]]
**3行目 [#t6c89beb]
static const char __kstrtab_##sym[] ...
-シンボル名を定義する。
--## はトークン連結演算子で、トークン同士を繋いで一つのト...
--例えば __EXPORT_SYMBOL(hogehoge, "") なら sym に hogeho...
ことになるので、__kstrtab_hogehoge[] が宣言される。
__attribute__((section("__ksymtab_strings"), ali...
-__attribute__ ディレクティブは gcc の拡張構文である。
コンパイラへの命令を書く場合に用いる。
-section は、セクション指定である。
上記の __kstrtab_xxxx 変数を __ksymtab_strings セクション...
とコンパイラに指示する。
-aligned は、アラインメントの指定である。
上記の __kstrtab_xxxx 変数を 1バイト境界に配置しなさい、
とコンパイラに指示する。目的はカーネルサイズを削減するた...
--参考: Linux kernel のパッチ情報:
--------------------
commit ea01e798e2d27fd04142e0473ca36570fa9d9218
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Mar 13 09:02:17 2008 +0000
module: reduce module image and resident size
Resulting reduction (x86-64, gcc 4.1.2) with my (spe...
much reduced) configurations:
- 16k kernel resident size
- 180k module resident size
- 10k module image size
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
--------------------
= MODULE_SYMBOL_PREFIX #sym; ...
-# はトークンを文字列リテラルに変換する演算子である。
プリプロセッサがシンボル名を勝手に " " で囲ってくれると思...
-MODULE_SYMBOL_PREFIX は "" である。
-連続する文字列リテラルは連結される(C の規則)ので、
例えば sym => hogehoge だとすると生成される文字列は "hoge...
--MODULE_SYMBOL_PREFIX はアーキテクチャ依存で、asm/module...
--参考
asm-blackfin/module.h:#define MODULE_SYMBOL_PREFIX "_"
asm-h8300/module.h:#define MODULE_SYMBOL_PREFIX "_"
asm-v850/module.h:#define MODULE_SYMBOL_PREFIX "_"
**4行目 [#z9def48e]
static const struct kernel_symbol __ksymtab_##sy...
-シンボルテーブルの要素を定義する。
__used ...
-__attribute__( (__used__) ) を理解できない古いコンパイラ...
--最適化で消されないため、そして「変数/関数が未使用」の警...
--[[linux-2.6.33/__used]]
__attribute__((section("__ksymtab" sec), unused)...
-__ksymtab セクションに配置する。
sec に何か渡した(例: hoge)場合はその名前を
連結したセクション(例: __ksymtabhoge)に配置される。
-unused でも used でも同じはずだが、古い gcc(3.4 未満)...
変数に対して __attribute__( (used) ) を宣言できないらしい。
--この辺りはよくわかりません。正直どうでもいい…。
= { (unsigned long)&sym, __kstrtab_##sym }
-シンボルテーブルの 1要素を定義する。
--シンボルへのポインタと、シンボルの名前が入る。
--[[linux-2.6.33/kernel_symbol]]
**まとめ [#i77a88c9]
-sym: エクスポートすべきシンボル
-__kstrtab_##sym: カーネルが使うシンボルの名前 -> __ksymt...
-__ksymtab_##sym: シンボルテーブルの要素(シンボルのポイ...
*コメント [#g834e5c7]
終了行:
*参照元 [#a5f90f4e]
#backlinks
*説明 [#c33c9997]
-パス: [[linux-2.6.33/include/linux/module.h]]
-関数や変数の名前をカーネルのシンボルテーブルに登録する。
--他のモジュールから名前が見えるようになる。
--関数内で宣言しても正常に動作しない。
**引数 [#r2408d46]
-sym
--カーネルのシンボルテーブルに登録したいシンボルを指定す...
-sec
--シンボルテーブルを表すセクション(__ksymtab)に追加する...
---今のところ "_gpl", "_gpl_future" が使われている。
**返り値 [#td8d0b41]
-なし
**参考 [#g79384e7]
#ifndef __GENKSYMS__
-__GENKSYMS__ が宣言されていないときに有効である。
--[[linux-2.6.33/__GENKSYMS__]]
*実装 [#f9fac02b]
**マクロの宣言部分 [#o31efeac]
#define __EXPORT_SYMBOL(sym, sec) ...
**1行目 [#d07b6ede]
extern typeof(sym) sym; ...
-シンボルがオブジェクト外部にあるかもしれないと宣言(exte...
これによって別のオブジェクトで定義されている関数もリンク...
エクスポートできる。たぶん。
--なのでエクスポート専用のソースファイルが書けるはずです。
--typeof は gcc の拡張構文で、指定した変数の型を表す。
**2行目 [#n3e187e8]
__CRC_SYMBOL(sym, sec) ...
-モジュールのバージョン管理に使うシンボルの定義をする。
--[[linux-2.6.33/__CRC_SYMBOL()]]
**3行目 [#t6c89beb]
static const char __kstrtab_##sym[] ...
-シンボル名を定義する。
--## はトークン連結演算子で、トークン同士を繋いで一つのト...
--例えば __EXPORT_SYMBOL(hogehoge, "") なら sym に hogeho...
ことになるので、__kstrtab_hogehoge[] が宣言される。
__attribute__((section("__ksymtab_strings"), ali...
-__attribute__ ディレクティブは gcc の拡張構文である。
コンパイラへの命令を書く場合に用いる。
-section は、セクション指定である。
上記の __kstrtab_xxxx 変数を __ksymtab_strings セクション...
とコンパイラに指示する。
-aligned は、アラインメントの指定である。
上記の __kstrtab_xxxx 変数を 1バイト境界に配置しなさい、
とコンパイラに指示する。目的はカーネルサイズを削減するた...
--参考: Linux kernel のパッチ情報:
--------------------
commit ea01e798e2d27fd04142e0473ca36570fa9d9218
Author: Rusty Russell <rusty@rustcorp.com.au>
Date: Thu Mar 13 09:02:17 2008 +0000
module: reduce module image and resident size
Resulting reduction (x86-64, gcc 4.1.2) with my (spe...
much reduced) configurations:
- 16k kernel resident size
- 180k module resident size
- 10k module image size
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
--------------------
= MODULE_SYMBOL_PREFIX #sym; ...
-# はトークンを文字列リテラルに変換する演算子である。
プリプロセッサがシンボル名を勝手に " " で囲ってくれると思...
-MODULE_SYMBOL_PREFIX は "" である。
-連続する文字列リテラルは連結される(C の規則)ので、
例えば sym => hogehoge だとすると生成される文字列は "hoge...
--MODULE_SYMBOL_PREFIX はアーキテクチャ依存で、asm/module...
--参考
asm-blackfin/module.h:#define MODULE_SYMBOL_PREFIX "_"
asm-h8300/module.h:#define MODULE_SYMBOL_PREFIX "_"
asm-v850/module.h:#define MODULE_SYMBOL_PREFIX "_"
**4行目 [#z9def48e]
static const struct kernel_symbol __ksymtab_##sy...
-シンボルテーブルの要素を定義する。
__used ...
-__attribute__( (__used__) ) を理解できない古いコンパイラ...
--最適化で消されないため、そして「変数/関数が未使用」の警...
--[[linux-2.6.33/__used]]
__attribute__((section("__ksymtab" sec), unused)...
-__ksymtab セクションに配置する。
sec に何か渡した(例: hoge)場合はその名前を
連結したセクション(例: __ksymtabhoge)に配置される。
-unused でも used でも同じはずだが、古い gcc(3.4 未満)...
変数に対して __attribute__( (used) ) を宣言できないらしい。
--この辺りはよくわかりません。正直どうでもいい…。
= { (unsigned long)&sym, __kstrtab_##sym }
-シンボルテーブルの 1要素を定義する。
--シンボルへのポインタと、シンボルの名前が入る。
--[[linux-2.6.33/kernel_symbol]]
**まとめ [#i77a88c9]
-sym: エクスポートすべきシンボル
-__kstrtab_##sym: カーネルが使うシンボルの名前 -> __ksymt...
-__ksymtab_##sym: シンボルテーブルの要素(シンボルのポイ...
*コメント [#g834e5c7]
ページ名: