名 前
init_module, finit_module − カ ー ネ ル モ ジ ュ ー ル を ロ ー ド す る
書 式
int
init_module(void *module_image, unsigned
long len,
const char *param_values);
int
finit_module(int fd, const char
*param_values,
int flags); 注 意 :
glibc で は 、 ヘ ッ ダ
ー フ ァ イ ル で
の init_module() の 宣 言
は な く 、 finit_module()
の ラ ッ パ ー 関
数 も 提 供 さ れ
て い な い 。 「
注 意 」 の 節 を
参 照 。
説 明
init_module() は ELF イ メ ー ジ を カ ー ネ ル 空 間 に ロ ー ド し 、 必 要 な シ ン ボ ル の 配 置 変 更 を 行 い 、 モ ジ ュ ー ル パ ラ メ ー タ ー を 呼 び 出 し 元 か ら 指 定 さ れ た 値 に 初 期 化 し 、 最 後 に そ の モ ジ ュ ー ル の init 関 数 を 実 行 す る 。 こ の シ ス テ ム コ ー ル に は 特 権 が 必 要 で あ る 。
module_image 引 き 数 は ロ ー ド す る バ イ ナ リ ー イ メ ー ジ が 入 っ た バ ッ フ ァ ー を 指 し 、 len は バ ッ フ ァ ー の サ イ ズ を 指 定 す る 。 モ ジ ュ ー ル イ メ ー ジ は 、 実 行 中 の カ ー ネ ル 用 に 作 成 さ れ た 有 効 な ELF イ メ ー ジ で あ る 必 要 が あ る 。
param_values 引 き 数 は モ ジ ュ ー ル パ ラ メ ー タ ー 値 を 指 定 す る ス ペ ー ス 区 切 り の 文 字 列 で あ る (モ ジ ュ ー ル パ ラ メ ー タ ー は module_param() や module_param_array() を 使 っ て モ ジ ュ ー ル 内 で 定 義 さ れ る )。 カ ー ネ ル は こ の 文 字 列 を 解 釈 し 、 指 定 さ れ た パ ラ メ ー タ ー を 初 期 化 す る 。 各 パ ラ メ ー タ ー 指 定 は 以 下 の 形 式 で あ る 。
name[=value[,value...]] パ ラ メ ー タ ー name は モ ジ ュ ー ル 内 で module_param() を 使 っ て 定 義 さ れ て い る パ ラ メ ー タ ー の い ず れ か 一 つ で あ る (Linux カ ー ネ ル の ソ ー ス フ ァ イ ル include/linux/moduleparam.h を 参 照 )。 パ ラ メ ー タ ー value は bool か invbool パ ラ メ ー タ ー の 場 合 は 省 略 可 能 で あ る 。 配 列 パ ラ メ ー タ ー の 値 は カ ン マ 区 切 り の リ ス ト で 指 定 さ れ る 。
finit_module()
finit_module() シ ス テ ム
コ ー ル は init_module()
と 同 様 だ が 、
フ ァ イ ル デ ィ
ス ク リ プ タ ー
fd か ら モ ジ ュ
ー ル を ロ ー ド
す る 。 カ ー ネ
ル モ ジ ュ ー ル
の 信 頼 性 を フ
ァ イ ル シ ス テ
ム に お け る 場
所 か ら 判 定 で
き る 場 合 、 こ
の 方 法 は 有 効
で あ る 。 こ の
方 法 が 利 用 で
き る 場 合 、 モ
ジ ュ ー ル の 信
頼 性 を 判 定 す
る の に 暗 号 で
署 名 さ れ た モ
ジ ュ ー ル を 使
用 す る こ と に
よ る オ ー バ ー
ヘ ッ ド を 避 け
る 事 が で き る
。 param_values 引 き 数
は init_module() と 同 じ
で あ る 。
flags
引 き 数 で finit_module()
の 動 作 を 変 更
で き る 。 flags は
以 下 の フ ラ グ
の 0 個 以 上 の 論
理 和 を と っ て
作 成 し た ビ ッ
ト マ ス ク で あ
る 。
MODULE_INIT_IGNORE_MODVERSIONS シ ン
ボ ル の バ ー ジ
ョ ン ハ ッ シ ュ
を 無 視 す る 。
MODULE_INIT_IGNORE_VERMAGIC カ ー ネ
ル の バ ー ジ ョ
ン magic を 無 視 す る
。 そ の モ ジ ュ
ー ル が ロ ー ド
さ れ る カ ー ネ
ル に 合 致 す る
こ と を 保 証 す
る た め の モ ジ
ュ ー ル に 組 み
込 み の 安 全 チ
ェ ッ ク が あ る
。 こ れ ら の チ
ェ ッ ク は 、 モ
ジ ュ ー ル の 作
成 時 に 記 録 さ
れ 、 モ ジ ュ ー
ル の ロ ー ド 時
に 検 査 さ れ る
。 最 初 に 、 モ
ジ ュ ー ル は カ
ー ネ ル の バ ー
ジ ョ ン 番 号 と
主 要 な 機 能 (CPU 種
別 な ど ) が 入 っ
た "vermagic" 文 字 列
を 記 録 す る 。
次 に 、 モ ジ ュ
ー ル が CONFIG_MODVERSIONS
設 定 オ プ シ ョ
ン を 有 効 に し
て 作 成 さ れ て
い る 場 合 、 バ
ー ジ ョ ン ハ ッ
シ ュ が モ ジ ュ
ー ル が 使 用 す
る シ ン ボ ル ご
と に 記 録 さ れ
る 。 こ の ハ ッ
シ ュ は シ ン ボ
ル に 対 応 す る
関 数 の 引 き 数
と 返 り 値 の 型
を 基 づ い て 計
算 さ れ る 。 こ
の 場 合 、 シ ン
ボ ル の バ ー ジ
ョ ン ハ ッ シ ュ
は 十 分 に 信 頼
で き る と 考 え
ら れ て い る た
め 、 "vermagic" 文 字
列 内 の カ ー ネ
ル の バ ー ジ ョ
ン 番 号 は 無 視
さ れ る 。
MODULE_INIT_IGNORE_VERMAGIC フ ラ グ は "vermagic" 文 字 列 を 無 視 す る こ と を 意 味 し 、 MODULE_INIT_IGNORE_MODVERSIONS フ ラ グ は シ ン ボ ル の バ ー ジ ョ ン ハ ッ シ ュ を 無 視 す る こ と を 意 味 す る 。 カ ー ネ ル が 強 制 ロ ー ド を 許 可 す る よ う に 作 成 さ れ て い る 場 合 (CONFIG_MODULE_FORCE_LOAD が 有 効 に な っ て い る 場 合 )、 モ ジ ュ ー ル の ロ ー ド は 継 続 さ れ 、 そ う で な い 場 合 は 不 正 な モ ジ ュ ー ル に 対 し て 返 る の と 同 じ ENOEXEC で 失 敗 す る 。
返 り 値
成 功 の 場 合 、 こ れ ら の シ ス テ ム コ ー ル は 0 を 返 す 。 エ ラ ー の 場 合 −1 が 返 さ れ 、 errno に 適 切 な 値 が 設 定 さ れ る 。
エ ラ ー
EBADMSG (Linux 3.7 以 降 ) モ ジ ュ ー ル の 署 名 が 正 し い 形 式 で は な い 。
EBUSY こ の モ ジ ュ ー ル が シ ン ボ ル 参 照 を 解 決 す る 際 に タ イ ム ア ウ ト が 起 こ っ た 。 | |
EFAULT ア ド レ ス 引 き 数 が 、 プ ロ セ ス が ア ク セ ス で き る ア ド レ ス 空 間 外 の 場 所 を 参 照 し て い た 。 |
ENOKEY (Linux 3.7 以 降 ) モ ジ ュ ー ル の 署 名 が 無 効 で あ る か 、 カ ー ネ ル が こ の モ ジ ュ ー ル 用 の 鍵 を 持 っ て い な い 。 こ の エ ラ ー が 返 さ れ る の は 、 カ ー ネ ル が CONFIG_MODULE_SIG_FORCE で 作 成 さ れ て い る 場 合 の み で あ る 。 カ ー ネ ル で こ の オ プ シ ョ ン が 有 効 に な っ て い な い 場 合 、 無 効 な モ ジ ュ ー ル や 署 名 さ れ て い な い モ ジ ュ ー ル は カ ー ネ ル の ゴ ミ に な る 。
ENOMEM メ モ リ 不 足 。 |
|||
EPERM 呼 び 出 し 元 が 特 権 |
(CAP_SYS_MODULE ケ ー パ ビ リ テ ィ ) を 持 っ て い な |
か っ た 。 も し く は モ ジ ュ ー ル の ロ ー ド が 無 効 に な っ て い る (proc(5) の /proc/sys/kernel/modules_disabled を 参 照 )。
init_module() で は 以 下 の エ ラ ー も 発 生 す る 場 合 が あ る 。
EEXIST そ の 名 前 の モ ジ ュ ー ル が す で に ロ ー ド さ れ て い る 。 |
||
EINVAL |
param_values が 無 効 、 ま た は module_image の ELF イ メ ー ジ の 一 部 分 に 矛 盾 が あ る 。
ENOEXEC
module_image で 指 定 さ れ た バ イ ナ リ ー イ メ ー ジ が ELF イ メ ー ジ で は な い 、 も し く は 無 効 な ELF イ メ ー ジ や 別 の ア ー キ テ ク チ ャ ー 用 の ELF イ メ ー ジ で あ る 。
finit_module() で は 以 下 の エ ラ ー も 発 生 す る 場 合 が あ る 。
EBADF |
fd が 参 照 す る フ ァ イ ル が 読 み 出 し 用 に オ ー プ ン さ れ て い な い 。 | ||
EFBIG |
fd が 参 照 す る フ ァ イ ル が 大 き す ぎ る 。 | ||
EINVAL |
flags が 無 効 で あ る 。 |
ENOEXEC
fd が オ ー プ ン さ れ た フ ァ イ ル を 参 照 し て い な い 。 上 記 の エ ラ ー に 加 え 、 モ ジ ュ ー ル の init 関 数 が 実 行 さ れ て エ ラ ー が 発 生 し た 場 合 に は 、 init_module() や finit_module() は 失 敗 し 、 errno に init 関 数 が 返 し た 値 が 設 定 さ れ る 。
バ ー ジ ョ ン
finit_module() は Linux 3.8 以 降 で 利 用 可 能 で あ る 。
準 拠
init_module() と finit_module() は Linux 固 有 で あ る 。
注 意
init_module() シ ス テ ム コ ー ル は glibc で は サ ポ ー ト さ れ て い な い 。 glibc ヘ ッ ダ ー で は 宣 言 は 提 供 さ れ て い な い が 、 歴 史 の 紆 余 曲 折 を 経 て glibc は こ の シ ス テ ム コ ー ル に 対 す る ABI を 公 開 し て い な い 。 し た が っ て 、 こ の シ ス テ ム コ ー ル を 利 用 す る に は 、 自 分 の コ ー ド の 中 で 手 動 で イ ン タ ー フ ェ ー ス を 宣 言 す れ ば よ い 。 syscall(2) を 使 っ て シ ス テ ム コ ー ル を 起 動 で き る 。
glibc は finit_module() に 対 す る ラ ッ パ ー 関 数 を 提 供 し て い な い 。 syscall(2) を 使 っ て 呼 び 出 す こ と 。 現 在 ロ ー ド さ れ て い る モ ジ ュ ー ル に 関 す る 情 報 は /proc/modules お よ び /sys/module 以 下 の モ ジ ュ ー ル 単 位 の サ ブ デ ィ レ ク ト リ 内 の フ ァ イ ル ツ リ ー で 参 照 で き る 。
Linux カ ー ネ ル の ソ ー ス フ ァ イ ル include/linux/module.h に は 背 景 に 関 す る 有 用 な 情 報 が あ る 。
Linux 2.4
以 前
Linux 2.4 以 前 で は
init_module() シ ス テ ム
コ ー ル は か な
り 違 っ た も の
で あ っ た 。
#include <linux/module.h>
int init_module(const char *name, struct module *image);
(ユ ー ザ ー 空 間 ア プ リ ケ ー シ ョ ン は query_module() を 呼 び 出 し て ど の バ ー ジ ョ ン の init_module() が 利 用 可 能 か を 検 出 で き る 。 query_module() の 呼 び 出 し は Linux 2.6 以 降 で は エ ラ ー ENOSYS で 失 敗 す る 。 ) 古 い バ ー ジ ョ ン の シ ス テ ム コ ー ル は 、 image が 指 す 再 配 置 さ れ た モ ジ ュ ー ル イ メ ー ジ を カ ー ネ ル 空 間 に ロ ー ド し 、 モ ジ ュ ー ル の init 関 数 を 実 行 す る 。 呼 び 出 し 元 に は 再 配 置 さ れ た イ メ ー ジ を 提 供 す る 責 任 が あ る (Linux 2.6 以 降 で は init_module() シ ス テ ム コ ー ル が 再 配 置 自 体 を 行 う )。 モ ジ ュ ー ル イ メ ー ジ は 先 頭 部 分 に module 構 造 体 が あ り 、 そ の 後 ろ に 適 切 な コ ー ド と デ ー タ が 続 く 。 Linux 2.2 以 降 で は module 構 造 体 は 以 下 の よ う に 定 義 さ れ て い る 。
struct module {
unsigned long size_of_struct;
struct module *next;
const char *name;
unsigned long size;
long usecount;
unsigned long flags;
unsigned int nsyms;
unsigned int ndeps;
struct module_symbol *syms;
struct module_ref *deps;
struct module_ref *refs;
int (*init)(void);
void (*cleanup)(void);
const struct exception_table_entry *ex_table_start;
const struct exception_table_entry *ex_table_end;
#ifdef __alpha__
unsigned long gp;
#endif };
next と refs 以 外 の 全 て の ポ イ ン タ ー 要 素 は モ ジ ュ ー ル 本 体 内 部 を 指 し 、 カ ー ネ ル 空 間 で の 適 切 な 値 で 初 期 化 さ れ る (つ ま り 、 モ ジ ュ ー ル の 残 り の 部 分 で 再 配 置 さ れ る ) こ と が 期 待 さ れ る 。
関 連 項 目
create_module(2), delete_module(2), query_module(2), lsmod(8), modprobe(8)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。