ошибка insmod: вставка './привет.ko': -1 недопустимый формат модуля"

Я только что сделал свой первый модуль драйвера, модуль hello world после LDD3. Однако, к сожалению, столкнулся с этой ошибкой:

insmod: error inserting './hello.ko': -1 Invalid module format.

я делаю это на Ubuntu 11.04, и мое окружение:

$ uname -r
2.6.38-8-generic

Я получаю источник ядра следующим образом:

sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.38 - Linux kernel source for version 2.6.38 with Ubuntu patches
$sudo apt-get install linux-source-2.6.38

my / usr / src:

$ls /usr/src/
linux-headers-2.6.38-8          linux-source-2.6.38          vboxguest-5.0.10
linux-headers-2.6.38-8-generic  linux-source-2.6.38.tar.bz2

и затем я компилирую ядро

$sudo cp /boot/config-2.6.38-8-generic ./.config
$sudo make menuconfig -- load the .config file
$make
$make modules

а затем я компилирую свой модуль ядра

$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules

С Файл Makefile:

obj-m := hello.o

и, наконец, когда я вставляю модуль:

$sudo insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format

что я нашел в dmesg:

hello: disagrees about version of symbol module_layout

так в чем проблема?

Я также заметил, что linux-header is -2.26.38-generic и версия исходного кода -2.26.38, это проблема? но я действительно не нашел linux-source-2.26.38-generic пакета по сети.

обновить статус : Я обнаружил, что файл / lib / moduels / $(name-r) / build/Makefile указывает на мое запущенное ядро версия:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 38
EXTRAVERSION = .2

поэтому я загружаю linux-2.6.38.2 и компилирую, но все та же ошибка.

Я также обнаружил, что есть строка в /boot / config - $(uname-r):

CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"

кто-нибудь знает, что это значит? Я не вижу его в конфигурационном файле ядра, которое я создаю.

3 ответов


ядро, из которого вы создаете свой модуль ядра и в который вы вставляете модуль, должно иметь ту же версию. Если вы не хотите заботиться об этой вещи, вы можете использовать следующий Makefile.

obj−m += hello−world.o

all:
 make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules
clean:
 make −C /lib/modules/$(shell uname −r)/build M=$(PWD) clean

Теперь вы можете построить и попытаться вставить модуль.

Я предлагаю вам стать root, если это возможно, перед этой строкой

$sudo cp / boot / config-2.6.38-8-общий ./.config

$su
#cp /boot/config-2.6.38-8-generic ./.config
#insmod hello_world.ko

альтернативно вы также можете использовать после make file

TARGET  := hello-world
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc-3.0

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o

попробуйте использовать кросс-компиляции. Пожалуйста, посмотрите на код ниже для файла make. Помните о отступе, иначе вы можете закончить с ошибкой, такой как отсутствует сепаратор. Остановка

obj-m += hello_.o #это имя должно быть имя .файл c. Я просто использую hello, например

Я предлагаю лучший подход через кросс-компиляцию

создайте переменную для хранения имени каталога, в котором находится каталог ядра linux в моем примере, измените значение "PATH_TO_LINUX_KERNEL_DIRECTORY" в реальный путь значение Пример ~ / linux Вам действительно нужно сделать это, чтобы файл make знал, где найти arm-linux-gnueabi-без этого вы, скорее всего, столкнетесь с проблемами arm-linux-gnueabi-

KDIR := PATH_TO_LINUX_KERNEL_DIRECTORY

all:
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C $(KDIR) M=$(shell pwd) modules

clean:
    make -C $(KDIR) M=$(shell pwd) clean

вы сделали все правильно, но не загрузили свою систему с ядром, которое вы скомпилировали, поэтому первым шагом является загрузка с ним. Если вы используете Ubuntu, вы можете удерживать кнопку shift во время загрузки, и вам будет предоставлен список скомпилированного ядра в вашей системе, оттуда выберите linux-source-2.6.38 а затем попробуйте построить свой модуль и установить его по-своему ,чем вы не найдете никаких проблем. Гудлак.