前言:

学习驱动过程中,都是交叉编译驱动程序,生成.ko文件,通过insmod命令加载到开发板(arm架构)中。

有时板子不在身边,想测试某个驱动程序不太方便。

所以,就想把驱动程序编译成可以在虚拟机Ubuntu(x86架构)系统下加载的模块。

下面介绍具体实现。


软件环境:

虚拟机:VMware® Workstation 14 Pro

Ubuntu: ubuntukylin-14.04-desktop-amd64.iso

Ubuntu内核:

root@ubuntu:~# uname -a
Linux ubuntu 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
root@ubuntu:~#

驱动程序:

#include <linux/module.h>
#include <linux/init.h>

static int __init hello_init(void)
{
	printk("Hello, I'm ready!\n");
	return 0;
}
static void __exit hello_exit(void)
{
	printk("I'll be leaving, bye!\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

上面程序是最简单的内核模块。只有加载和卸载功能。

Makefile:

obj-m := hello.o
KDIR := /lib/modules/3.13.0-24-generic/build/
all:
	make -C $(KDIR) M=$(PWD) modules 
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order

Makefile中需要注意的是,KDIR路径为/lib/modules/3.13.0-24-generic/build/

可以在ubuntu系统下查看一下:
在这里插入图片描述
编译测试:
在这里插入图片描述
由上图可以看出,驱动模块编译没有问题。

insmod 加载模块之后,使用lsmod查看模块,也可以查看到。

rmmod 卸载模块之后,使用lsmod查看模块,查看不到了。

但是:

咱们在程序里有添加打印信息,为什么加载和卸载时,没有打印呢。

是没有运行加载和卸载函数吗?

肯定不是,都可以查看到驱动模块了。

那为什么没有打印信息呢?

问题出在打印级别上:
打印级别
(图片出处:
致远电子:(电子版)嵌入式Linux开发教程(下册):P59:2.1.3 )


按照上图中说明:

1、先使用dmesg命令查看一下打印:
在这里插入图片描述
可以看到确实是有打印信息的。(我多次加载卸载,所以有多个打印)

2、使用tail -f /var/log/syslog 命令监控系统打印信息:

此处需要注意的是,这里查看的log文件和上图中描述不同。
在这里插入图片描述
由上图也可以确认,确实有打印信息。

【完】


参考:

[1]:https://blog.csdn.net/koozxcv/article/details/49509807

[2]:致远电子:(电子版)嵌入式Linux开发教程(下册)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