1.用户空间和内核空间
模块运行在内核空间,应用程序运行在用户空间。内核运行在最高优先级(超级用户态),应用程序的运行在最低优先级(用户态)。用户空间和内核空间不仅说明了两种模式具有不同的优先级等级,还说明每个模式都有自己的内核映射,也有自己的地址空间(虚拟的地址)。
2. HelloWorld 模块
Hello.c
---------------------------------------------------------------------------
#include<linux/init.h>
#include<linux/module.h>
staticchar *name = "world";
Statichowmany = 1;
//模块参数
module_param(name,charp,S_IRUGO);
module_param(howmany,int,S_IRUGO);
//hello_int前面的__init对内核是一种暗示,表示在初始化后函数将被丢掉
staticint __init hello_init(void)
{
for(int i=0;i<howmany;i++)
printk(KERN_ALERT"Hello,%s\n",name);
return 0;
}
//hello_exit前面的__exit对内核是一种暗示,表示只能在模块被卸载或是系统关闭时调用
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruelworld\n");
}
module_init(hello_init); //模块初始化,注册初始化函数
module_exit(hello_exit); //模块退出,注册模块清理函数
MODULE_LICENSE("DualBSD/GPL");
MODULE_AUTHOR("sunry");
MODULE_DESCRIPTION("hello world");
--------------------------------------------------------------------------
Makefile
-------------------------------------------------------------------------
obj-m:= hello.o //说明有一个模块要从目标文件hello.o中构建
//hello-objs:= file1.o file2.o //如果hello.ko基于两个源文件file1.c,file2.c生成则如此
KERNELDIR=/usr/src/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm *.mod.c *.o *.order *.symvers *.ko
-------------------------------------------------------------------------
操作
*********************************************
$sudomake
//调用Makefile,编译
$sudo insmod hello.ko 或 sudo insmod hello.koname="xxx" howmany=5
//打印信息没有出现在console上。 可以通过dmesg命令查看,或cat/var/log/syslog
$sudo rmmod hello
*********************************************
模块相关命令
modinfo //查看模块信息 (加载/未加载)
insmod hello.ko //加载模块到内核
modprob //装载模块,同时装入指定模块所依赖的其他模块
lsmod //查看加载模块
rmmod hello //卸载模块
模块参数
驱动程序有时会根据平台的不同需要配置一些参数。内核允许对程序驱动制定参数,可以在装载驱动程序时改变。可以在运行insmod或modprob命令时赋值。
例如:insmod hellop name="you" howmany=5