广东快3>WIKI库>学习嵌入式>嵌入式系统移植序言

嵌入式系统移植序言



学习目的


大家好,今天我们就进入嵌入式Linux底层驱动开发的第一个阶段:嵌入式Linux系统移植课程学习。


那么本阶段我们将带领大家一步一步把Linux操作系统在ARM开发板上进行定制,最后把定制好后的Linux操作系统在我们的ARM开发板上运行起来,那么通过这个过程也希望大家能够更好的理解我们整个Linux操作系统的过程,应该这样说,这个过程是我们后面学习驱动过程的前导过程,可以说如果我们没有把嵌入式Linux系统移植的课程做完那么我们之后的驱动开发是没有办法展开的,因为我们的驱动开发其实都是在我们系统运行起来过后,在内核中增加一些相应的子功能而已。所以说系统移植是我们后期学驱动开发的一个基础。



系统移植


下面我们来看我们的第一节课叫做探索系统移植的世界:还是一样我们先简单说一下我们的概述,概述之前我们应该清楚一下应该学什么:


preface1.png


我们先看上面的这幅图,在之前我们给大家讲ARM裸机开发的时候也给大家提到一个思路,也就是说我们的程序应该如何设计呢?


我们可能要设点灯或者是串口我们需要一个驱动的一个相关的文件去驱动,然后在ARM函数中我们去设计这个灯是如何去亮的,比如说我们是亮一秒或是亮两秒,然后灭一秒。或者说我们在向串口打印东西的时候我们是大hello world 还是打印什么其他字符,所以整体来说ARM裸机开发我们可以简单认为就是一个三层的软件架构,比如说最底下就是我们的硬件层,也就是说由硬件公司来决定放在哪一个相应的资源,比如说我们的灯是放在GPA口还是放在GPH口甚至GPG口。这些都是由硬件公司来确定的然后驱动是根据硬件的一个架构把我们一些驱动的资源用代码的形式去指向,以及这样的硬件需要什么样的高电平什么样的低电平或者什么样组合是数据,让我们的硬件工作由驱动层把这样的能力全部封装起来,然后具体用什么样的功能,那就是我们的应用层,应用层会根据传递不同的值,这个硬件会给它不同的结果,比如说hello world 也可以是其他的值。



整体架构的新问题


所以这是一个整体架构,当然这个架构我们说它有没有什么新的问题呢?


很显然,问题是有的,比如说我们在之前开发的这个应用层中,如果说不做任何修改,换一个硬件我们就不能用了,因为我们的整个应用层驱动层衔接的非常强,也就是有一层发生改变驱动层也要变,驱动层变了应用层也要变。所以这样看我们的程序开发虽然可以实现一些小打小闹的功能但如果一旦要做起一个大型项目或者说一个大型功能的话,对于这样一个开发模型是不太适合的。


广东快3如果说这个地方不太好理解我们可以举一个非常简单的例子,比如说我们大家在学习C语言的时候都学习到过一个非常经典的函数叫做hello world:


preface2.png


广东快3如图,右上方的四边形是一个应用程序,里面什么都没有做,然后直接把hello world传给它,四边形下方的两个圆圈是两个不同型号的显示器,比如左边是LCD显示器右边是CRT的显示器,那很显然,左右两边显示器的物理结构是不一样的,也就是说它的驱动形式是不同的。所以说,我们来思考上方的应用程序我们可不可以不做任何修改直接拿过来编译一下后是不是直接就可以在LCD上或者CRT上运行。也就是这样的程序给我们了一个跟硬件无关的感觉,如果说我们的程序设计都能这样来设计的话,是不是我们不管换什么样的硬件,这个程序的开发人员都很轻松了,也就是我们开发一次过后就不用在变了。


这样来说,我们在后面为什么要引入系统的原因也在这里。


广东快3下面我们来思考一下怎么才能解决这样的问题呢?如图上左下方的两个红色圆圈是两个不一样的东西,最上方是一个人,他想用一个东西也就是图左的四边形去用下面两个不相关的东西。我们可以在那两个毫不相干的操作中我们引入一个层次的概念(图左的四边形),也就是说每一个人只管在上面去注册,然后通过注册后,它内部中有一个逻辑,我们只需要调,调进去后它会根据这个逻辑来决定是网哪边走,那这样的话上面那个人就只关心下方四边形是怎么去做的,也就是说四边形怎么去给上方那个人提供接口的,而驱动程序只关心四边形怎么向核心层去上报这个数据的,而这个核心层(四边形)就是把数据封装在一起或隐藏在一起向上层提供一个统一的接口。


