基于linux的嵌入式软件开发课件.ppt

上传人:飞****2 文档编号:91523796 上传时间:2023-05-27 格式:PPT 页数:182 大小:2.20MB
返回 下载 相关 举报
基于linux的嵌入式软件开发课件.ppt_第1页
第1页 / 共182页
基于linux的嵌入式软件开发课件.ppt_第2页
第2页 / 共182页
点击查看更多>>
资源描述

《基于linux的嵌入式软件开发课件.ppt》由会员分享,可在线阅读,更多相关《基于linux的嵌入式软件开发课件.ppt(182页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1重点回顾重点回顾TCP通信过程通信过程2重点回顾重点回顾UDP通信过程09:103第三章第三章基于基于Linux的嵌入式软件开发的嵌入式软件开发3.1嵌入式软件结构嵌入式软件结构3.2嵌入式软件开发流程嵌入式软件开发流程3.3嵌入式嵌入式linux开发环境开发环境3.4嵌入式系统引导代码嵌入式系统引导代码3.5linux内核结构及移植内核结构及移植3.6嵌入式文件系统及移植嵌入式文件系统及移植3.7linux设备驱动概述设备驱动概述3.8设备驱动程序接口设备驱动程序接口3.9linux设备驱动开发流程设备驱动开发流程09:1043.1嵌入式软件结构嵌入式软件结构3.1.1嵌入式软件体系结构嵌

2、入式软件体系结构3.1.2基于基于Linux的嵌入式软件的嵌入式软件09:1053.1.1嵌入式软件体系结构嵌入式软件体系结构09:1061.设备驱动层设备驱动层设备驱动层是嵌入式系统中必不可少的重设备驱动层是嵌入式系统中必不可少的重要部分,使用任何外部设备都需要有相应要部分,使用任何外部设备都需要有相应驱动程序的支持,它为上层软件提供了设驱动程序的支持,它为上层软件提供了设备的操作接口。备的操作接口。上层软件不用理会设备的具体内部操作,上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。只需调用驱动层程序提供的接口即可。驱动层一般包括硬件抽象层驱动层一般包括硬件抽象层HAL

3、、板级支、板级支持包持包BSP和设备驱动程序。和设备驱动程序。09:1072.实时操作系统实时操作系统RTOS对于使用操作系统的嵌入式系统而言,操作系统一对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。般以内核映像的形式下载到目标系统中。以以Linux为例,在系统开发完成之后,将整个操作为例,在系统开发完成之后,将整个操作系统部分做成内核映像文件,与文件系统一起传送系统部分做成内核映像文件,与文件系统一起传送到目标系统中;然后通过到目标系统中;然后通过BootLoader指定地址运指定地址运行行Linux内核,启动已经下载好的嵌入式内核,启动已经下载好的嵌入式L

4、inux系系统;再通过操作系统解开文件系统,运行应用程序。统;再通过操作系统解开文件系统,运行应用程序。整个嵌入式系统与通用操作系统类似,功能比不带整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多。有操作系统的嵌入式系统强大了很多。09:1083.中间件层中间件层中间件(中间件(middleware)是基础软件的一大)是基础软件的一大类,属于可复用软件的范畴。类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户顾名思义,中间件处于操作系统软件与用户的应用软件的中间。的应用软件的中间。中间件在操作系统、网络和数据库之上,应中间件在操作系统、网络和数据库之上

5、,应用软件的下层,总的作用是为处于自己上用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应助用户灵活、高效地开发和集成复杂的应用软件。用软件。09:1094.应用程序应用程序实际的嵌入式系统应用软件建立在系统的主实际的嵌入式系统应用软件建立在系统的主任务任务(MainTask)基础之上。基础之上。用户应用程序主要通过调用系统的用户应用程序主要通过调用系统的API函数函数对系统进行操作,完成用户应用功能开发。对系统进行操作,完成用户应用功能开发。在用户的应用程序中,也可创建用户自己的在用户的应用程序中,

6、也可创建用户自己的任务。任务之间的协调主要依赖于系统的任务。任务之间的协调主要依赖于系统的消息队。消息队。09:10103.1.2基于基于Linux的嵌入式软件的嵌入式软件基于嵌入式基于嵌入式Linux的的软件结构如图所示,软件结构如图所示,在硬件之上的是引在硬件之上的是引导程序导程序BootLoader,然后是,然后是Linux内内核,最上层是应用核,最上层是应用程序。程序。09:10111.BootLoader引导装载程序通常是在任何硬件上执行的第一段引导装载程序通常是在任何硬件上执行的第一段代码。代码。在象台式机这样的常规系统中,通常将引导装载在象台式机这样的常规系统中,通常将引导装载程

7、序装入主引导记录(程序装入主引导记录(MasterBootRecord,(MBR))中,或者装入)中,或者装入Linux驻留的磁盘的第一驻留的磁盘的第一个扇区中。个扇区中。通常,在台式机或其它系统上,通常,在台式机或其它系统上,BIOS将控制移将控制移交给引导装载程序。而在嵌入式系统中,通常并交给引导装载程序。而在嵌入式系统中,通常并没有像没有像BIOS那样的固件程序,因此整个系统的加那样的固件程序,因此整个系统的加载启动任务就完全由载启动任务就完全由BootLoader来完成。来完成。09:10121.BootLoader通过这段小程序,我们可以初始化硬件设备、通过这段小程序,我们可以初始化

8、硬件设备、建立内存空间的映射图,从而将系统的软建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。终调用操作系统内核准备好正确的环境。常见的常见的BootLoader有有uboot、vivi等。引等。引导程序的开发主要是做一些移植工作。导程序的开发主要是做一些移植工作。09:10132.内核内核Linux内核的开发主要包括内核的开发主要包括Linux内核的定制、内核的定制、裁剪等工作。裁剪等工作。在嵌入式开发中经常要面对设备驱动程序的开在嵌入式开发中经常要面对设备驱动程序的开发,嵌入式系统通常有许多设备

9、用于与用户交发,嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、互,象触摸屏、小键盘、滚动轮、传感器、RS232接口、接口、LCD等等。等等。除了这些设备外,还有许多其它专用设备,包除了这些设备外,还有许多其它专用设备,包括闪存、括闪存、USB、GSM等。等。内核通过所有这些设备各自的设备驱动程序来内核通过所有这些设备各自的设备驱动程序来控制它们,包括控制它们,包括GUI用户应用程序也通过访问用户应用程序也通过访问这些驱动程序来访问设备。这些驱动程序来访问设备。09:10143.应用程序应用程序对于嵌入式对于嵌入式Linux的应用,大多数的应用并不需的应用,大多数的应

10、用并不需要图形界面,比如交换机、路由器、嵌入式网要图形界面,比如交换机、路由器、嵌入式网关以及服务器等等。关以及服务器等等。但是,随着消费类电子的普及,越来越多的嵌但是,随着消费类电子的普及,越来越多的嵌入式产品如多媒体播放、手机等手持设备需要入式产品如多媒体播放、手机等手持设备需要图形用户界面(或称图形用户界面(或称GUI)的支持。)的支持。因此基于因此基于GUI的应用程序的开发越来越重要。目的应用程序的开发越来越重要。目前比较流行的前比较流行的GUI平台有平台有QtEmbedded、紧、紧缩的缩的XWindows系统、系统、MicroWindows以及以及MiniGUI系统。系统。09:1

11、0153.2嵌入式软件开发流程嵌入式软件开发流程3.2.1嵌入式嵌入式Linux设计概述设计概述3.2.2基于开发板的二次开发基于开发板的二次开发3.2.3基于基于linux的嵌入式软件开发流程的嵌入式软件开发流程09:10163.2.1嵌入式嵌入式Linux设计概述设计概述09:10173.2.1嵌入式嵌入式Linux设计概述设计概述嵌入式系统的软件开发采用一种交叉编译嵌入式系统的软件开发采用一种交叉编译调试的方式。调试的方式。交叉编译调试环境建立在宿主机(即一台交叉编译调试环境建立在宿主机(即一台PC机)上,对应的开发平台叫做目标板。机)上,对应的开发平台叫做目标板。运行运行Linux的的

12、PC(宿主机宿主机)开发时使用宿开发时使用宿主机上的交叉编译、汇编及连接工具形成主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,(这种可执行代码可执行的二进制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标板并不能在宿主机上执行,而只能在目标板上执行。)然后把可执行文件下载到目标上执行。)然后把可执行文件下载到目标机上运行。机上运行。09:1018宿主机(宿主机(host)是编辑和编译程序的平台,)是编辑和编译程序的平台,一般是基于一般是基于X86的的PC机,通常也称为主机,通常也称为主机。而目标机(机。而目标机(target)是用户开发的系统,)是用户开发的系统,通常都是非通

