ubuntu10.10构建内核树

原创
小哥 3年前 (2022-10-19) 阅读数 12 #运维
文章标签 ubuntu10.10

驱动程序与用户程序不同,它作为附加到内核模块的模块运行,并在内核空间中运行。

因此,要运行我们自己构建的模块,我们需要让我们自己的系统已经配置了一个内核树,然后将目标模块连接到内核树来运行它!

您可以检查您的计算机是否配置了内核树,您可以转到 /lib/modules/2.6.35-22-generic在目录下,看看是否在目录下,如果build这个文件夹,如果它在那里,意味着你已经有一个内核树,如果没有,构建你自己的内核树。

核心树构建过程核心树构建过程核心树构建过程

安装编译内核所需的软件(或者不安装,除非您想使用它) make menuconfig,用make oldconfig不要)

sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot

下载内核源代码下载内核源代码下载内核源代码

先查看linux内核版本。内核版本。$uname -r

网上说用apt-cache search linux-source命令, 将列出多个可选的源包,对齐您的内核版本号并选择“with Ubuntu patche”的那个

最后用apt-get install linux-source-2.6.35下载。解压缩源包,然后转到解压缩后的源代码所在的目录。

但我试过了,但我不能搜索,但我仍然可以直接使用上面的apt-get 命令下载,但我下载了,你也可以直接到这个URL下载源代码,里面有各种版本的内核,从1.0到2.6那些拥有的人。都是可用的。最重要的是。

http://www.at.kernel.org/pub/linux/kernel/

编译之前我们需要在编译之前我们需要在编译之前我们需要Ubuntu事实证明,内核的一个配置文件,即/usr/src预览目录中的文档。预览目录中的文档。预览目录中的文件。ls -al

drwxr-xr-x  4 root root     4096 2010-09-04 21:31 fglrx-8.723.1
drwxr-xr-x 24 root root     4096 2010-09-04 20:35 linux-headers-2.6.35-22
drwxr-xr-x  7 root root     4096 2010-09-04 20:35 linux-headers-2.6.35-22-generic
drwxr-xr-x 25 root root     4096 2010-09-16 21:39 linux-source-2.6.35
-rw-r--r--  1 root root 65846876 2010-09-01 22:41 linux-source-2.6.35.tar.bz2

现在我们需要现在我们现在需要我们现在需要/boot目录下的config-2.6.35-22-generic文件,我们将其复制到刚刚下载并解压缩的目录中,该目录是linux-source-2.6.35

sudo cp /boot/config-2.6.35-22-generic /usr/src/linux-source-2.6.35/.config

接下来,切换到下一步,切换到root用户
sudo -i

cd /usr/src/linux-source-2.6.35

make menuconfig或者直接make oldconfig(无需拷贝.config)

终端将调出配置屏幕。终端调出配置屏幕

有两个最后的项目。最后,有两个项目。最后,有两个项目。最后两件。load a alternative kernel configuration...
save a alternative configuration...
选择load a kernel configuration保存,然后选择保存,然后选择保存,然后选择save akernel configuration再次保存可退出并退出配置环境。

接下来,我们将开始编译。接下来,我们将开始汇编。接下来,我们必须开始编译。

cd /usr/src/linux-source-2.6.35

make

请记住以管理员帐户运行它,如果您的cpuIS双核可用于IS是双核可用于IS双核可用于IS双核可用于make后跟一个参数。后跟一个形参,后跟一个形参,后跟一个make -j4.

make bzImage 执行后,您可以看到在当前目录中创建了一个新文件: vmlinux, 其属性为-rwxr-xr-x。

