.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2012 Michael Kerrisk .\" A few fragments remain from a version .\" Copyright (C) 1996 Free Software Foundation, Inc. .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH init_module 2 "2 мая 2024 г." "Справочные страницы Linux 6.9.1" .SH ИМЯ init_module, finit_module \- загружает модуль ядра .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP /* определения констант \fBMODULE_*\fP */ \fB#include \fP /* определения констант \fBSYS_*\fP */ \fB#include \fP .P \fBint syscall(SYS_init_module, void \fP\fImodule_image\fP\fB[.\fP\fIlen\fP\fB], unsigned long \fP\fIlen\fP\fB,\fP \fB const char *\fP\fIparam_values\fP\fB);\fP \fBint syscall(SYS_finit_module, int \fP\fIfd\fP\fB,\fP \fB const char *\fP\fIparam_values\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .P \fIПримечание\fP: glibc не предоставляет обёрточных функций для этих системных вызовов, что делает необходимым использование \fBsyscall\fP(2). .SH ОПИСАНИЕ Вызов \fBinit_module\fP() загружает образ ELF в пространство ядра, выполняет все необходимые перемещения символов, инициализирует значения параметров модуля, предоставленные вызывающим и запускает функцию модуля \fIinit\fP. Данный системный вызов требует дополнительных прав. .P Аргумент \fImodule_image\fP указывает на буфер, содержащий двоичный образ для загрузки; в \fIlen\fP задаётся размер этого буфера. Образ модуля должен быть корректным образом в формате ELF, собранным для работающего в данный момент ядра. .P Значением \fIparam_values\fP является строка, содержащая значения параметров модуля (через пробел), определённых в модуле через \fBmodule_param\fP() и \fBmodule_param_array\fP(). Ядро обрабатывает эту строку и инициализирует указанные параметры. Каждый параметр имеет вид: .P \fIname\fP[ \fB=\fP\fIvalue\fP [\fB,\fP\fIvalue\fP...]] .P Параметр \fIимя\fP — один из определённых параметров модуля с помощью \fImodule_param\fP() (смотрите файл исходного кода ядра Linux \fIinclude/linux/moduleparam.h\fP). Параметр \fIзначение\fP не обязателен в случае параметров с типом \fIbool\fP и \fIinvbool\fP. Значение массива параметров указываются через запятую. .SS finit_module() .\" commit 34e1169d996ab148490c01b65b4ee371cf8ffba2 .\" https://lwn.net/Articles/519010/ Системный вызов \fBfinit_module\fP() подобен \fBinit_module\fP(), но читает модуль для загрузки из файлового дескриптора \fIfd\fP. Он полезен, если подлинность модуля ядра можно определить по его расположению в файловой системе; в таких случаях затрат на использование криптографически подписанных модулей для определения подлинности модуля можно избежать. Аргумент \fIparam_values\fP такой же как у \fBinit_module\fP(). .P .\" commit 2f3238aebedb243804f58d62d57244edec4149b2 Аргумент \fIflags\fP изменяет выполнение \fBfinit_module\fP(). Это битовая маска, создаваемая объединением нуля или более следующих флагов: .TP \fBMODULE_INIT_IGNORE_MODVERSIONS\fP Игнорировать хэши версий символов. .TP \fBMODULE_INIT_IGNORE_VERMAGIC\fP Игнорировать версию ядра. .TP \fBMODULE_INIT_COMPRESSED_FILE\fP (since Linux 5.17) .\" commit b1ae6dc41eaaa98bb75671e0f3665bfda248c3e7 Use in\-kernel module decompression. .P .\" http://www.tldp.org/HOWTO/Module-HOWTO/basekerncompat.html .\" is dated, but informative Есть несколько элементов, встроенных в модуль, которые позволяют убедиться, что модуль подходит для загрузки в ядро. Эти элементы записываются в модуль на этапе сборки и проверяются при загрузке ядра. Во\-первых, модуль имеет строку «vermagic», содержащую номер версии ядра и основные свойства (такие как тип ЦП). Во\-вторых, если модуль собран с включённым параметром настройки \fBCONFIG_MODVERSIONS\fP, то он содержит хэш версии для каждого используемого модулем символа. Данный хэш основан на типе аргумента и возвращаемом значении функции с именем символа. В этом случае номер версии ядра в строке «vermagic» игнорируется, так как считается, что хэши версий символов достаточно надёжны. .P Использование флага \fBMODULE_INIT_IGNORE_VERMAGIC\fP требует игнорировать строку «vermagic», а флаг \fBMODULE_INIT_IGNORE_MODVERSIONS\fP требует игнорировать хэши версий символов. Если ядро собрано с разрешением принудительной загрузки (параметр настройки \fBCONFIG_MODULE_FORCE_LOAD\fP), то загрузка продолжается, в противном случае она завершается ошибкой \fBENOEXEC\fP, как и ожидается для некорректных модулей. .P If the kernel was build with \fBCONFIG_MODULE_DECOMPRESS\fP, the in\-kernel decompression feature can be used. User\-space code can check if the kernel supports decompression by reading the \fI/sys/module/compression\fP attribute. If the kernel supports decompression, the compressed file can directly be passed to \fBfinit_module\fP() using the \fBMODULE_INIT_COMPRESSED_FILE\fP flag. The in\-kernel module decompressor supports the following compression algorithms: .P .RS 4 .PD 0 .IP \[bu] 3 \fIgzip\fP (since Linux 5.17) .IP \[bu] \fIxz\fP (since Linux 5.17) .IP \[bu] .\" commit 169a58ad824d896b9e291a27193342616e651b82 \fIzstd\fP (since Linux 6.2) .PD .RE .P The kernel only implements a single decompression method. This is selected during module generation accordingly to the compression method chosen in the kernel configuration. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, these system calls return 0. On error, \-1 is returned and \fIerrno\fP is set to indicate the error. .SH ОШИБКИ .TP \fBEBADMSG\fP (начиная с Linux 3.7) Неправильный формат подписи модуля. .TP \fBEBUSY\fP Истекло время ожидания попытки определения символьной ссылки данным модулем. .TP \fBEFAULT\fP Аргумент адреса ссылается на положение вне доступного адресного пространства процесса. .TP \fBENOKEY\fP (начиная с Linux 3.7) .\" commit 48ba2462ace6072741fd8d0058207d630ce93bf1 .\" commit 1d0059f3a468825b5fc5405c636a2f6e02707ffa .\" commit 106a4ee258d14818467829bf0e12aeae14c16cd7 Некорректная подпись или ядро не содержит ключа этого модуля. Данная ошибка возвращается только, если ядро было настроено с параметром \fBCONFIG_MODULE_SIG_FORCE\fP; если ядро собрано без этого параметра, то некорректный или не подписанный модуль просто примешивается (taints) в ядро. .TP \fBENOMEM\fP Не хватает памяти. .TP \fBEPERM\fP Вызывающий не имеет прав (не имеет мандата \fBCAP_SYS_MODULE\fP), или отключена загрузка модулей (смотрите \fI/proc/sys/kernel/modules_disabled\fP в \fBproc\fP(5)). .P Дополнительно в \fBinit_module\fP() могут возникать следующие ошибки: .TP \fBEEXIST\fP Модуль с таким именем уже загружен. .TP \fBEINVAL\fP .\" .TP .\" .BR EINVAL " (Linux 2.4 and earlier)" .\" Some .\" .I image .\" slot is filled in incorrectly, .\" .I image\->name .\" does not correspond to the original module name, some .\" .I image\->deps .\" entry does not correspond to a loaded module, .\" or some other similar inconsistency. Некорректное значение \fIparam_values\fP, или какая\-то часть образа ELF в \fImodule_image\fP содержит противоречивую информацию. .TP \fBENOEXEC\fP Двоичный образ, переданный \fImodule_image\fP, не является образом ELF, или образ ELF некорректный или для другой архитектуры. .P Дополнительно в \fBfinit_module\fP() могут возникать следующие ошибки: .TP \fBEBADF\fP Файл, на который ссылается \fIfd\fP, не открыт для чтения. .TP \fBEFBIG\fP Файл, на который ссылается \fIfd\fP, слишком большой. .TP \fBEINVAL\fP Значение \fIflags\fP неверно. .TP \fBEINVAL\fP The decompressor sanity checks failed, while loading a compressed module with flag \fBMODULE_INIT_COMPRESSED_FILE\fP set. .TP \fBENOEXEC\fP Значение \fIfd\fP не указывает на открытый файл. .TP \fBEOPNOTSUPP\fP (since Linux 5.17) The flag \fBMODULE_INIT_COMPRESSED_FILE\fP is set to load a compressed module, and the kernel was built without \fBCONFIG_MODULE_DECOMPRESS\fP. .TP \fBETXTBSY\fP (начиная с Linux 4.7) .\" commit 39d637af5aa7577f655c58b9e55587566c63a0af The file referred to by \fIfd\fP is opened for read\-write. .P Дополнительно к этим ошибкам, если функция модуля \fIinit\fP при выполнении возвратила ошибку, то \fBinit_module\fP() или \fBfinit_module\fP() завершается с ошибкой и в \fIerrno\fP записывается значение, полученное от функции \fIinit\fP. .SH СТАНДАРТЫ Linux. .SH ИСТОРИЯ .TP \fBfinit_module\fP() Linux 3.8. .P The \fBinit_module\fP() 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 \fBsyscall\fP(2). .SS "Linux версии 2.4 и более ранние" В Linux версии 2.4 и более ранних системный вызов \fBinit_module\fP() был немного другим: .P \fB#include \fP .P \fB int init_module(const char *\fP\fIname\fP\fB, struct module *\fP\fIimage\fP\fB);\fP .P (Приложения пользовательского пространства могут определить какая из версий \fBinit_module\fP() доступна, вызвав \fBquery_module\fP(); этот вызов завершается ошибкой \fBENOSYS\fP в Linux 2.6 и более новых.) .P Старая версия системного вызова загружает перемещённый образ модуля \fIimage\fP, в пространство ядра и выполняет функцию модуля \fIinit\fP. Вызывающий должен предоставить перемещённый образ (начиная с Linux 2.6, системный вызов \fBinit_module\fP() сам делает перемещение). .P Образ модуля начинается со структуры модуля, за которой следует код и данные. Начиная с Linux 2.2 структура модуля определена следующим образом: .P .in +4n .EX 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 }; .EE .in .P Все поля указателей, за исключением \fInext\fP и \fIrefs\fP, указывают в тело модуля и будут инициализированы в соответствии с адресным пространством ядра, то есть перемещены с остальной частью модуля. .SH ПРИМЕЧАНИЯ Информацию по уже загруженным модулями можно найти в файле \fI/proc/modules\fP и в соответствующем каждому модулю подкаталогу в \fI/sys/module\fP. .P Дополнительную информацию смотрите в файле \fIinclude/linux/module.h\fP из исходного кода ядра Linux. .SH "СМОТРИТЕ ТАКЖЕ" \fBcreate_module\fP(2), \fBdelete_module\fP(2), \fBquery_module\fP(2), \fBlsmod\fP(8), \fBmodprobe\fP(8) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Azamat Hackimov , Dmitriy S. Seregin , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .