对于很多linux开发初学者,手里没有开发板,但是又想练练linux驱动(入门级)的同学来说,在虚拟机ubuntu 下搭建一个简单的驱动开发环境不失为一个很好的选择。
linux驱动正常的开发环境搭建有以下几方面;
1、安装好交叉编译工具,比如arm-linux-gcc之类的(不同的开发板厂家时长会提供适合自己板子的交叉编译工具)
2、搭建好nfs(为了后边方便在虚拟机上挂载文件系统,便于板子的驱动调试)
3、安装gdb调试工具
4、创建linux内核设备树(与目标开发板的linux内核版本一致,最好使用厂家提供的linux源码树)
5、连接开发板和PC机(网线,串口....)等等,
6、编写驱动开发环境测试程序,测试编写好的驱动能否在目标开发板上运行。
7、开始自己的驱动开发(移植)之旅。
为了简单的了解驱动开发的原理和步骤,以下我们先在虚拟机ubuntu上搭建简单的驱动开发环境。
1、安装build-essential软件包
Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装。幸运的是,为了能够编译Ubuntu的内核,Ubuntu提供了一个build-essential软件包
安装方法如下:
$sudo apt-get install build-essential
2、找到自己所使用ubuntu的软件版本号
uname -r
我自己的是 3.2.0-23-generic-pae
3、下载源码包
$sudo apt-get install linux-source-3.2.0
会默认下载到/usr/src中,cp该文件到自己的工作目录,当然也可以在本地进行解压缩 $sudo tar -jxvf linux-source-3.2.0.tar.bz2
得到 linux-source-3.2.0 源码包
4、配置内核,进入源码包目录linux-source-3.2.0,可以使用$sudo make oldconfig,然后一路回车到结束
5、编译内核 使用sudo make指令
liufei@liufei-virtual-machine:~/workspace/linux-source-3.2.0$ sudo make
大概需要等待的时间比较久
期间会报错误 ERROR: "__modver_version_show" [drivers/staging/rts5139/rts5139.ko] undefined,可以使用make menuconfig命令在编辑界面去掉rts5139这个选项的选择
6、生成和构建设备树 $make modules, $make modules_install两条指令
结束后在/lib/modules下生成xxx(版本号)和xxx-generic-pae这两个目录
7、然后就是写代码测试了
测试代码test.c
//test.c
#include
#include
MODULE_LICENSE("GPL");
static int test_init(void)
{
printk(KERN_ALERT "Hello,world\n");
return0;
}
static void test_exit(void)
{
printk(KERN_ALERT"Goodbye,cruel world\n");
}
module_init(test_init);
module_exit(test_exit);
makefile
obj-m:=test.o
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
将代码cp到虚拟机上make编译生成test.ko文件
然后$insmod test.ko加载驱动
$lsmod 就可以在驱动列表里边看到刚才加载的驱动了
要卸载这个驱动使用$rmmod test命令就可以
以上我们搭建了一个初级的驱动开发环境,完成了驱动开发的基本体验,要进行真正的驱动开发(移植),还有许多功课要做的。
注:正常情况下当我们使用$insmod test.ko加载驱动时会打印log ,"Hello,world"。使用$rmmod test卸载驱动时会打印log“Goodbye,cruel world”。但是实际操作过程中却没有看到。这时应为linux系统将log级别的打印做了限制,具体的原理以及解决办法可以学习 https://blog.csdn.net/mingzznet/article/details/47315163