ошибка 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 а затем попробуйте построить свой модуль и установить его по-своему ,чем вы не найдете никаких проблем. Гудлак.