13、常都是非X86平台。平台。Host编译得到的可执行代码在目标机编译得到的可执行代码在目标机target上运行。上运行。3.2.1嵌入式嵌入式Linux设计概述设计概述09:10193.2.2基于开发板的二次开发基于开发板的二次开发所谓二次开发是利用现成的开发板进行开发,不同于通用所谓二次开发是利用现成的开发板进行开发,不同于通用计算机和工作站上的软件开发工程,一个嵌入式软件的开计算机和工作站上的软件开发工程,一个嵌入式软件的开发过程具有很多特点和不确定性。其中最重要的一点是软发过程具有很多特点和不确定性。其中最重要的一点是软件跟硬件的紧密耦合特性。件跟硬件的紧密耦合特性。由于嵌入式系统的灵活性

14、和多样性,这样就给软件设计人由于嵌入式系统的灵活性和多样性,这样就给软件设计人员带来了极大地困难。第一,在软件设计过程中过多地考员带来了极大地困难。第一,在软件设计过程中过多地考虑硬件,给开发和调试都带来了很多不便;第二,如果所虑硬件,给开发和调试都带来了很多不便;第二,如果所有的软件工作都需要在硬件平台就绪之后进行,自然就延有的软件工作都需要在硬件平台就绪之后进行,自然就延长了整个的系统开发周期。这些都是应该从方法上加以改长了整个的系统开发周期。这些都是应该从方法上加以改进和避免的问题。进和避免的问题。为了解决这个问题,通常的做法是基于某种开发板做二次为了解决这个问题,通常的做法是基于某种开

