0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux编译驱动、内核及应用程序分析

UtFs_Zlgmcu7890 来源:cc 作者:佚名 2019-01-17 13:46 次阅读

作为一名嵌入式Linux新手,在学习的过程中会遇到很多问题。写了一个驱动程序怎么编译?怎么加载进内核?本文将介绍嵌入式Linux开发的一些入门基本操作,手把手让你掌握编译驱动、内核及应用程序。

小王是一名刚接触Linux的新手,看了一些关于Linux驱动的书籍之后,买了一块Cortex-A9的ARM开发板,准备大干一场。编写了第一个属于自己的驱动程序并命名为hellodrv.c,程序源码如下所示。

这个驱动程序怎么编译成可以在板子上跑的程序呢,小王经过一番网上查询,原来需要交叉编译工具链,小王找到了光盘资料里的交叉编译工具并按说明正确安装了交叉编译工具。

一、安装交叉编译工具

1编写Makefile

小王编写好的驱动程序为hellodrv.c,要把该驱动程序编译为模块,在同一目录下新建了一个Makefile文件。编写的Makefile如下。

2驱动编译

小王经过查询,编译驱动主要有两种方式,一种是修改内核源码顶层目录下的Makefile文件,另外也可以在编译命令指定架构及交叉编译工具。

1、修改Makefile

例如:Linux内核源码的目录为/home/vmuser/kernel-imx,打开该目录下的Makefile文件,找到ARCH及CROSS_COMPILE相关语句,修改为如下所示语句。

如果交叉编译工具链未设置环境变量则CROSS_COMPILE设置为交叉编译工具链的绝对路径,设置如下。

修改完之后,直接执行make命令,生成了hellodrv.ko文件。

2、在编译命令指定

执行如下命令进行编译。

这种方式也可以生成hellodrv.ko,可是驱动要依赖于内核才能跑起来,小王于是开始了Linux内核的配置及编译。

二、Linux内核配置及编译

编译内核时指定架构和交叉编译工具的方式同编译模块一样,经过上面的操作,小王已经轻车熟路了。小王还学会了首先导环境变量然后进行编译的方法。

在首次进行配置编译之前,需要清除之前编译生成的文件,可用如下命令进行清除。

接下来进行内核的配置,内核的配置可以使用如下命令中的一个。

这四种方式中,值得推荐的是make menuconfig,它不依赖于QT或GTK+,且非常直观。使用make menuconfig命令后,会进入如图1所示的界面,在该界面根据需求对需要编译进内核的选项进行裁剪。对于bool型选项,按Y或者N决定是否选择编译进内核。[*]表示选中,[]表示未选中。对于tristate型选项,根据需求可以有Y、M、N三种选择,<*>表示静态编译,表示编译为模块,<>表示不编译进内核。

图1 内核配置界面

配置完成后,选择保存,然后退出。配置后会生成.config文件,该文件保存了配置信息,供Makefile在编译内核时使用。

在配置界面我们根据需求把需要的功能以及相应设备驱动的支持等配置好,然后进行内核及设备树的编译。内核及设备树编译用以下命令。

为了加快编译速度可以在编译命令后加“-j”选项,例如PC的CPU为4核,则编译命令如下。

如果要把某些驱动编译为模块,则使用如下命令。

针对相应的开发板,厂家一般都会有默认的配置,这些配置文件位于内核源码arch/arm/configs目录下。例如:使用如下的默认配置。

如果已有.config文件,可以使用如下命令载入既有的.config配置文件。

内核及设备树编译完成后将会生成zImage和相应的dtb文件,按照厂家提供的烧写方式将镜像烧写到目标板。

三、应用程序编译及文件传输

1应用程序编译

例如需要编译的应用程序文件为test.c,需要把该程序编译放到arm开发板上运行。编译命令如下。

这是一个非常简单的程序,并且只有一个文件,所以可以采用直接输入命令进行交叉编译。如果工程较大,这种方式就不可取了,通常需要编写Makefile文件,通过make程序来进行工程管理。应用程序的Makefile范例如下。

编写完Makefile后执行make命令即可生成目标文件test。

2文件传输

编译生成的可执行文件可以通过TFTP,NFS等方式下载到开发板,关于TFTP,NFS服务器在PC上的搭建可参考网络上相关文章,这里不赘述。

1、NFS文件传输

将目标板接入局域网或通过交叉网线与PC主机相连,设定目标板的IP,使之与主机在同一网段,然后进行远程mount操作。将需要传输的文件放在PC机搭建的NFS服务器目录下。在开发板上执行如下操作。

在进行远程挂载之前,最好先用ping命令检查网络通信是否正常,只有在能ping通的情况下,才能进行正常挂载,否则请检查网络。如果在已经ping通的情况下,远程挂载出现错误,请检查主机和目标机的其它设置。

