Manpages

名 前

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 を 参 照 )。 パ ラ メ ー タ ー valueboolinvbool パ ラ メ ー タ ー の 場 合 は 省 略 可 能 で あ る 。 配 列 パ ラ メ ー タ ー の 値 は カ ン マ 区 切 り の リ ス ト で 指 定 さ れ る 。

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() は 失 敗 し 、 errnoinit 関 数 が 返 し た 値 が 設 定 さ れ る 。

バ ー ジ ョ ン

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 };

nextrefs 以 外 の 全 て の ポ イ ン タ ー 要 素 は モ ジ ュ ー ル 本 体 内 部 を 指 し 、 カ ー ネ ル 空 間 で の 適 切 な 値 で 初 期 化 さ れ る (つ ま り 、 モ ジ ュ ー ル の 残 り の 部 分 で 再 配 置 さ れ る ) こ と が 期 待 さ れ る 。

関 連 項 目

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/ に 書 か れ て い る 。