15、发板做二次开发,从这个角度看,硬件开发所占的比重不到开发,从这个角度看,硬件开发所占的比重不到20%,而,而软件开发的比重占到了软件开发的比重占到了80%。09:10203.2.3基于基于linux的嵌入式软件开发流程的嵌入式软件开发流程1.建立开发环境建立开发环境2.配置开发主机配置开发主机3.建立引导装载程序建立引导装载程序BOOTLOADER4.移植移植Linux操作系统操作系统5.建立根文件系统建立根文件系统6.建立应用程序的文件系统建立应用程序的文件系统7.开发应用程序开发应用程序8.烧写内核、根文件系统、应用程序烧写内核、根文件系统、应用程序9.发布产品发布产品09:10213.4

16、嵌入式系统引导代码嵌入式系统引导代码3.4.1Bootloader简介简介3.4.2常用的常用的Bootloader3.4.3Bootloader基本原理基本原理3.4.4Bootloader移植实例一:移植实例一:U_Boot3.4.5Bootloader移植实例二:移植实例二:vivi09:10223.4.1Bootloader简介简介1.Bootloader的作用的作用2.Bootloader操作模式操作模式09:10231.Bootloader的作用的作用BootLoader就是在操就是在操作系统内核运行之前运作系统内核运行之前运行的一段小程序。行的一段小程序。通过这段小程序,我们通过

17、这段小程序,我们可以初始化硬件设备、可以初始化硬件设备、建立内存空间的映射图,建立内存空间的映射图,从而将系统的软硬件环从而将系统的软硬件环境带到一个合适的状态,境带到一个合适的状态,以便为最终调用操作系以便为最终调用操作系统内核准备好正确的环统内核准备好正确的环境。境。09:10242.Bootloader操作模式操作模式大多数大多数 Boot Loader 都包含两种不同的操都包含两种不同的操作模式:作模式:“启动加载启动加载”模式和模式和“下载下载”模模式,这种区别仅对于开发人员才有意义。式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,但从最终用户的角度看,Boot Loade

18、r 的的作用就是用来加载操作系统,而并不存在作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区所谓的启动加载模式与下载工作模式的区别。别。09:10252.Bootloader操作模式操作模式启动加载(启动加载(Boot loading)模式:这种模)模式:这种模式也称为式也称为“自主自主”(Autonomous)模式。)模式。也即也即 Boot Loader 从目标机上的某个固态从目标机上的某个固态存储设备上将操作系统加载到存储设备上将操作系统加载到 RAM 中运中运行,整个过程并没有用户的介入。行,整个过程并没有用户的介入。这种模式是这种模式是 Boot Loader

