Как скомпилировать модуль ядра с новым источником - PullRequest
4 голосов
/ 26 ноября 2011

Я пытаюсь скомпилировать модуль Hello World. У меня свежая Ubuntu в моей системе, у которой нет скомпилированного ядра.

Мое ядро:

2.6.32-34-родовой

Я дал следующий Makefile и получил ошибку:

obj-m += hello-1.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

# make
make -C /lib/modules/2.6.32-34-generic/build M=/home/james/Desktop/hello modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-34-generic'
make[2]: *** No rule to make target `/home/james/Desktop/hello/hello-1.c', needed by `/home/james/Desktop/hello/hello-1.o'.  Stop.
make[1]: *** [_module_/home/james/Desktop/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-34-generic'
make: *** [all] Error 2

Содержимое моего /lib/modules/2.6.32-34-generic:

total 3864
lrwxrwxrwx  1 root root     40 2011-11-05 15:55 build -> /usr/src/linux-headers-2.6.32-34-generic
drwxr-xr-x  2 root root   4096 2011-11-05 15:49 initrd
drwxr-xr-x 10 root root   4096 2011-11-05 15:49 kernel
.......................................................
.......................................................

Папка /usr/src/linux-headers-2.6.32-34-generic существует.

Поскольку это не сработало, я загрузил исходный код linux-headers-2.6.32-34-generic из Ubuntu , скомпилировал и изменил мой Makefile на:

obj-m += hello-1.o
all:
    make -C /usr/src/linux-2.6.32/ M=$(PWD) modules

clean:
    make -C /usr/src/linux-2.6.32/ M=$(PWD) clean

#make
make -C /usr/src/linux-2.6.32/ M=/home/james/Desktop/hello modules
make[1]: Entering directory `/usr/src/linux-2.6.32'

  ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.


  WARNING: Symbol version dump /usr/src/linux-2.6.32/Module.symvers
           is missing; modules will have no dependencies and modversions.

make[2]: *** No rule to make target `/home/james/Desktop/hello/hello-1.c', needed by `/home/james/Desktop/hello/hello-1.o'.  Stop.
make[1]: *** [_module_/home/james/Desktop/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.32'
make: *** [all] Error 2

Может ли кто-нибудь помочь мне решить эту проблему. http://packages.ubuntu.com/lucid-updates/devel/linux-headers-2.6.32-34-generic

У меня есть несколько общих вопросов.

После новой установки, каков наилучший способ компиляции ядра. После того как я скомпилировал ядро ​​и собрал модуль, он работал без сбоев раньше Но я не мог знать, что делать в этой ситуации

Ответы [ 4 ]

2 голосов
/ 21 мая 2014

Ошибка:

ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.


  WARNING: Symbol version dump /usr/src/linux-2.6.32/Module.symvers
           is missing; modules will have no dependencies and modversions.

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

Вот как вы должны скомпилировать любой модуль ядра.

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

Скопируйте файл "config-xxxx" старого ядра из каталога / boot / в новый каталог с исходным кодом ядра и переименуйте его в ".config".

Затем выполните «make oldconfig», которая создаст резервную копию .config в .config.old и создаст новый .config на основе нового исходного кода ядра. Просто введите «ENTER» для всех настроек по умолчанию (их много).

Далее нужно выполнить make (и подождать некоторое время) - он сгенерирует новый файл ядра "vmlinux" вместе со многими другими файлами, которые читаются в процессе компиляции модулей.

Теперь вы можете перейти в свой каталог, где находится исходный код модуля ядра, и на основе следующего Makefile:

obj-m += hello-1.o

default: modules

modules:

    make -C /kernel_source/ M=$(PWD) modules

clean:
    make -C /kernel_source/ M=$(PWD) clean

Вместе с Makefile находятся ваш заголовок и исходный файл hello-1.c, расположенные вместе.

Просто "make" и ваши модули ядра должны быть успешно сгенерированы.

2 голосов
/ 26 ноября 2011

Вам нужно установить какой-то пакет, такой как 'kernel-devel', на Fedora (извините, я не пользователь Ubuntu), он предоставляет заголовки и .config для компиляции вашего модуля ядра.

1 голос
/ 26 ноября 2011

make [2]: * Нет правила для создания цели /home/james/Desktop/hello/hello-1.c', needed by / home / james / Desktop / hello / hello-1.o '.Стоп

Вы сталкиваетесь с этой ошибкой в ​​первой компиляции, потому что файл hello-1.c отсутствует в / home / james / Desktop / hello / каталог.

0 голосов
/ 14 мая 2014
  1. Проверьте, существует ли hello-1.c в каталоге / home / james / Desktop / hello /.
  2. Вам нужно иметь modules_enabled в вашем ядре. Вам нужно собрать новое ядро, чтобы сделать это. Следующий пост объясняет, как правильно собрать ядро. Включить модули в конфигурации сборки ядра.

    http://kernelnewbies.org/FAQ/KernelCompilation

...