编写第一个内核模块
? ? 内核模块是Linux内核向外部提供的一个接口,其全称是动态可加载内核模块(Loadabkle Kernel Module,LKM)。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。
?
一、什么是模块
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或内核中其他上层功能。
#Makefile2.6obj-m += hellomod.o #产生hellomod模块的目标文件CURRENT_PATH := $(shell pwd) #模块所在的当前路径LINUX_KERNEL := $(shell uname -r) #内核版本#内核源码的绝对路径 (RedFlag 6.0)LINUX_KERNEL_PATH := /usr/src/kernels/2.6.31-4-i686all:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块clean:rm -rf *.mod.c *.o *.ko *.markers *.symvers *.order #清理
执行make命令,会自动生成模块相关文件(如 .o? .ko文件)
?
插入模块到内核
[root@localhost module]# insmod hellomod.ko
?
成功插入后,可以通过dmesg命令查看这个模块所执行的显示内容
[root@localhost module]# dmesg
?
...
Hello,Kernel! from the kernel space...
?
卸载模块
[root@localhost module]# rmmod hellomod
?
再次执行dmesg 显示
Hello,Kernel! from the kernel space...
Goodbye,Kernel! leaving the space...
?
注:查看(dmesg)其实是看日志,只要是看日志的方法应该都是可以的比如:tail /var/log/messages
?
?
?
?