19、 的正常工作模式,的正常工作模式,因此在嵌入式产品发布的时侯,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。显然必须工作在这种模式下。09:10262.Bootloader操作模式操作模式u下载(下载(Downloading)模式:在这种模式)模式:在这种模式下,目标机上的下,目标机上的 Boot Loader 将通过串口将通过串口连接或网络连接等通信手段从主机连接或网络连接等通信手段从主机(Host)下载文件到目标机的)下载文件到目标机的 RAM 中,中,然后再被然后再被 Boot Loader 写到目标机上的写到目标机上的FLASH 类固态存储设备中。类固态

20、存储设备中。u工作于这种模式下的工作于这种模式下的 Boot Loader 通常都通常都会向它的终端用户提供一个简单的命令行会向它的终端用户提供一个简单的命令行接口。因此产品开发时通常使用这种模式。接口。因此产品开发时通常使用这种模式。09:10273.4.2常用的常用的Bootloader1.ARMBootARMBoot是一个是一个bootloader,是为基于是为基于ARM或者或者StrongARM CPU的嵌入式系统所设计的。它支的嵌入式系统所设计的。它支持多种类型的持多种类型的Flash;允许映像文件经由;允许映像文件经由bootp、tftp从网络传输;支持从串口线下载从网络传输;支持

21、从串口线下载S-record或或者者binary文件;允许内存的显示及修改;支持文件;允许内存的显示及修改;支持jffs2文件系统等。文件系统等。ARMBoot源码公开,可以在源码公开,可以在http:/ Denk和和Intemet上的一群自由开发上的一群自由开发人员对其进行维护和开发。人员对其进行维护和开发。支持支持PowerPC、ARM、MIPS、m68K等多种处理等多种处理器平台,易于裁剪和调试。器平台,易于裁剪和调试。PPCBoot遵循遵循GPL(通通用公共许可用公共许可)公约,完全开放源代码。公约,完全开放源代码。PPCBoot源代码可以在源代码可以在sourceforge网站的社区

