Linux 内核模块编程 Hello World 模块
2011-03-24 22:34
501 查看
Linux 内核的整体结构非常庞大,其包含的组件也非常多。怎么样把需要的部分包含在内核中呢?
一种是将所需要的功能都编译到Linux 内核。但会导致两个问题,一是生成的内核会很大,二是如要在现有的内核中新增或删除功能,将不得不重新编译。因此Linux 提供了一种被成为模块(Module)的机制,可以实现以上效果。
模块具有以下特点:
模块本身不被编译入内核映像,从而控制了内核的大小。
模块一旦被加载,它就和内核的其他部分完全一样。
以下是最简单的内核模块“Hello World”
使用命令:make 之后在hello.c所在路径就会生成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卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能
一种是将所需要的功能都编译到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卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能
相关文章推荐
- [Kernel] Linux 4.10.0+ 下编译安装内核模块(Hello World为例)
- linux模块编程(二)——运行不息的内核线程kthread
- 如果你在学嵌入式底层驱动,内核模块编程将是你的第一课!小白学Linux之内核模块编程详解
- Linux 内核编程 or 内核模块编程的文件读写与信号传输问题
- 【原创】Linux 内核模块编程
- linux 内核模块编程简要总结
- linux 内核模块编程简要总结
- Linux 最简单内核模块 Hello World 示例
- 小白学Linux之内核模块编程 .
- 如果你在学嵌入式底层驱动,内核模块编程将是你的第一课!小白学Linux之内核模块编程详解
- linux 内核模块编程之LED驱动程序(六)
- Linux 内核模块之hello world
- linux模块编程(二)——运行不息的内核线程kthread
- linux 内核模块编程之hello word(二)
- Linux 内核模块 编程
- Linux 2.6.xx 内核模块编程入门
- linux 第一个内核模块Hello World
- 小白学Linux之内核模块编程
- linux 2.6内核编程-Hello world程序
- linux 内核模块编程简要总结