2、TFTP文件传输

把需要传输的文件放在PC机的tftp服务器目录下。TFTP下载命令格式如下。

例如:下载IP为192.168.1.168的tftp服务器的hellodrv.ko文件,在开发板的当前目录下执行如下命令。

通过以上任一方式将在PC机上编译完成的驱动模块hellodrv.ko和test应用程序拷贝到目标板上。

四、驱动模块的加载及移除

执行如下命令把驱动模块动态加载进内核。

查看加载的模块使用如下命令。

如需要移除模块使用如下命令。

IoT9000A-LI是广州致远电子有限公司开发的基于M6708-T系列核心板的ARM工控主板,核心板标配处理器为i.MX 6U,Cortex™-A9简单双核。板上集成了大量的外设接口,包括千兆以太网音频USBHDMI、LVDS、LCD、miniPCIE、摄像头、CAN信号UART信号等接口,同时整合的多功能HD视频引擎可提供1080P 60fps视频解码、1080P 30fps视频编码,并带有2D、3D图形引擎,可满足消费电子工业和汽车车载娱乐系统等新一代应用,以及医疗应用的丰富图形和高响应需求。

图2 IoT9000A_LI产品

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10972

    浏览量

    206666
  • 驱动程序
    +关注

    关注

    19

    文章

    769

    浏览量

    47190

原文标题:【纯干货】五分钟带你掌握Linux编译驱动、内核及应用程序

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux内核编译主要过程

    Linux内核编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 485次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的<b class='flag-5'>编译</b>主要过程

    关于Linux应用程序开发到内核开发的指南!

    起来很快,估计2周就能上手。3. 进入 Linux 内核开发。内核开发的学习难度要比 Linux 应用程序开发大 3倍左右。基本上,有一年的
    发表于 09-24 11:12

    如何编译linux驱动模块

    是如何别被构造的。模块的构造过程与用户空间的应用程序的构造过程有显著不同;内核是一个大的、独立的程序,对于它的各个部分如何组合在一起有详细的明确的要求。Linux2.6
    发表于 11-04 08:45

    Linux下C应用程序开发

    本文介绍了在 Linux下能用于 C 应用程序开发和调试的工具. 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程
    发表于 05-14 10:16 4587次阅读

    交叉编译linux内核(raspberry_3.6.y)

    一步一步教你交叉编译linux内核,RPI的内核编译教程,小众的东西了
    发表于 11-03 17:58 0次下载

    Linux内核编译详谈

    Linux内核编译详谈
    发表于 10-30 09:51 7次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>编译</b>详谈

    基于Arm的Linux内核编译指导

    基于Arm的Linux内核编译指导
    发表于 10-30 10:13 15次下载
    基于Arm的<b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>编译</b>指导

    如何编译Linux内核

    内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,在广大爱好者的支持下,内核
    发表于 04-02 14:46 470次阅读

    嵌入式Linux内核驱动程序开发是怎样的

    设备驱动程序linux内核的一部分,是操作系统内核和机器硬件之间的接口,它由一组函数和一些私有数据组成,是连接应用程序与具体硬件的桥梁。
    发表于 11-06 11:33 1294次阅读
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的<b class='flag-5'>驱动程序</b>开发是怎样的

    Linux内核配置编译分析的设计方案

    Linux内核配置编译分析的设计方案
    发表于 07-08 16:53 18次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>配置<b class='flag-5'>编译</b><b class='flag-5'>分析</b>的设计方案

    如何才能编译Linux内核

    内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux 作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新
    发表于 11-04 18:04 8次下载

    Linux内核编译与运行

    本文档的主要内容详细介绍的是Linux内核编译与运行免费下载。
    发表于 03-25 13:48 10次下载

    嵌入式linux编译 ko,嵌入式linux:编译linux驱动模块

    是如何别被构造的。模块的构造过程与用户空间的应用程序的构造过程有显著不同;内核是一个大的、独立的程序,对于它的各个部分如何组合在一起有详细的明确的要求。Linux2.6
    发表于 11-01 16:31 8次下载
    嵌入式<b class='flag-5'>linux</b><b class='flag-5'>编译</b> ko,嵌入式<b class='flag-5'>linux</b>:<b class='flag-5'>编译</b><b class='flag-5'>linux</b><b class='flag-5'>驱动</b>模块

    嵌入式Linux内核编译

    实验环境VMware Workstation PlayerUbuntu16.04kernel-3.2.tar.bz2Linux内核编译在ubuntu上编译嵌入式
    发表于 11-01 17:07 16次下载
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>内核</b><b class='flag-5'>编译</b>

    Linux内核编译和运行

    想让Linux内核代码跑起来,得先搭建编译和运行代码的环境。
    发表于 06-23 11:56 338次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的<b class='flag-5'>编译</b>和运行