如何针对新Source编译内核模块

时间:2011-11-26 04:19:05

标签: linux linux-kernel kernel kernel-module

我正在尝试编译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 source from 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 个答案:

答案 0 :(得分:2)

你需要在Fedora上安装一些类似'kernel-devel'的软件包(抱歉我不是Ubuntu用户),它提供头文件和.config来编译内核模块。

答案 1 :(得分:2)

错误:

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。

Just" make"并且应该成功生成内核模块。

答案 2 :(得分:1)

  

make [2]: * 没有规则可以制作目标   /home/james/Desktop/hello/hello-1.c', needed by /家庭/詹姆斯/桌面/你好/ HELLO-1.O”。停止

您在第一次编译中遇到此错误,因为 / home / james / Desktop / hello / 目录中缺少 hello-1.c 文件。

答案 3 :(得分:0)

  1. 检查/ home / james / Desktop / hello /目录中是否存在hello-1.c。
  2. 您需要在内核中安装modules_enabled。您需要编译一个新的内核来执行此操作。 以下文章解释了如何很好地构建内核。在内核构建配置中启用模块。

    http://kernelnewbies.org/FAQ/KernelCompilation