源文件:pppoe_easy.c
<xmp>#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
//模块参数
static char *lan= "ens33";
static char *wan= "ens38";
module_param(lan,charp,S_IRUSR);
module_param(wan,charp,S_IRUSR);
//模块加载时运行此函数
int easy_pppoe_init(void) //模块入口点没有传入参数(void)
{
printk(KERN_INFO "Loading Module\n");
return 0; //模块入口点必须返回int,0:成功 !0:失败
}
//模块删除时运行此函数
void easy_pppoe_exit(void) ////模块离开点没有传入参数(void)
{
printk(KERN_INFO "Removing Module\n");
}
//用于注册模块入口点和出口点的宏
module_init(easy_pppoe_init); //模块入口点
module_exit(easy_pppoe_exit); //模块离开点
MODULE_LICENSE("GPL"); //模块证书
MODULE_DESCRIPTION("easy pppoe Module"); //模块描述
MODULE_AUTHOR("eatm.app"); //模块作者
//查看调试输出信息
//cat /proc/kmsg</xmp>
Makefile
<xmp>obj-m := easy_pppoe.o
all:
make -C /usr/src/linux-headers-$(shell uname -r)/ M=$(shell pwd) modules
clean:
make -C /usr/src/linux-headers-$(shell uname -r)/ M=$(shell pwd) clean
</xmp>
内核模块调试脚本
<xmp>#!/bin/sh
#内核模块调试脚本
#此模块流程 卸载模块->[编译make->]->加载模块->查看调试输出->卸载模块
#使用方法
# ./run.sh [1] 设置参数1则先编译
module_name="easy_pppoe"
#检测返回值
check_result(){
if [ $1 -ne 0 ]; then
echo $2"失败"
exit 1
else
echo $2"完成"
fi
}
#卸载模块
uninstall_module(){
test=`lsmod | grep $1` #先判断模块是否被加载
if [ ${#test} -ne 0 ]; then
echo "卸载模块..."
rmmod $1".ko"
check_result $? "卸载模块"
fi
}
#不出错误则不输出运行程序
run_app(){
echo $2"..."
cmd_str=`$1`
out_str=$cmd_str
}
#拦截脚本中断.
trap 'on_exit' INT
on_exit () {
#卸载模块
uninstall_module $module_name
}
#先卸载模块
uninstall_module $module_name
#需要编译...
if [ $# -gt 0 ] && [ $1 -eq 1 ]; then
run_app "make" "编译模块"
fi
run_app "insmod $module_name.ko" "加载模块"
#查看调试输出.
echo "调试输出..."
cat /proc/kmsg</xmp>
1