嵌入式linux应用的制作与固件烧录的概述

2019-07-12 14:39发布

仅概述, 不对细节进行过多描述(不同的芯片平台,细节也会略有不同,多说无益)。文章只有一个目的,就是对于新接触linux SOC平台的人,帮助他们明确目标,清晰思路,以便更迅速的切入到工作中; 很明显,为了让一个芯片工作起来,芯片需要程序。

一、关于嵌入式linux的SOC,芯片里到底烧录了哪些程序?又是如何制作这些程序的?

二、用户的驱动程序在哪里?如何加载的?用户的应用程序在哪里?如何自启动的?

三、应用程序编写过程中如何在芯片平台上debug?程序如何固化到芯片上?

  首先,针对第一个问题,嵌入式linux的SOC,整体架构,从操作的步骤上划分,可以分为三大块,也可以理解为,有三大块程序需要固化(烧录),

1. U-boot的固化

(虽然,LINUX内核也有引导代码,但是U-boot可以提供更便利的debug与updata,所以牺牲一些启动速度是值得的。市面上大多数的SOC是有U-boot的); 作为新人,对U-BOOT有点陌生,是正常的。即使这样,也不建议过多的去阅读/了解U-boot。除非,工作的本身就是U-boot的维护及个性化升级。为什么不建议去深入研究U-boot呢,原因很简单,通常厂商会提供适用的源码、编译步骤、固化工具/步骤;所以,新平台,你需要做的,就是耐心的读完厂家的操作指南;关于u-boot,在99%以上的应用场合里,是一个几近于标准不需要使用者做出修改的。  

2. linux内核固化

对linux-kernel进行必要的裁剪或加载用户自己的驱动;听起来,好怕怕的样子。事实上,厂商也提供了linux-kernel源码及工具。里面还包含了平台本身硬件资源对应的驱动,譬如 SPI,USB-HOST,OTG,IIC等等,傻瓜式的编译,傻瓜式的勾选配置。裁剪就完成了。高大尚的说辞,瞬间被拉低了身价;所以,需要你做的是,有耐心的读完厂商提供的操作指南,这个指南会告诉你,如何去编译这个内核原码,生成镜像文件,固化到芯片里。 虽然,操作如此傻瓜,但是我们还应该稍稍了解点基本常识。linux是一个一体化的内核(一体化内核也称“宏内核”相对于“微内核”-例如,uCOS-II,PSOS,VxWork);“一体化”三个字隐隐透露出这玩意,移植是相当"方便"的(至于如何从0开始移植,只有傻冒才会去做,除非你要干的就是这个活儿。敲黑板,敲黑板,敲黑板,厂家已经提供了与芯片相匹配的 linux-kernel源码了,应该在这个源码的基础上去继续深耕才是正道儿)。 linux内核采用模块化设计,功能模块(驱动层)先编译成模块,然后可以在内核运行中动态的加载/卸载而不需要重启; linux内核集成了完整的POSIX网络协议栈,网络功能完善; 其他的一些稳定性强,安全性好,支持设备广泛等等一些张嘴就来优点,就不再描述了。随便说,反正不会错就对了。 那么linux-kernel有哪些作用呢?或者说有啥组成的呢?又或者说它能干点嘛? 上个结构图看一下。如下图:                           上图里的所有的功能模块,基本就是字面意思,也没啥深入要说的了。但是,有一个叫 “文件系统”的模块,敲黑板,敲黑板,上图的 第二行,“文件系统”。这个文件系统,是用户自制作的。也就是本段落开始的时候说的,“需要固化三大块程序”中的一个;详述如下“ 3.”。

3.根文件系统的固化

从上图看,linux内核里有一个单元叫“文件系统” ,linux启动后期,会去寻找并挂载根文件系统;然后,执行里面指定的程序及其他等等。。。简而言之这玩意很重要。需要运行的根文件系统可以是固化在芯片内部的(作为产品,肯定要固化到芯片里面),也可以是存在于芯片内存的镜像(显然掉电,重启内存里数据就丢失了。);根文件系统它包含了linux正常运行所必须的程序、库、各种配置参数等; 刚刚在第“2.”中提到的厂商提供的内核源码。是指,除了“文件系统”以外的所有的东西。所以,开发者,需要自己制作一个文件系统;开发者编写的应用程序(bin),驱动程序(.ko)也都存放在这个文件系统里的。 综上述,制作一个完整的linux SOC需要 制作个U-boot镜像( 这是容易的),制作个linux核的镜像(也算不复杂),制作个根文件系统镜像(如何制作根文件系统,需要了解linux根文件系统的目录结构(大多数时候,业内基本上是按照FHS--文件层次标准--来执行的))这里不做详细描述;   其次,针对第二个问题,做如下描述: 值得强调的是“linux驱动程序”与“linux应用程序”是有区别的。驱动加载后运行在内核态,属于内核部分,应用程序运行在用户态;在编程时,它们的编写格式/风格也是有区别的而且区别很大,这里不赘述细节。 为了实现某个产品的功能,在一个完整的应用中,有可能会需要用到“用户自定义的驱动程序+用户的应用程序+标准驱动模块”,也可能仅仅只需要“用户应用程序+标准驱动模块”。 现在说的重点是,如果需要用到自定义的驱动程序时,那么调试好的驱动程序( .KO文件),放在哪里,如何加载到内核中?换句话说,如何固化这个驱动程序呢? 驱动程序,与应用程序都是存放在根文件系统下的。应用程序,通过配置文件可以开机自启动。驱动程序也可以通过脚本来加载。显然,应用程序,自定义的驱动,配置文件,脚本等等都可以在制作文件体系生成镜像文件前,就存放在文件体系中,生成镜像时便包含在镜像文件里。固化到芯片里就可以了。   第三、关于Debug 交叉编译环境,宿主机开发; 我们可以把目标板上的文件系统建立在主机上,通过tftp或其他方式,让宿机挂载这个文件系统;所以,修改主机上的这个文件体系内容,实质上就是修改了目标机上的文件体系内容;提供了相对便捷的debug的方式;调试成功后,把这个文件体系打包制作成镜像文件,固化到芯片中就可以了。(固化工具,方法,步骤,供应商同样也有指导说明。需要耐心阅读).