现在是编译模块的时候了,但是 编译模块时可能会出现以下问题
编译问题(编译问题(编译问题(ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory
解决办法。解决方案。

在/usr/src/linux-source-2.6.35/ubuntu/omnibook/Makefile 中

ifeq ($(KERNELRELEASE),)

Support for direct Makefile invocation

在前面加上。在前面添加
PWD=$(shell pwd)

也就是在ifeq添加到最顶行。

然后编译模块

make modules / 编译 模块 /

make modules_install  此命令可用于此命令/lib/modules在该目录下生成一个目录在

如果一切顺利并且编译过程中没有错误,那么我们就可以开始了linux模块的helloworld了。

我在 /home/xxxx/linux_modules/ 要创建的目录要创建的目录在目录创建下创建的目录2文本文件文本文件 hello.c Makefile

//hello.c

include <linux/init.h>

include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

//Makefile

Makefile2.6(2.6内核专用内核专用内核专用Makefile文件)

ifneq ($(KERNELRELEASE),)

kbuild syntax. dependency relationshsip of files and target modules are listed here.

mymodule-objs := hello.o #param-objs := file1.o file2.o
obj-m := hello.o         #obj-m := param.o
else
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .o ~ core .depend ..cmd .ko *.mod.c .tmp_versions #此伪命令不起作用,待解决,不影响make

.PHONY: modules modules_install clean
endif

KERNELRELEASE 位于内核源代码的顶层Makefile在此变量的第一次读取执行中定义的变量Makefile时,KERNELRELEASE没有定义,所以没有定义,所以没有定义,所以make将读 取执行else如果在那之后,如果 make的目标是clean、直接执行、直接实现clean操作,然后结束。什么时候make的目标为all时,-C $(KDIR)指定跳转到内核源代码目录以读取Makefile;M=$(PWD) 指示它然后返回到当前目录以继续读入,并执行当前Makefile。从内核源代码目录返回时,KERNELRELEASE已经被定义了。已经被定义了。已经定义,已经定义了kbuild也被激活解题也开始解题 析kbuild该语句的语法make将继续阅读将继续阅读else以前的内容。以前的内容。在此之前。else前一内容是前一内容是前一内容读前一内容kbuild该语句的语法指明模块源码中各文件的依赖关系,以及 要生成的目标模块的名称。要生成的目标模块的名称。要生成的目标模块的名称。param-objs := file1.o file2.o 表示param.o由file1.o与file2.o 连接生成。连接生成、obj-m := param.o指示编译后的连接将生成param.o模块。

值得注意的是,需要注意的是,请注意makefile的格式$(MAKE)前面是,前面是一个tab.
make 在没有错误的情况下使用ls -al查看linux_modules在目录中生成了以下文件:
hello.c   hello.mod.c  hello.o   modules.order
hello.ko  hello.mod.o  Makefile  Module.symvers

其中hello.ko可以加载的模块文件是可加载的模块文件是可以加载的模块文件是可加载的模块文件

现在我们可以获得编译的模块我们现在可以获得编译的模块现在我们可以将编译的模块放入helloworld加载到内核加载到内核加载到内核加载到内核

insmod ./hello.ko   //此命令将此命令放置此命令放置hello.ko加载到内核加载到内核

lsmod|grep hello   //lsmod 此命令允许您查看所有当前的驱动程序模块,并应显示结果hello 680 0

rmmod hello         //此命令将此命令放入此命令是一种放入此命令的方式hello此模块从此模块中删除此模块从此模块中删除

该程序的输出可以在(printk 不输出到终端否输出到终端不会输出到终端不会输出到终端)

dmesg |grep world
或是/var/log/syslog在文件中查看在文件中查看在文件中查看

Hello,World
Goodbye,cruel world

这是程序的输出。这是程序输出。

如果输入时输入,如果输入时输入,如果输入insmod ./hello.ko当出现以下错误消息时,将显示以下错误消息。 insmod: error inserting hello.ko: -1 Invalid module format

则 这是因为记录版本号的字符串与当前运行的内核模块的版本号不同,并且该版本戳以静态字符串的形式存在于内核模块中,称为vermagic您可以编译从模块中间生成的文件helloworld.moc.h一旦发生这种情况。以防出现这种情况。以防这种情况发生。以防这种情况发生。

1,根据modinfo hello.ko命令查看vermagic的值
2,根据uname -r查看内核版本查看内核版本
3,比较以上两个步骤的值以查看它们是否相同
若相同,我就是不知道。我不知道。我不会知道的。
若不同,采用make -C /lib/modules/这是与您的内核版本号对应的文件夹/build M=模块源代码的路径模块源代码的路径 modules 

转载于:https://www.cnblogs.com/hnrainll/archive/2011/04/22/2024468.html

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除