22、服网站的社区服务器中获得,它的项目主页是务器中获得,它的项目主页是http:/ Loader Object的缩写,是一款功能的缩写,是一款功能强大的强大的Bootloader。它遵循。它遵循GPL,源泉代码完全,源泉代码完全开放。开放。Blob既可以用来简单的调试,也可以启既可以用来简单的调试,也可以启动动Linux kernel。Blob最初是最初是Jan-Derk Bakker和和Erik Mouw为一为一块名为块名为LART(Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是的板子写的,该板使用的处理器是StrongARM SA-1100。现在。现

23、在Blob已经被移植到已经被移植到了很多了很多CPU上,包括上,包括S3C44B0。09:10323.4.2常用的常用的Bootloader6.ViViVivi 是韩国是韩国mizi 公司开发的公司开发的bootloader,适用于适用于ARM9处理器。处理器。Vivi有两种工作模式:启动加有两种工作模式:启动加载模式和下载模式。载模式和下载模式。启动加载模式可以在一段时间后(这个时间可启动加载模式可以在一段时间后(这个时间可更改)自行启动更改)自行启动linux内核,这时内核,这时vivi的默认模式。的默认模式。在下载模式下,在下载模式下,vivi为用户提供一个命令行接口,为用户提供一个命令

24、行接口,通过接口可以使用通过接口可以使用vivi提供的一些命令。提供的一些命令。09:10333.4.3Bootloader基本原理基本原理同时装有同时装有BootLoader、内核的启动参数、内核的启动参数、内核映像和根文件系统映像的固态存储设内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。备的典型空间分配结构图。09:1034在嵌入式世界里建立一个通用的在嵌入式世界里建立一个通用的 Boot Loader 几几乎是不可能的。尽管如此,我们仍然可以对乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特归纳出一些通用的概念来,以指导用

25、户特定的定的 Boot Loader 设计与实现。设计与实现。大多数大多数 Boot Loader 都分为都分为 stage1 和和 stage2 两大两大部分。依赖于部分。依赖于 CPU 体系结构的代码,比如设备初体系结构的代码,比如设备初始化代码等,通常都放在始化代码等,通常都放在 stage1 中,而且通常都中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用则通常用C语言来实现,这样可以实现给复语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移杂的功能,而且代码会具有更好的可读性和可移植性。植性。

26、3.4.3Bootloader基本原理基本原理09:1035BootLoader的启动流程的启动流程Boot Loader的第一阶段通常包括以下步骤的第一阶段通常包括以下步骤(以以执行的先后顺序执行的先后顺序):硬件设备初始化。硬件设备初始化。为加载为加载 Boot Loader 的的 stage2 准备准备 RAM 空间。空间。拷贝拷贝 Boot Loader 的的 stage2 到到 RAM 空间中。空间中。设置好堆栈。设置好堆栈。跳转到跳转到 stage2 的的 C 入口点。入口点。09:1036BootLoader的启动流程的启动流程Boot Loader的第二阶段通常包括以下步骤的第

27、二阶段通常包括以下步骤(以以执行的先后顺序执行的先后顺序):初始化本阶段要使用到的硬件设备。初始化本阶段要使用到的硬件设备。检测系统内存映射检测系统内存映射(memory map)。将将 kernel 映像和根文件系统映像从映像和根文件系统映像从 flash 上读到上读到 RAM 空间中。空间中。为内核设置启动参数。为内核设置启动参数。调用内核。调用内核。09:1037第一阶段:第一阶段:BootLoader的的stage11.基本的硬件初始化基本的硬件初始化这是这是 Boot Loader 一开始就执行的操作,其目的一开始就执行的操作,其目的是为是为 stage2 的执行以及随后的的执行以及

28、随后的 kernel 的执行准的执行准备好一些基本的硬件环境。它通常包括以下步备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):骤(以执行的先后顺序):(1)屏蔽所有的中断。为中断提供服务通常是屏蔽所有的中断。为中断提供服务通常是 OS 设设备驱动程序的责任,因此在备驱动程序的责任,因此在 Boot Loader 的执行的执行全过程中可以不必响应任何中断。中断屏蔽可以全过程中可以不必响应任何中断。中断屏蔽可以通过写通过写 CPU 的中断屏蔽寄存器或状态寄存器的中断屏蔽寄存器或状态寄存器(比如(比如 ARM 的的 CPSR 寄存器)来完成。寄存器)来完成。09:1038第一阶段:第

29、一阶段:BootLoader的的stage1(2)设置设置 CPU 的速度和时钟频率。的速度和时钟频率。(3)RAM 初始化。包括正确地设置系统的内存初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存控制寄存器控制器的功能寄存器以及各内存控制寄存器等。等。(4)初始化初始化 LED。典型地,通过。典型地,通过 GPIO 来驱动来驱动 LED,其目的是表明系统的状态是,其目的是表明系统的状态是 OK 还是还是 Error。如果板子上没有。如果板子上没有 LED,那么也可以,那么也可以通过初始化通过初始化 UART 向串口打印向串口打印 Boot Loader 的的 Logo 字符信息来

30、完成这一点。字符信息来完成这一点。(5)关闭关闭 CPU 内部指令内部指令/数据数据 cache。09:1039第一阶段:第一阶段:BootLoader的的stage12.为加载为加载 stage2 准备准备 RAM 空间空间为了后面的叙述方便,这里把所安排的为了后面的叙述方便,这里把所安排的 RAM 空间范围的大小记为:空间范围的大小记为:stage2_size(字节字节),把起,把起始地址和终止地址分别记为:始地址和终止地址分别记为:stage2_start 和和 stage2_end(这两个地址均以这两个地址均以 4 字节边界对齐字节边界对齐)。因此:因此:stage2_endstage

31、2_startstage2_size 另外,还必须确保所安排的地址范围的的确确另外,还必须确保所安排的地址范围的的确确是可读写的是可读写的 RAM 空间,因此,必须对你所安空间,因此,必须对你所安排的地址范围进行测试。排的地址范围进行测试。09:1040第一阶段:第一阶段:BootLoader的的stage13.拷贝拷贝 stage2 到到 RAM 中中 拷贝时要确定两点:拷贝时要确定两点:(1)stage2 的可执行映象在固态存储设备的存的可执行映象在固态存储设备的存放起始地址和终止地址;放起始地址和终止地址;(2)RAM 空间的起始地址。空间的起始地址。09:1041第一阶段:第一阶段:B

