ubuntu下搭建linux驱动开发环境(适合没有开发板的初学者了解方法)

    对于很多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<linux/init.h>
#include<linux/module.h>
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




    

    






猜你喜欢

转载自blog.csdn.net/liufei191010/article/details/80826906