Ubuntu上开发编译内核模块以及调试内核模块,并查看printk打印的消息
前言:在开发中,为了方便,其实我们是可以先在ubuntu运行和测试内核模块,测试好了再用交叉编译到ARM设备上运行。下面就介绍一下方法和测试代码。
1.模块C代码。
helloworld.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "hello driver init!\n");//KERN_EMERG
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "hello driver exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("RFIDUNION");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple driver");
MODULE_ALIAS("a simple test module");
二、Makefile文件代码如下。其中 /lib/modules/4.4.0-128-generic/build是我电脑ubuntu版本的linux内核。
#MAKEFILE = Makefile
ifneq ($(KERNELRELEASE),)
module-objs := helloworld.o
obj-m := helloworld.o
else
KERNELDIR := /lib/modules/4.4.0-128-generic/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~core.depend.*.cmd *.ko *.mod.c.tmp versions
三、在ubuntu下加载和卸载模块。在加载模块到终端你是看不到printk函数打印的信息,这是因为printk信息的输出的log在内核的命令行参数console=ttyXXX里指定死了,要看log的一个方法是打开两外一个终端然后执行下面的shell来看:
while true
do
sudo dmesg -c
sleep 1
done