32、ootLoader的的stage14.设置堆栈指针设置堆栈指针sp 堆栈指针的设置是为了执行堆栈指针的设置是为了执行 C 语言代码作语言代码作好准备。通常我们可以把好准备。通常我们可以把 sp 的值设置为的值设置为(stage2_end-4),也即在上面所安排的那,也即在上面所安排的那个个 1MB 的的 RAM 空间的最顶端空间的最顶端(堆栈向下堆栈向下生长生长)。此外,在设置堆栈指针此外,在设置堆栈指针 sp 之前,也可以之前,也可以关闭关闭 led 灯,以提示用户我们准备跳转到灯,以提示用户我们准备跳转到 stage2。经过上述这些执行步骤后,系统。经过上述这些执行步骤后,系统的物理内存布

33、局应该如下图的物理内存布局应该如下图 09:1042第一阶段:第一阶段:BootLoader的的stage109:1043第一阶段:第一阶段:BootLoader的的stage15.跳转到跳转到stage2的的C入口点入口点 在上述一切都就绪后,就可以跳转到在上述一切都就绪后,就可以跳转到 Boot Loader 的的 stage2 去执行了。比如,去执行了。比如,在在 ARM 系统中,这可以通过修改系统中,这可以通过修改 PC 寄寄存器为合适的地址来实现。存器为合适的地址来实现。09:1044第二阶段:第二阶段:BootLoader的的stage21.初始化本阶段要使用到的硬件设备初始化本阶