所以有了这样的一个程序是不是使得我们的应用层变得平衡无关,这样对我们应用层开发人员来说它更多的精力就可以放在其他功能上了。因为它的功能即使你们公司换了一个硬件还是可以工作的。


所以总的来说现在就有了这样一个需求,就是我们需要我们应用程序开发人员花更多精力去干别的事情而不是关系是怎么跟底层打交道的。所以在这种情况下我们就引入了一个非常重要的概念叫OS也就是操作系统如下图:


preface3.png


如图,这个图就是在我们 C语言hello world中非常典型的结构图,按理说我们最终实现的效果是驱动控制硬件去打印hello world这是不变的。


但是为什么我们的应用程序不管什么样的硬件都能去操作呢?原因就是我们的应用程序也就是hello world也就是Applications函数其实是由Kernel往上提供的一个东西,当然,如果从细节角度来讲我们不能这样理解,实际是由Kernel提供的一个标准接口,然后又封装一个标准接口,然后我们的应用程序去调动它。


广东快3但是我们的驱动跟内核之间有什么关系呢?就相当于驱动只关心把我们的驱动程序或设备像内核报告,然后内核会根据它传来不同的信息去调用不同的驱动程序然后控制相应的硬件。


所以通过ARM裸机程序系统结构图【无OS】和类android等复杂功能系统结构图【有OS】的比较,其实所谓的复制其实就是多引入了一层使得上面这个人解放出来,所以如果说我们想做一个更大的工程或更加复杂的工程其实我们有一个非常简单的思想就是分层思想。



案例


如果大家对于分层思想不太理解的话,我们来举一个安卓的例子是最典型的如下图:


preface4.png


广东快3如图,如果说我们学过安卓的同学应该说上方那个图是非常熟悉的图,这就是整个安卓非常经典的一个架构图,那么这个图大家可以看到它其实就是个层次感。也就是说我们为什么可以用Java程序控制图下方的红色,其原因就是我们的Java程序最终是调用的是它相应的SDK库或者说是FRAMEWORK,而这个FRAMEWORK最终也是调用应用程序的LIBRARIES,而这个应用程序LIBRARIES又隐藏了内核中一些驱动程序的细节。所以一层一层的隐藏最终在我们上层就感觉到只关心一些比较统一的接口,就是可以直接使用的。


以上就是我们这个框架,如果说这个公司的框架更细分也就是说我们在后期学到驱动过后会发现还会引入一层叫做HAL也就是说在KERNEL这个地方是有很多驱动,而驱动对C这个部分有些人会认为这样更加麻烦不方便。


所以说它还会引入一个叫做HAL如下图:


preface5.png


广东快3如图,大家可以看它又分了一层,在分一层是不是就变成LIBRARIES跟KERNEL又隐藏起来了所以说LIBRARIES只关心这个LAYER中提供的东西了,所以说通过这样的分层也可以解决一些在软件中叫复用性的问题。当然这个分层有好有坏,不能说分得越多越好,因为分的越多实际上速度也变慢了,所以说这也是没有办法。像安卓这一种大型工程来说的话,如果不用分层的话我们很难让一个人去完成所有的系统功能,所以说分层也有它一定的道理。


所以可以说,我们整个系统的移植是移植在有操作的情况下如何把我们的功能做复杂,因为裸机程序是在功能简单的情况下或者是我们的系统不复杂,我们就可以在架构的时候架构三层就可以。但是我们的功能一旦变得越来越复杂过后我们就必须要引入一个KERNEL机制,当然这个机制不仅仅是我们所说的资源管理同时也是让应用程序开发人员从不同硬件中解放出来,所以说android等复杂功能系统结构图【有OS】也是一个分层的问题。



关于分层


那么怎么分层呢?也就是说我们要想完成一个真正系统级的开发就需要把OS的四个层次全部做到,而这四个层次中,我们说硬件不管,驱动和KERNEL我们可以认为是一个整体,因为它们都属于底下软件工程师的事情,而应用程序属于另外一个工程师的事情。所以说我们可以认为,整个系统应该说有两个工程师,一个是应用工程师,一个是驱动底层开发工程师。


广东快3所以对于底层来说我们就必须围绕KERNEL和Driver一起来工作。


下面我们来看一下系统移植到底学写什么东西,总的来说系统移植主要围绕的就是四大点:


1.交叉编译环境


广东快32.bootloader功能子系统对于bootloader功能前面我们有提到过,就是启动加载功能。


广东快33.内核核心子系统。


4.给我们应用程序开发者使用的文件系统子系统。


所以整个系统移植其实就围绕以上这四个大点去展开的,那么我们学好这四个点也相当于学好了系统移植所有的精髓。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

分享到:

目录