ИМЯ
init_module, finit_module - загружает модуль ядраLIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <linux/module.h> /* определения констант MODULE_* */ #include <sys/syscall.h> /* определения констант SYS_* */ #include <unistd.h>
int syscall(SYS_init_module, void module_image[.len], unsigned long len, const char *param_values); int syscall(SYS_finit_module, int fd, const char *param_values, int flags);Note: glibc provides no wrappers for these system calls, necessitating the use of syscall(2).
ОПИСАНИЕ
Вызов init_module() загружает образ ELF в пространство ядра, выполняет все необходимые перемещения символов, инициализирует значения параметров модуля, предоставленные вызывающим и запускает функцию модуля init. Данный системный вызов требует дополнительных прав. Аргумент module_image указывает на буфер, содержащий двоичный образ для загрузки; в len задаётся размер этого буфера. Образ модуля должен быть корректным образом в формате ELF, собранным для работающего в данный момент ядра. Значением param_values является строка, содержащая значения параметров модуля (через пробел), определённых в модуле через module_param() и module_param_array(). Ядро обрабатывает эту строку и инициализирует указанные параметры. Каждый параметр имеет вид: имя[=значение[,значение…]] Параметр имя — один из определённых параметров модуля с помощью module_param() (смотрите файл исходного кода ядра Linux include/linux/moduleparam.h). Параметр значение не обязателен в случае параметров с типом bool и invbool. Значение массива параметров указываются через запятую.finit_module()
Системный вызов finit_module() подобен init_module(), но читает модуль для загрузки из файлового дескриптора fd. Он полезен, если подлинность модуля ядра можно определить по его расположению в файловой системе; в таких случаях затрат на использование криптографически подписанных модулей для определения подлинности модуля можно избежать. Аргумент param_values такой же как у init_module(). Аргумент flags изменяет выполнение finit_module(). Это битовая маска, создаваемая объединением нуля или более следующих флагов:- MODULE_INIT_IGNORE_MODVERSIONS
- Игнорировать хэши версий символов.
- MODULE_INIT_IGNORE_VERMAGIC
- Игнорировать версию ядра.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, these system calls return 0. On error, -1 is returned and errno is set to indicate the error.ОШИБКИ
- EBADMSG (начиная с Linux 3.7)
- Неправильный формат подписи модуля.
- EBUSY
- Истекло время ожидания попытки определения символьной ссылки данным модулем.
- EFAULT
- Аргумент адреса ссылается на положение вне доступного адресного пространства процесса.
- ENOKEY (начиная с Linux 3.7)
- Некорректная подпись или ядро не содержит ключа этого модуля. Данная ошибка возвращается только, если ядро было настроено с параметром CONFIG_MODULE_SIG_FORCE; если ядро собрано без этого параметра, то некорректный или не подписанный модуль просто примешивается (taints) в ядро.
- ENOMEM
- Не хватает памяти.
- EPERM
- Вызывающий не имеет прав (не имеет мандата CAP_SYS_MODULE), или отключена загрузка модулей (смотрите /proc/sys/kernel/modules_disabled в proc(5)).
- EEXIST
- Модуль с таким именем уже загружен.
- EINVAL
- Некорректное значение param_values, или какая-то часть образа ELF в module_image содержит противоречивую информацию.
- ENOEXEC
- Двоичный образ, переданный module_image, не является образом ELF, или образ ELF некорректный или для другой архитектуры.
- EBADF
- Файл, на который ссылается fd, не открыт для чтения.
- EFBIG
- Файл, на который ссылается fd, слишком большой.
- EINVAL
- Значение flags неверно.
- ENOEXEC
- Значение fd не указывает на открытый файл.
- ETXTBSY (начиная с Linux 4.7)
- The file referred to by fd is opened for read-write.
ВЕРСИИ
Вызовы finit_module() доступен в Linux, начиная с версии 3.8.СТАНДАРТЫ
Вызовы init_module() и finit_module() есть только в Linux.ЗАМЕЧАНИЯ
The init_module() system call is not supported by glibc. No declaration is provided in glibc headers, but, through a quirk of history, glibc versions before glibc 2.23 did export an ABI for this system call. Therefore, in order to employ this system call, it is (before glibc 2.23) sufficient to manually declare the interface in your code; alternatively, you can invoke the system call using syscall(2). Информацию по уже загруженным модулями можно найти в файле /proc/modules и в соответствующем каждому модулю подкаталогу в /sys/module. Дополнительную информацию смотрите в файле include/linux/module.h из исходного кода ядра Linux.Linux версии 2.4 и более ранние
В Linux версии 2.4 и более ранних системный вызов init_module() был немного другим: #include <linux/module.h> int init_module(const char *name, struct module *image ); (Приложения пользовательского пространства могут определить какая из версий init_module() доступна, вызвав query_module(); этот вызов завершается ошибкой ENOSYS в Linux 2.6 и более новых.) Старая версия системного вызова загружает перемещённый образ модуля image, в пространство ядра и выполняет функцию модуля init. Вызывающий должен предоставить перемещённый образ (начиная с Linux 2.6, системный вызов init_module() сам делает перемещение). Образ модуля начинается со структуры модуля, за которой следует код и данные. Начиная с Linux 2.2 структура модуля определена следующим образом: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)ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]4 декабря 2022 г. | Linux man-pages 6.03 |