Olej писал(а):
Параметры - параметрами...
Я это и делал в примере выше: в качестве параметра задавалось имя, под которым модуль будет загружен и далее известен системе. Даже так ... и это возможно параметризовать. Но загрузить 2 экземпляра модуля под разными именами параметризованных - система не позволяет.
Olej писал(а):
- система контролирует загрузку модулей (и правильно делает! - это целостность всей системы), но делает это не по тому имени, под которым модуль известен и зарегистрирован в системе! ... а каким-то (почти наверняка) контролем тела файла из которого грузится модуль.
Olej писал(а):
P.S. Я как-то встречал в описаниях возможность (опциями insmod?) отменить вообще контроль соответствия сигнатуры ОС в модуле ... т.е. загружать модуль, который, возможно, собирался и для другого ядра. Что такая возможность есть - это точно.
Ну тут как всегда, чем много писать - лучше посмотреть в исходном коде как это всё работает
1) Сам insmod тупой как пробка - тупо собирает параметры и копирует файл в пользовательский буфер и далее вызов syscall. Весь процессинг идёт в syscall init_module (sys_init_module) -
http://lxr.free-electrons.com/source/ke ... le.c#L2978
2) Все чеки делаются здесь -
http://lxr.free-electrons.com/source/ke ... le.c#L2835
Например:
- контроль имени
Код: Выделить всё
if (find_module(mod->name)) {
err = -EEXIST;
goto unlock;
}
- проверка на конфликт с уже экспортироваными ядром символами
- проверка на соответсвие модуля исполняемому формату ELF
3) Форсирование вермаджика -
http://lxr.free-electrons.com/source/ke ... le.c#L2513
Код: Выделить всё
/* This is allowed: modprobe --force will invalidate it. */
if (!modmagic) {
err = try_to_force_load(mod, "bad vermagic");
if (err)
return err;
4) то сообщение (
[ 4611.800836] mod_test: module is already loaded), которое вы получили исходит от сюда (попытка инициализации sysfs для модуля) -
http://lxr.free-electrons.com/source/ke ... le.c#L1532
Но
Г Л А В Н О Е!!!!
А главное, почему не работает ваш трюк с алиасами - определённая вами функция инициализации модуля, выполняется позже всех этих проверок (когда вы ещё не переименовали его явно)
http://lxr.free-electrons.com/source/ke ... le.c#L2978
Код: Выделить всё
SYSCALL_DEFINE3(init_module, void __user *, umod,
unsigned long, len, const char __user *, uargs)
{
................................................
/* Do all the hard work */
mod = load_module(umod, len, uargs); // <------ тут проверки
if (IS_ERR(mod))
return PTR_ERR(mod);
.................................................
if (mod->init != NULL)
ret = do_one_initcall(mod->init); // <----- тут вы переименовываете
................................................
}