您的位置:首页 > 运维架构 > Linux

Linux 内核模块编程 Hello World 模块

2011-03-24 22:34 501 查看
         Linux 内核的整体结构非常庞大,其包含的组件也非常多。怎么样把需要的部分包含在内核中呢?

        一种是将所需要的功能都编译到Linux 内核。但会导致两个问题,一是生成的内核会很大,二是如要在现有的内核中新增或删除功能,将不得不重新编译。因此Linux 提供了一种被成为模块(Module)的机制,可以实现以上效果。

模块具有以下特点:

模块本身不被编译入内核映像,从而控制了内核的大小。

模块一旦被加载,它就和内核的其他部分完全一样。

以下是最简单的内核模块“Hello World”         

Step1.编写 Hello.c

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_INFO "Hello world!/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Good Bye!/n");
}
module_init(hello_init);
module_exit(hello_exit);
 


Step2.编写Makefile 在Hello.c 在同一路径 ,并且M要大写 只需修改KENRNELDIR 之后的路径为自己kernel所在路径即 /home/summer/micro2440/kernel/linux-2.6.32.2

 

EXTRA_CFLAGS += $(DEBFLAGS)
ifeq ($(KERNELRELEASE),)
KERNELDIR := /home/summer/micro2440/kernel/linux-2.6.32.2
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY: modules modules_install clean
else
obj-m := hello.o
endif


 

Step3.编译 

 

使用命令:make 之后在hello.c所在路径就会生成hello.ko 目标文件

 

 

Step4.加载内核

使用insmod ./ hello.ko 加载 

 

[root@FriendlyARM /root]# insmod ./hello.ko 

Hello world!

 

*insmod 或者modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

 

使用lsmod 命令可以获得系统中加载了的模块及模块间的依赖关系,如下

 

lsmod[root@FriendlyARM /root]# lsmod

hello 620 0 - Live 0xbf00c000

 

*lsmod 命令实际上读取并分析/proc/modules文件

 

卸载模块 rmmod hello

 

[root@FriendlyARM /root]# rmmod hello

Good Bye!

 

*rmmod卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息