34、段要使用到的硬件设备 这通常包括:这通常包括:(1)初始化至少一个串口,以便和终端用户)初始化至少一个串口,以便和终端用户进行进行 I/O 输出信息;输出信息;(2)初始化计时器等。在初始化这些设备之)初始化计时器等。在初始化这些设备之前,也可以重新把前,也可以重新把 LED 灯点亮,以表明我们灯点亮,以表明我们已经进入已经进入 main()函数执行。设备初始化完成函数执行。设备初始化完成后,可以输出一些打印信息,程序名字字符后,可以输出一些打印信息,程序名字字符串、版本号等。串、版本号等。09:1045第二阶段:第二阶段:BootLoader的的stage22.检测系统的内存映射(检测系统的

35、内存映射(memory map)所谓内存映射就是指在整个所谓内存映射就是指在整个 4GB 物理地址空间物理地址空间中有哪些地址范围被分配用来寻址系统的中有哪些地址范围被分配用来寻址系统的 RAM 单元。单元。比如,在比如,在 SA-1100 CPU 中,从中,从 0 xC000,0000 开开始的始的 512M 地址空间被用作系统的地址空间被用作系统的 RAM 地址地址空间,而在空间,而在 Samsung S3C44B0X CPU 中,从中,从 0 x0c00,0000 到到 0 x1000,0000 之间的之间的 64M 地址空地址空间被用作系统的间被用作系统的 RAM 地址空间。地址空间。

36、虽然虽然 CPU 通常预留出一大段足够的地址空间给通常预留出一大段足够的地址空间给系统系统 RAM,但是在搭建具体的嵌入式系统时却,但是在搭建具体的嵌入式系统时却不一定会实现不一定会实现 CPU 预留的全部预留的全部 RAM 地址空间。地址空间。09:1046第二阶段:第二阶段:BootLoader的的stage23.加载内核映像和根文件系统映像加载内核映像和根文件系统映像(1)规划内存占用的布局规划内存占用的布局 这里包括两个方面:内核映像所占用的内存范这里包括两个方面:内核映像所占用的内存范围;根文件系统所占用的内存范围。在规划内围;根文件系统所占用的内存范围。在规划内存占用的布局时,主要

37、考虑基地址和映像的大存占用的布局时,主要考虑基地址和映像的大小两个方面。小两个方面。(2)从从 Flash 上拷贝上拷贝 由于像由于像 ARM 这样的嵌入式这样的嵌入式 CPU 通常都是在统通常都是在统一的内存地址空间中寻址一的内存地址空间中寻址 Flash 等固态存储设等固态存储设备的,因此从备的,因此从 Flash 上读取数据与从上读取数据与从 RAM 单元单元中读取数据并没有什么不同。中读取数据并没有什么不同。09:1047第二阶段:第二阶段:BootLoader的的stage2用一个简单的循环就可以完成从用一个简单的循环就可以完成从 Flash 设设备上拷贝映像的工作:备上拷贝映像的工

38、作:while(count)*dest+=*src+;/*都是以字方式对齐都是以字方式对齐*/count-=4;/*字节数字节数*/;09:1048第二阶段:第二阶段:BootLoader的的stage24.设置内核的启动参数设置内核的启动参数 应该说,在将内核映像和根文件系统映像应该说,在将内核映像和根文件系统映像拷贝到拷贝到 RAM 空间中后,就可以准备启动空间中后,就可以准备启动 Linux 内核了。内核了。但是在调用内核之前,应该作一步准备工但是在调用内核之前,应该作一步准备工作,即:设置作,即:设置 Linux 内核的启动参数。内核的启动参数。09:1049第二阶段:第二阶段:Boo

39、tLoader的的stage25.调用内核调用内核 Boot Loader 调用调用 Linux 内核的方法是直内核的方法是直接跳转到内核的第一条指令处,也即直接接跳转到内核的第一条指令处,也即直接跳转到跳转到 MEM_START0 x8000 地址处。地址处。09:10503.4.4Bootloader移植实例一:移植实例一:U_Boot1.U-Boot概述概述U-Boot可支持的主要功能如下。可支持的主要功能如下。系统引导:支持系统引导:支持NFS挂载、挂载、RAMDISK(压缩或非压压缩或非压缩缩)形式的根文件系统。支持形式的根文件系统。支持NFS挂载,并从挂载,并从FLASH中引导压缩

40、或非压缩系统内核。中引导压缩或非压缩系统内核。基本辅助功能:强大的操作系统接口功能;可灵活基本辅助功能:强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对不同开发阶段的调试要求与产品发布,尤其对Linux支持最为强劲;支持目标板环境参数多种存储方式,支持最为强劲;支持目标板环境参数多种存储方式,如如FLASH、NVRAM、EEPROM;CRC32校验,校验,可校验可校验FLASH中内核、中内核、RAMDISK镜像文件是否完镜像文件是否完好。好。09:11511.U-Boot概述概述设备驱

41、动设备驱动:串口、串口、SDRAM、FLASH、以太网、以太网、LCD、NVRAM、EEPROM、键盘、键盘、USB、PCMCIA、PCI、RTC等驱动支持。等驱动支持。上电自检功能:上电自检功能:SDRAM、FLASH大小自动大小自动检测;检测;SDRAM故障检测;故障检测;CPU型号。型号。特殊功能:特殊功能:XIP内核引导。内核引导。09:11522.源码阅读源码阅读从网站上下载得到从网站上下载得到U-Boot源码包,例如:源码包,例如:U-Boot-1.1.6.tar.bz2,解压就可以得到全部解压就可以得到全部U-Boot源程序。在顶层目录下有源程序。在顶层目录下有18个子目录,分别

42、存放个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为件有其规则,可以分为3类。类。第第1类目录与处理器体系结构或者开发板硬件直接类目录与处理器体系结构或者开发板硬件直接相关;相关;第第2类目录是一些通用的函数或者驱动程序;类目录是一些通用的函数或者驱动程序;第第3类目录是类目录是U-Boot的应用程序、工具或者文档。的应用程序、工具或者文档。09:115309:1154Board目录:存放和一些已有开发板有关的文件,比如目录:存放和一些已有开发板有关的文件,比如Makefile和和U-Boot.lds等都和具体开发板的硬

43、件和地址分等都和具体开发板的硬件和地址分配有关。配有关。Common目录:存放与体系结构无关的文件,实现各种命目录:存放与体系结构无关的文件,实现各种命令的令的C文件。文件。Cpu目录:存放目录:存放CPU相关文件,其中的子目录都是以相关文件,其中的子目录都是以U-BOOT所支持的所支持的CPU为名,比如有子目录为名,比如有子目录arm926ejs、mips、mpc8260和和nios等,每个特定的子目录中都包括等,每个特定的子目录中都包括cpu.c和和interrupt.c,start.S。其中。其中cpu.c初始化初始化CPU、设置、设置指令指令Cache和数据和数据Cache等。等。in

44、terrupt.c设置系统的各种中设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;断、预取中止和未定义指令等;start.S是是U-BOOT启动时启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入为进入C程序奠定基础。程序奠定基础。2.源码阅读源码阅读09:1155Disk目录:存放目录:存放disk驱动的分区处理代码。驱动的分区处理代码。Doc目录:存放开发使用的文档。目录:存放开发使用的文档。Drivers目录:存放通用设备驱动程序,

45、比如各种网卡、支目录:存放通用设备驱动程序,比如各种网卡、支持持CF1的的Flash、串口和、串口和USB总线等。总线等。Fs目录:存放支持文件系统的文件,目录:存放支持文件系统的文件,U-BOOT现在支持现在支持cramfs、fat、fdos、jffs2和和registerfs。net目录:存放与网络有关的代码,目录:存放与网络有关的代码,BOOTP协议、协议、TFTP协议、协议、RARP协议和协议和NFS文件系统的实现。文件系统的实现。lib_arm目录:存放与目录:存放与ARM体系结构相关的代码。体系结构相关的代码。tools目录:存放创建目录:存放创建S-Record格式文件和格式文件

46、和U-BOOT images的工具。的工具。Include存放:头文件,还有对各种硬件平台支持的汇编文存放:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。件,系统的配置文件和对文件系统支持的文件。2.源码阅读源码阅读09:11563.u-boot的移植的移植(1)在顶层)在顶层Makefile中为开发板添加新的配置选中为开发板添加新的配置选项项(2)创建一个新目录存放开发板相关的代码,并)创建一个新目录存放开发板相关的代码,并且添加文件。且添加文件。(3)为开发板添加新的配置文件)为开发板添加新的配置文件(4)配置开发板)配置开发板(5)编译)编译U-Boot

