linux模块的编译步骤详解

本文详细介绍了Linux内核模块的编译步骤,包括源码准备、编写Makefile、解决编译过程中遇到的问题(如kernel-devel缺失),以及如何加载和卸载模块。通过示例代码“hello world”模块,读者可以了解整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Linux 模块的编译步骤

1. 源码准备

#include <linux/init.h>

#include<linux/module.h>

MODULE_LICENSE("GPL");

static int hello_init(void)

{

 printk(KERN_ALERT"Hello,world!\n");

 return 0;

}

static int hello_exit(void)

{

 

 printk(KERN_ALERT"good bye,cruelworld!\n");

}

module_init(hello_init);

module_exit(hello_exit);

 

2. 编写Makefile文件

obj-m := modules.o

modules-objs := mymod.o

KDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

 

default:

make -C $(KDIR) M=$(PWD) modules

 

#clean:

#rm -rf *.o *.cmd *.ko *.mod.c*.tmp_versions

注意:default下面一行要以tab键开头。

3. 编译模块

在mymod.c所在文件夹中,执行make,出现错误:

make-C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules

make: *** /lib/modules/2.6.32-220.el6.x86_64/build: 没有那个文件或目录。 停止。make: *** [default] 错误 2

   原因分析:其实该目录下的build文件是存在的,不过build文件是一个链接文件,它指向的内容不存在。也就是/usr/src/kernels目录为空,所以出现了这个错误。KDIR目录是模块编译环境的目录。这种情况的出现时由于缺少内核开发包kernel-devel导致的。

解决方法:直接利用本地镜像文件来安装。

首先挂载镜像文件:mount /dev/cdrom /mnt/cds,然后进入Packages目录下;

然后搜索是否安装kernel-devel:rpm –q kernel-devel*,出现提示:

package kernel-debug-2.6.32-220.el6.x86_64.rpm is not installed

package kernel-debug-devel-2.6.32-220.el6.x86_64.rpm is notinstalled

package kernel-devel-2.6.32-220.el6.x86_64.rpm is notinstalled

package kernel-doc-2.6.32-220.el6.noarch.rpm is not installed

这时候,利用命令rpm -ivh kernel-devel-2.6.32-220.el6.x86_64.rpm安装即可。

当这个错误解决后,再次运行make:

make -C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules

make[1]: Entering directory`/usr/src/kernels/2.6.32-220.el6.x86_64'

  CC [M]  /zk/mymod.o

/zk/mymod.c: 在函数‘__exittest’中:

/zk/mymod.c:16: 警告:返回了不兼容的指针类型

  LD [M]  /zk/modules.o

  Building modules, stage2.

  MODPOST 1 modules

  CC      /zk/modules.mod.o

  LD [M]  /zk/modules.ko.unsigned

  NO SIGN [M]/zk/modules.ko

make[1]: Leaving directory`/usr/src/kernels/2.6.32-220.el6.x86_64'

这时候,在mymod.c所在的目录生成了如下几个文件:

modules.mod.o   mymod.c  modules.ko   modules.o       mymod.o

modules.ko.unsigned      modules.order      modules.mod.c        Module.symvers

4. 加载和卸载我们的模块

终端输入:

[root@localhost zk]# insmod modules.ko

然后查看是否成功挂载:[root@localhost zk]# dmesg | tail -1

输出结果如下:

Hello,world!

然后再卸载一下模块: [root@localhost zk]# rmmodmodules.ko

然后查看是否成功卸载: [root@localhost zk]# dmesg |tail -2

输出如下: Hello,world!

good bye,cruel world!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值