LINUX.ORG.RU

программная загрузка модуля в ядро


0

0

Доброго времени суток всем! Надо из программы загрузить модуль в ядро, не используя insmod etc. Посмотрел исходник insmod - он вроде использует какие-то внешние функции для работы с ядром. Никто не в курсе, что это за библиотека или если я ошибаюсь, то как это можно сделать? Спасибо.

anonymous

посмотрел в insmod.c из пакета module-init-tools:

	ret = init_module(file, len, options);

все нормально, используется системны вызов init_module...
что не нравится? :)

anonymous
()
Ответ на: комментарий от anonymous

непонятно какой библиотечный файл пдключать для того чтобы эта функция импортировалась и какую библиотеку для этого использовать в /usr/include нет определения ни этой функции ни delete_module которую использует rmmod

anonymous
()
Ответ на: комментарий от SatanClaus

Вот что у меня(Fedora Core4):

# man 2 init_module No entry for init_module in section 2 of the manual

# cat /usr/include/linux/module.h |grep init_module выдает пустую строку :( Может это связано с дистрибутивом?

anonymous
()
Ответ на: комментарий от anonymous

имелось ввиду что нет мана по init_module

anonymous
()
Ответ на: комментарий от SatanClaus

действительно запутано все как-то... может все-таки стоит попробовать

syscall(SYS_init_module, file, len, options);

anonymous
()
Ответ на: комментарий от anonymous

вот кстати статья: ------------ Модуль ядра (в дальнейшем просто модуль для краткости) должен иметь по крайней мере две функции: init_module, которая вызывается, когда модуль вставляется в ядро и cleanup_module, которая вызывается, когда он удаляется. Обычно init_module регистрирует драйвер для каких-либо действий с ядром или заменяет одну из ядерных функций собственным кодом (обычно код делает что-то и затем вызывает первоначальную функцию). Функция cleanup_module, как предполагается, отменяет все, что сделано init_module, так что модуль может быть выгружен безопасно. ------------- я вообще запутался... а еще я прочитал, что insmod - это линковщик, который ищет процедуры модуля и экспортирует их в ядро

Видимо от версии к версии ядра линукс все это очень сильно менялось

anonymous
()
Ответ на: комментарий от anonymous

в исходниках modutils-2.4.25 insmod.c определена функция init_module прямо внутри файла: extern long init_module(void *, unsigned long, const char *);

это однако довольно странно...

anonymous
()
Ответ на: комментарий от anonymous

опрежеление в мане по линку не соответствует определению init_module в insmod... чушь какая-то... сейчас буду пробовать все подряд...

anonymous
()
Ответ на: комментарий от anonymous

В ней они похоже собирают тот самый image, структуру с параметрами которые отдадут ядру, сам вызов делается в другом месте.

SatanClaus ★★★
()

Короче так:

1) взял пакет module-init-tools-3.1 (то что было под рукой, может
   есть что поновее)

2) выдрал оттуда файл insmod.c

3) изменил его следующим образом:

--- insmode.c.orig      2004-03-30 17:41:46.000000000 -0800
+++ insmod.c    2005-10-28 17:09:45.820404344 -0700
@@ -28,11 +28,9 @@
 #include <errno.h>
 #include <asm/unistd.h>

-#include "backwards_compat.c"

 #define streq(a,b) (strcmp((a),(b)) == 0)

-extern long init_module(void *, unsigned long, const char *);

 static void print_usage(const char *progname)
 {
@@ -94,13 +92,8 @@ int main(int argc, char *argv[])
        char *filename, *options = strdup("");
        char *progname = argv[0];

-       if (strstr(argv[0], "insmod.static"))
-               try_old_version("insmod.static", argv);
-       else
-               try_old_version("insmod", argv);
-
        if (argv[1] && (streq(argv[1], "--version") || streq(argv[1], "-V"))) {
-               puts(PACKAGE " version " VERSION);
+               puts( "insmode  version 3.1" );
                exit(0);
        }

@@ -131,7 +124,7 @@ int main(int argc, char *argv[])
                exit(1);
        }

-       ret = init_module(file, len, options);
+       ret = syscall(__NR_init_module, file, len, options);
        if (ret != 0) {
                fprintf(stderr, "insmod: error inserting '%s': %li %s\n",
                        filename, ret, moderror(errno));

4) откомпилировал с помощью gcc -o insmod insmod.c

5) сделал su и потестил - модули вставляет

6) ключевые моменты:
+       ret = syscall(__NR_init_module, file, len, options);
и ф-ция static void *grab_file(const char *filename, unsigned long *size)

anonymous
()
Ответ на: комментарий от anonymous

вроде разобрался, но все равно вышли пожалуйста на nnosov@gmail.com спасибо еще раз.

anonymous
()

Надож было в старые исходники модутилов залезть. Позор на мою седую голову;)

SatanClaus ★★★
()

А на хрена это надо? Даже ядро само модули не грузит, а запускает то, что указано в /proc/sys/kernel/modprobe

VovanE
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.