一般内核驱动都是在实体机上跑的,那有没有方法在ubuntu直接编译并运行呢?带着这个问题在网上查了一些资料,之后就实现了。
运行
hello.c
#include<linux/init.h> //初始换函数
#include<linux/kernel.h> //内核头文件
#include<linux/module.h> //模块的头文件
static int hello_init(void)
{
printk("aldrich Hello, world\n");
return0;
}
staticvoid hello_exit(void)
{
printk("aldrich Goodbye,Hello world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("BSD/GPL");
Makefile
obj-m:=hello.o
KERNELDIR:=/lib/modules/`uname -r`/build
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *o *.mod.c *.order *.symvers
开始编译
sudo make
输出
make -C /lib/modules/`uname -r`/build M=/home/aldrich/work/hello modules
make[1]:Entering directory '/usr/src/linux-headers-4.4.0-31-generic'
CC [M]/home/aldrich/work/hello/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/aldrich/work/hello/hello.mod.o
LD [M]/home/aldrich/work/hello/hello.ko
make[1]:Leaving directory '/usr/src/linux-headers-4.4.0-31-generic'
生成的文件
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o MakefileModule.symvers
加载模块
sudo insmod hello.ko
会在/var/log/syslog文件中输出该打印信息
查看加载模块
sudo lsmod
.
Module Size Used by
hello 16384 0
删除模块
sudo rmmod hello
查看输出的打印信息‘
cat /var/log/syslog |grep world
.
Feb2019:33:17 tom kernel:[3792.439223] aldrich Hello, world
Feb2019:33:50 tom kernel:[3824.708500] aldrich Goodbye,Hello world
至此。