nixp.ru v3.0

24 октября 2017,
вторник,
01:34:55 MSK

DevOps с компанией «Флант»
Yorik написал 1 июня 2005 года в 17:06 (428 просмотров) Ведет себя как мужчина; открыл 13 тем в форуме, оставил 25 комментариев на сайте.

Привет всем

Недавно увлекся «ядреным» программированием, посему вопрос:

Есть 2 компа под Slackware 10, ядро 2.4.29.

Берем простейшую программу:

#define MODULE
#define __KERNEL__
#include 
#include 
int init_module(void)
{
  printk("example.o: loaded\n");
  return 0;
}
void cleanup_module(void)
{
   printk("example.o: unloaded...\n");
}
=======================
Makefile:
CC=gcc
module=example
MODFLAGS:= -O3 -Wall -DLINUX
$(module).o:      $(module).c
            $(CC) $(MODFLAGS) -c $^ -o $@

На одной машине все работает отлично. Дома на 2-й машине с виду тоже все нормально: компилируется, линкуется, но модуль не загружается:

#insmod example.o

couldn’t find the kernel version the module was compiled for

В принципе можно попробовать, как советовали на linuxquestions:

#define MODULE
#define __KERNEL__
#include 
#if defined(CONFIG_MODVERSIONS)
#define MODVERSIONS
#include 
#endif
#include 
int init_module(void)
{
  printk("example.o: loaded\n");
  return 0;
}
void cleanup_module(void)
{
   printk("example.o: unloaded...\n");
}

,но ведь на одной машине все работает…

Почему? Ядра на «нерабочей» машине пробовал менять — без результата.

sarel

http://gazette.linux.ru.net/rus/articles/lkmpg.html

Очень хорошее пособие по ядерному программингу…

Там Хорошо объяснено про несовпадение версий.

Genie

разница в том, как скомпилировано само ядро. если посмотреть внимательно опции конфигурирования ядра, то там есть «Module versioning support» (это касательно 2.6.*, в 2.4.* должно быть что-то аналогичное)

в принципе, скорее всего, это не совсем то, что требуется тебе, но — направление где-то в эту сторону.

Yorik

…Значится попробовал я компилить без поддержки версий (см. 2-й пример). Облом-с. Та же ошибка:

couldn’t find the kernel version the module was compiled for

Полагаю, что-то криво работает в системе. Ядро на обеих машинах одинаковое (см. начало поста), если на одной машине все работает, то и на другой должно. Думал, может проблема в компиляторе(у меня gcc-3.3.4 и gss-3.4.3) — нифига. Тыкал носом в сурсы:

MODFLAGS:= -O3 -Wall -DLINUX  -I/usr/src/linux-2.4.29

- не помогло. Переустанавливать систему не хочу — хочу разобраться.

Какие будут предположения, господа?

ЗЫ.

Насчет http://gazette.linux.ru.net/rus/articles/lkmpg.html знаю, но интереснее здесь: http://www.kernelnewbies.org/

Yorik

…один момент: заметил, что такая же ошибка появляется, если пытаться компилировать модуль без первых 2-х строк (#define MODULE и

#define _KERNEL_) на «нормальной» машине

metal
Yorik

MODFLAGS:= -O3 -Wall -DLINUX  -I/usr/src/linux-2.4.29

/

-I — обычно include, может надо тыкнуть носом не в сорцы, а в include в сорцах?

Предлагаю сделать nm для обоих модулей и сравнить