47、(6)添加驱动或者功能选项)添加驱动或者功能选项(7)调试)调试U-Boot源代码,直到源代码,直到U-Boot在开发板在开发板上能够正常启动。上能够正常启动。09:11574.烧写烧写U-Boot新开发的电路板没有任何程序可以执行,新开发的电路板没有任何程序可以执行,也就不能启动,需要先将也就不能启动,需要先将U-Boot烧写到烧写到Flash中。中。多数嵌入式单板通过处理器的调试接口,多数嵌入式单板通过处理器的调试接口,直接对板上的直接对板上的Flash编程。最简单方式就编程。最简单方式就是通过是通过JTAG电缆,转接到计算机并口连电缆,转接到计算机并口连接。把接。把Bootloader下

48、载并烧写到下载并烧写到Flash中。中。烧写完成后,复位实验板,串口终端应该烧写完成后,复位实验板,串口终端应该显示显示U-Boot的启动信息。的启动信息。09:11583.4.5Bootloader移植实例二:移植实例二:vivi1.vivi概述概述vivi是由韩国是由韩国Mizi公司开发的一种公司开发的一种Bootloader,适合于适合于ARM9处理器,支持处理器,支持S3C2410 x处理器,处理器,其源代码可以在其源代码可以在http:/网站下载。网站下载。和所有的和所有的Bootloader一样,一样,vivi有两种工作模式,有两种工作模式,即启动加载模式和下载模式。当即启动加载模

49、式和下载模式。当vivi处于下载模处于下载模式时,式时,它为用户提供一个命令行接口,通过该接它为用户提供一个命令行接口,通过该接口能使用口能使用vivi提供的一些命令集。提供的一些命令集。大多数大多数Bootloader都分为都分为stage1和和stage2两部两部分,分,stage2的代码通常用的代码通常用C语言来实现,以便语言来实现,以便于实现更复杂的功能并取得更好的代码可读性和于实现更复杂的功能并取得更好的代码可读性和可移植性。可移植性。09:11592.vivi源码导读源码导读代码基本结构代码基本结构09:11602.vivi源码导读源码导读arch:此目录包括了所有:此目录包括了所

50、有vivi支持的目标板的子支持的目标板的子目录,例如目录,例如s3c2410目录。目录。Documentation:存放一些使用:存放一些使用VIVI的帮助文的帮助文档。档。drivers:其中包括了引导内核需要的设备的驱:其中包括了引导内核需要的设备的驱动程序(动程序(MTD和串口)。和串口)。MTD目录下分目录下分map、nand和和nor三个目录。三个目录。init:这个目录只有:这个目录只有main.c和和version.c两个文两个文件。和普通的件。和普通的C程序一样,程序一样,vivi将从将从main函数开函数开始执行。始执行。09:11612.vivi源码导读源码导读includ

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