トランポリンは常に(またはほとんど常に)カーネルにロードされる必要があると思います。
トランポリンコードでは、そのような変数を使用する必要があります。
struct module *ip_vs_utils_mod;
EXPORT_SYMBOL(ip_vs_utils_mod);
/* function pointers */
ret_type (*ip_vs_utils_afunc_ptr)(func_arg_list); /* Add static if you put it in a header file! */
EXPORT_SYMBOL(ip_vs_utils_afunc_ptr); /* ******EXPORTED***** */
ip_vs_utilsがロードされたら、すべての変数を初期化する必要があります。ip_vs_utils.cの初期化コードは次のとおりです。
ip_vs_utils_mod = THIS_MODULE;
/* init function pointers */
/* ip_vs_utils_afunc_impl is the real implementation
* of the function, it is *****NOT***** needed to export it
*/
ip_vs_utils_afunc_ptr = ip_vs_utils_afunc_impl;
そして、トランポリンコードにトランポリン関数を追加します。
ret_type ip_vs_utils_afunc(func_arg_list)
{
ret_type ret = DEFAULT_RET;
if (try_module_get(ip_vs_utils_mod)) {
ret = (*ip_vs_utils_afunc_ptr)(func_arg_list);
module_put(ip_vs_utils_mod);
}
return ret;
}
try_module_get()は、ip_vs_utils_afunc_ptr()が呼び出されているときにモジュールが突然アンロードされるのを防ぐために必要です。代わりにRCUを使用して、try_module_get()/ module_put()のオーバーヘッドを減らすこともできます。(でも難しいです)
または、ユーザースペースで動的リンクのようなトランポリンハックを使用することもできます(Linuxカーネルでは多くの変更が必要になる場合があります)