驱动:虚拟机 Ubuntu下编译加载驱动模块
前言:学习驱动过程中,都是交叉编译驱动程序,生成.ko文件,通过insmod命令加载到开发板(arm架构)中。有时板子不在身边,想测试某个驱动程序不太方便。所以,就想把驱动程序编译成可以在虚拟机Ubuntu(x86架构)系统下加载的模块。下面介绍具体实现。软件环境:虚拟机:VMware® Workstation 14 ProUbuntu: ubuntukylin-14.04-des...
前言:
学习驱动过程中,都是交叉编译驱动程序,生成.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开发教程(下册)
更多推荐
所有评论(0)