收藏 分享(赏)

嵌入式ppt第七章.ppt

上传人:bubibi 文档编号:20014186 上传时间:2023-12-02 格式:PPT 页数:111 大小:2.02MB
下载 相关 举报
嵌入式ppt第七章.ppt_第1页
第1页 / 共111页
嵌入式ppt第七章.ppt_第2页
第2页 / 共111页
嵌入式ppt第七章.ppt_第3页
第3页 / 共111页
嵌入式ppt第七章.ppt_第4页
第4页 / 共111页
嵌入式ppt第七章.ppt_第5页
第5页 / 共111页
亲,该文档总共111页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第第7章章嵌入式嵌入式Linux系统移植及调试系统移植及调试目目录录7.1 7.1 Boot LoaderBoot Loader基本概念与典型结构基本概念与典型结构7.2 7.2 U-Boot U-Boot 7.3 7.3 交叉开发环境的建立交叉开发环境的建立7.4 7.4 交叉编译工具链交叉编译工具链7.5 7.5 嵌入式嵌入式LinuxLinux系统移植过程系统移植过程7.6 7.6 GdbGdb调试器调试器7.7 7.7 远程调试远程调试7.8 7.8 内核调试内核调试一个嵌入式linux系统通常由引导程序及参数、linux内核、文件系统和用户应用程序组成。由于嵌入式系统与开发主机运行的

2、环境不同,这就为开发嵌入式系统提出了开发环境特殊化的要求。交叉开发环境正是在这种背景下应运而生。7.1BootLoader基本概念与典型结构基本概念与典型结构Part One7.17.17.1.1BootLoader基本概念基本概念一个嵌入式Linux系统通常可以分为以下几个部分:(1 1)引导加载程序及其环境参数)引导加载程序及其环境参数。这里通常是指BootLoader以及相关环境参数。(2 2)LinuxLinux内核内核。基于特定嵌入式开发板的定制内核以及内核的相关启动参数。(3 3)文件系统)文件系统。主要包括根文件系统和一般建立于Flash内存设备之上文件系统。(4 4)用户应用程

3、序)用户应用程序。基于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面程序(GUI)。常见的嵌入式GUI有QT和MiniGUI等。在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行的一小段程序,可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个适合的状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像通用计算机中BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。BootLoader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作

4、系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间,启动操作系统运行。对于嵌入式系统而言,BootLoader是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的BootLoader,不同的处理器架构都有不同的BootLoader。BootLoader不仅依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的相关配置。7.1.2 BootLoader的操作模式的操作模式 大多数BootLoader都包含两种不同的操作模式:自启动模式和交互模式。这种划分仅仅对于开发人员才有意义。(1)自启动模式自启动模式也叫启动加载模式。在这种模式下,BootLoad

5、er自动从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式(2)交互模式交互模式也叫下载模式。在这种模式下,目标机上的BootLoader将通过串口或网络等通信手段从开发主机上下载内核映像、根文件系统到RAM中。然后再被BootLoader写到目标机上的固态存储媒质(如FLASH)中,或者直接进入系统的引导。交互模式也可以通过接口(如串口)接收用户的命令。这种模式在初次固化内核、根文件系统时或者更新内核及根文件系统时都会用到。7.1.3 BootLoader的典型结构的典型结构 BootLoader启动大多数都分为

6、两个阶段。第一阶段主要包含依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。这个阶段的任务有:基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据Cache等)。为第二阶段准备RAM空间。如果是从某个固态存储媒质中,则复制BootLoader的第二阶段代码到RAM。设置堆栈。跳转到第二阶段的C程序入口点。第二阶段通常用C语言完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的任务有:初始化本阶段要使用到的硬件设备。检测系统内存映射。将内核映像和根文件系统映像从Flash读到RAM。为内核设置启动参数。调用内核。7.1.4常见的常见的BootLoade

7、r(1)RedbootRedboot(RedHatEmbeddedDebugandBootstrap)是RedHat公司开发的一个独立运行在嵌入式系统上的BootLoader程序,是目前比较流行的一个功能、可移植性好的BootLoader。Redboot是一个采用eCos开发环境开发的应用程序,并采用了eCos的硬件抽象层作为基础,但它完全可以摆脱eCos环境运行,可以用来引导任何其他的嵌入式操作系统,如Linux、WindowsCE等。Redboot支持的处理器构架有ARM,MIPS,MN10300,PowerPC,Renesas SHx,v850,x86等,是一个完善的嵌入式系统BootL

8、oader。(2)U-BootU-Boot(UniversalBootLoader)于2002年12月17日发布第一个版本U-Boot-0.2.0。U-Boot自发布以后已更新多次,其支持具有持续性。U-Boot是在GPL下资源代码最完整的一个通用BootLoader。(3)BlobBlob(BootLoaderObject)是由Jan-DerkBakker和ErikMouw发布的,是专门为StrongARM构架下的LART设计的BootLoader。Blob的最后版本是blob-2.0.5。Blob功能比较齐全,代码较少,比较适合做修改移植,用来引导Liunx,目前大部分S3C44B0板都用

9、Blob修改移植后加载uClinux。(4)vivivivi是韩国mizi公司开发的BootLoader,适用于ARM9处理器,现在已经停止开发了。它是三星官方板SMDK2410采用的BootLoader。Vivi最主要的特点就是代码小巧,有利于移植新的处理器。同时vivi的软件架构和配置方法类似Linux风格,对于有过编译Linux内核经验的用户,vivi更容易上手。U-BootPart Two7.27.27.2.1U-Boot概述概述U-Boot,全称UniversalBootLoader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源

10、码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序。U-Boot支持多种嵌入式操作系统,主要有OpenBSD,NetBSD,FreeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,SCO,Dell,NCR,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS,android等。同时,U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。U-Boot的主要特点有:源码开放,目前有

11、些版本的未开源。支持多种嵌入式操作系统内核和处理器架构。可靠性和稳定性均较好。功能设置高度灵活,适合调试、产品发布等;设备驱动源码十分丰富,支持绝大多数常见硬件外设;并将对于与硬件平台相关的代码定义成宏并保留在配置文件中,开发者往往只需要修改这些宏的值就能成功使用这些硬件资源,简化了移植工作。在U-Boot的这些源文件中,以S5PV210为例几个比较重要的源文件如下所示:(1)start.S(archarmcpuarmv7start.S)通常情况下start.S是U-Boot上电后执行的第一个源文件。该汇编文件包括定义了异常向量入口、相关的全局变量、禁用L2缓存、关闭MMU等,之后跳转到low

12、level_init()函数中继续执行。(2)lowlevel_init.S(boardsamsungsmdkv210lowlevel_init.S)该源文件用汇编代码编写,其中只定义了一个函数lowlevel_init()。该函数实现对平台硬件资源的一系列初始化过程,包括关看门狗、初始化系统时钟、内存和串口。(3)board.c(archarmlibboard.c)Board.c主要实现了U-Boot第二阶段启动过程,包括初始化环境变量、串口控制台、Flash和打印调试信息等,最后调用main_loop()函数。(4)smdkv210.h(includeconfigsSmdkv210.h)该

13、文件与具体平台相关,比如这里就是S5PV210平台的配置文件,该源文件采用宏定义了一些与CPU或者外设相关的参数。7.2.2U-Boot启动的一般流程启动的一般流程跟大多数BootLoader的启动过程相似,U-Boot的启动过程分为两个阶段:第一阶段主要由汇编代码实现,负责对CPU及底层硬件资源的初始化;第二阶段用C语言实现,负责使能Flash、网卡等重要硬件资源和引导操作系统等。7-3U-Boot第一阶段启动流程1.第一阶段初始化第一阶段初始化与U-Boot第一阶段有关的文件主要有start.s和lowlevel_init.s。上电后,U-Boot首先会设置CPU为管理模式、禁用L1缓存、

14、关闭MMU和清除Caches,之后调用底层初始化函数lowlevel_init()。该函数部分实现如下。.globllowlevel_initlowlevel_init:pushlr#ifdefined(CONFIG_SPL_BUILD)/*初始化时钟*/blsystem_clock_init/*初始化内存*/blmem_ctrl_asm_init/*初始化串口*/bluart_asm_init#endifpoppc初始化完成之后,U-Boot首先调用一个如下所示的拷贝函数将BL2拷贝到内存地址为0 x3FF00000处,然后跳转到该位置执行BL2。在U-Boot中,BL1和BL2是基于相同的

15、一些源文件编译生成的。开发者在编写代码时需要使用预编译宏CONFIG_SPL_BUILD来实现BL1和BL2不同的功能。2.第二阶段初始化第二阶段初始化进入第二阶段后,U-Boot首先声明一个gd_t结构体类型的指针指向内存地址(0 x40000000GD_SIZE)处。0 x40000000为内存结束地址,GD_SIZE为结构体gd_t的大小,这样相当于在内存最顶端分配了一段空间用于存放一个临时结构体gd_t。该结构体在global_data.h中被定义,U-Boot用它来存储所有的全局变量。之后U-Boot会调用board_init_f()和board_init_r()两个函数进一步对底板

16、进行初始化。(1)board_init_f()进入board_init_f()之后,U-Boot首先设置之前分配的临时结构体,然后开始划分内存空间从图7-4中可以发现,gd指针指向的临时结构体存放于内存的最顶部。BL2代码存放在内存地址0 x3ff00000处,即距离内存顶部1MB空间的位置,接下来依次分配malloc空间、bd_t结构体空间和gd_t结构体空间,并且重新设置栈,最后将临时结构体拷贝到ID指针所指向的位置。(2)board_init_r()board_init_r()负责对其他硬件资源进行初始化,如网卡、Flash、MMC、中断等,最后调用main_loop(),等待用户输入命

17、令。7.2.3U-Boot环境变量环境变量U-Boot的环境变量是使用U-Boot的关键,它可以由用户定义并遵守约定俗成的一些用法,也有部分是U-Boot定义并不得更改。值得注意的是在未初始化的开发板中并不存在环境变量。U-Boot在缺省的情况下会存在一些基本的环境变量,当用户执行了saveenv命令之后,环境变量会第一次保存到flash中,之后用户对环境变量的修改和保存都是基于保存在flash中的环境变量的操作。环境变量名称环境变量名称相关描述相关描述bootdelaybootdelay 执行自动启动的等候秒数baudratebaudrate 串口控制台的波特率netmasknetmask

18、以太网接口的掩码ethaddrethaddr 以太网卡的网卡物理地址bootfilebootfile 缺省的下载文件bootargsbootargs 传递给内核的启动参数bootcmdbootcmd 自动启动时执行的命令serveripserverip 服务器端的ip地址ipaddripaddr 本地ip 地址stdinstdin 标准输入设备stdoutstdout 标准输出设备stderrstderr 标准出错设备表7-3U-Boot常用环境变量U-Boot的环境变量中最重要的两个变量是:bootcmd和bootargs。Bootcmd是自动启动时默认执行的一些命令,因此用户可以在当前环境

19、中定义各种不同配置,不同环境的参数设置,然后通过bootcmd配置好参数。Bootargs是环境变量中的重中之重.7.2.4 U-Boot命令命令U-Boot上电启动后,按任意键退出自启动状态,进入命令行状态。在提示符下,可以输入U-Boot特有的命令完成相应的功能。U-Boot提供了更加周详的命令帮助,通过help命令不仅可以得到当前U-Boot的所有命令列表,还能够查看每个命令的参数说明。7.3交叉开发环境的建立交叉开发环境的建立Part Three7.37.3主机-目标机交叉开发环境模式(Host/target)主机-目标机交叉开发环境模式是由开发主机和目标机两套计算机系统内组成的。开发

20、主机一般指通用计算机,如PC等,目标机指嵌入式开发板(系统)。通过交叉开发环境,在主机上使用开发工具(如各种SDK),针对目标机设计应用系统进行设计工作,然后下载到目标机上运行。交叉开发模式一般采用以下3个步骤:(1)在主机上编译 BootLoader(引导加载程序),然后通过 JTAG 接口烧写到目标板。(2)在主机上编译 Linux 内核,然后通过 BootLoader 下载到目标板以启动或烧写到 Flash。(3)在主机上编译各类应用程序,通过 NFS 运行、调试这些程序,验证无误后再将制作好的文件系统映像烧写到目标板7.3.1.主机与目标机的连接方式主机与目标机的连接方式主机与目标机的

21、连接方式主要有串口、以太网接口、USB接口、JTAG接口等方式连接。主机可以使用minicom、kermit或者Windows超级终端等工具,通过串口发送文件。目标机亦可以把程序运行结果通过串口返回并显示。以太网接口方式使用简单,配置灵活,支持广泛,传输速率快,缺点是网络驱动的实现比较复杂。JTAG(JointTestActionGroup,联合测试行动小组)是一种国际标准测试协议(IEEE1149.1标准),主要是用于对目标机系统中的各芯片的简单调试,和对BootLoader的下载两个功能。JTAG连接器中,其芯片内部封装了专门的测试电路TAP(TestAccessPort,测试访问口),通

22、过专用的JTAG测试工具对内部节点进行测试。因而该方式是开发调试嵌入式系统的一种简洁高效的手段。JTAG有两种标准,14针接口和20针接口。JTAG接口一端与PC机并口相连,另一端是面向用户的JTAG测试接口,通过本身具有的边界扫描功能便可以对芯片进行测试,从而达到处理器的启动和停滞、软件断点、单步执行和修改寄存器等功能的调试目的。其内部主要是由JTAG状态机和JTAG扫描链的组成。虽然JTAG调试不占用系统资源,能够调试没有外部总线的芯片,代价也非常小,但是JTAG只能提供一种静态的调试方式,不能提供处理器实时运行时的信息。它是通过串行方式依次传递数据的,所以传送信息速度比较慢。7.3.2.

23、主机主机-目标机的文件传输方式目标机的文件传输方式主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。串口传输协议常见的有kermit、Xmodem、Ymoderm、Zmoderm等。串口驱动程序的实现相对简单,但是速度慢,不适合较大文件的传输。USB接口方式通常将主机设为主设备端,目标机设为从设备端。与其他通信接口相比,USB接口方式速度快,配置灵活,易于使用。如果目标机上有移动存储介质如U盘等,可以制作启动盘或者复制到目标机上,从而引导启动。网络传输方式一般采用TFTP(trivial file transport pro

24、tocol)协议。TFTP是一个传输文件的简单协议,是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。此协议只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。传输中有三种模式:netascii,这是8位的ASCII码形式;另一种是octet,这是8位源数据类型;最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。7.3.3.文件系统的挂接文件系统的挂接-配置网络文件系统配置网络文件系统NFSNFS(NetworkFileSystem)即网络文件系统,是FreeBSD支持

25、的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS的优点主要有:(1)节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。(2)用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。(3)一些存储设备如软驱、CDROM和Zip等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。NFS体系至少有两个主要部分:一台NFS服务

26、器和若干台客户机。客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。7.3.4.交叉编译环境的建立交叉编译环境的建立交叉编译是在一个平台上生成另一个平台上执行代码。在宿主机上对即将运行在目标机上的应用程序进行编译,生成可在目标机上运行的代码格式。交叉编译环境是由一个编译器、连接器和解释器组成的综合开发环境。交叉编译工具主要包括针对目标系统的编译器、目标系统的二进制工具、目标系统的标准库和目标系统的内核头文件。交叉编译工具链交叉编译工具链Part Foue7.47.47.4.1交叉编译工具链概述交叉编译工具链概述在

27、一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(crosscompilationtoolchain),然后用这个交叉编译工具链编译链接源代码,最终生成可在目标平台上运行的程序。常见的交叉编译例子如下:(1)在WindowsPC上,利用诸如类似ADS、RVDS等软件,使用armcc编译器,则可编译出针对ARMCPU的可执行代码。(2)在LinuxPC上,利用arm-linux-gcc编译器,可编译出针对LinuxARM平台的可执行代码。(3)在Windows

28、PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARMCPU的可执行代码。交叉开发工具链就是为了编译、链接、处理和调试跨平台体系结构的程序代码。每次执行工具链软件时,通过带有不同的参数,可以实现编译、链接、处理或者调试等不同的功能。从工具链的组成上来说,它一般由多个程序构成,分别对应着各个功能。7.4.2工具链的构建方法工具链的构建方法 通常构建交叉工具链有如下三种方法。方法一:分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者及用户。如果只是想使用交叉工具链,建议使用下列的方法二构建交叉工

29、具链。方法二:通过Crosstool脚本工具来实现一次编译,生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。方法三:直接通过网上下载已经制作好的交叉编译工具链。该方法的优点是简单可靠,缺点也比较明显,扩展性不足,对特定目标没有针对性,而且也存在许多未知错误的可能,建议读者慎用此方法。7.4.3 交叉编译工具链的主要工具交叉编译工具链的主要工具交叉编译工具主要包括针对目标系统的编译器、目标系统的二进制工具、调试器、目标系统的标准库和目标系统的内核头文件。主要由glibc、gcc、binutils和gdb四个软件提供。Gdb调

30、试器作为单独一小节在7.6小节介绍。1.GCC通常所说的GCC是GUNCompilerCollection的简称,除了编译程序之外,它还含其他相关工具,所以它能把高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的实际上的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。对于GUN编译器来说,GCC的编译要经历四个相互关联的步骤预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。源代码(这里以file.c为

31、例)经过四个步骤后从而产生一个可执行文件,各部分对应不同的文件类型,具体如下:file.c c程序源文件file.i c程序预处理后文件file.cxx c+程序源文件,也可以是file.cc/file.cpp/file.c+file.ii c+程序预处理后文件file.h c/c+头文件file.s 汇编程序文件file.o 目标代码文件2.BinutilsBinutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常bi

32、nutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。(1)编译单个文件vihello.c/创建源文件hello.cgcc-ohellohello.c/编译为可执行文件hello,在默认情况下产生的可执行文件名为a.out./hello/执行文件,如果只写hello是错误的,因为系统会将hello当指令来执行,然后报错(2)编译多个源文件vimessage.cgcc-cmessage.c/输出message.o文件,是一个已编译的目标代码文件vimain.cgcc-cmain.c/输出main.o文件gcc-oallmain.omessage.o/执行连接阶段的

33、工作,然后生成all可执行文件./all注意:gcc对如何将多个源文件编译成一个可执行文件有内置的规则,所以前面的多个单独步骤可以简化为一个命令。vimessage.cvimain.cgcc-oallmessage.cmain.c./all(3)使用外部函数库GCC常常与包含标准例程的外部软件库结合使用,几乎每一个linux应用程序都依赖于GNUC函数库GLIBC。vitrig.cgcc-otrig-lmtrig.cGCC的-lm选项,告诉GCC查看系统提供的数学库libm。函数库一般会位于目录/lib或者/usr/lib中。(4)共享函数库和静态函数库静态函数库:每次当应用程序和静态连接的函

34、数库一起编译时,任何引用的库函数的代码都会被直接包含进最终二进制程序。共享函数库:包含每个库函数的单一全局版本,它在所有应用程序之间共享。vimessage.cvihello.cgcc-chello.cgcc-fPIC-cmessage.cgcc-shared-olibmessge.somessage.o其中,PIC命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它链接到哪一段地址空间。这样编译输出的文件message.o可以被用于建立共享函数库。-shared标记将某目标代码文件变换成共享函数库文件。gcc-oall-l

35、message-L.hello.o-lmessage标记来告诉GCC在连接阶段使用共享数据库libmessage.so,-L.标记告诉GCC函数库可能在当前目录中,首先查找当前目录,否则GCC连接器只会查找系统函数库目录,在本例情况下,就找不到可用的函数库了。3.glibcGglibc是gnu发布的libc库,也即c运行库。Glibc是linux系统中最底层的应用程序开发接口,几乎其它所有的运行库都倚赖于glibc。Glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,比如open,malloc,printf等等。Glibc是GNU工具链的关键组

36、件,用于和二进制工具和编译器一起使用,为目标架构生成用户空间应用程序。7.4.4 MakefileGNUmake是一种常用的编译工具,通过它,开发人员可以很方便地管理软件编译的内容、方式和时机,从而能够把主要精力集中在代码的编写上。Gnumake的主要工作是读取一个文本文件makefile。这个文件里主要是有关目的文件是从哪些依赖文件中产生的,以及用什么命令来进行这个产生过程。一个makefile主要包含有一系列的规则,一个makefile主要含有一系列的规则,如下::.(tab)(tab).例如,考虑以下的makefile:=makefile开始=Myprog:foo.obar.oGccfo

37、o.obar.oomyprogfoo.o:foo.cfoo.hbar.hgcccfoo.cofoo.obar.obar.cbar.hgcccbar.cobar.o=makefile结束=嵌入式嵌入式Linux系统移植过程系统移植过程Part Five7.57.5嵌入式Linux系统的移植主要针对BootLoader(最常用的是U-Boot)、Linux内核、文件系统这三部分展开工作。嵌入式Linux系统移植的一般流程是:首先构建嵌入式Linux开发环境,包括硬件环境和软件环境;其次,移植引导加载程序BootLoader;然后,移植Linux内核和构建根文件系统;最后,一般还要移植或开发设备驱动

38、程序。这几个步骤完成之后,嵌入式 Linux 已经可以在目标板上运行起来,开发人员能够在串口控制台进行命令行操作。如果需要图形界面支持,还需要移植位于用户应用程序层次的GUI(Graphical User Interface),比如 Qtopia、Mini GUI 等。7.5.1 U-Boot 移植移植开始移植U-Boot之前,要先熟悉处理器和开发板。确认U-Boot是否已经支持新开发板的处理器和I/O设备,如果U-Boot已经支持该开发板或者十分相似的开发板,那么移植的过程就将非常简单。整体看来,移植U-Boot就是添加开发板硬件需要的相关文件、配置选项,然后编译和烧写到开发板。U-Boot

39、的移植过程主要包括以下四个步骤:1.下载下载U-Boot源码源码U-Boot的源码包可以从SourceForge网站下载,具体地址为http:/ smdkv210_config;第二步是编译,执行make就可以了。如果一切顺利,则可以得到U-Boot镜像。为避免不必要的错误,一开始可以尽量与参考评估板保持一致。文件名称文件名称说明说明System.mapU-Boot映像的符号表映像的符号表U-BootU-Boot映像的映像的ELF格式格式U-Boot.binU-Boot映映像像原原始始的的二二进进制制格式格式U-Boot.srcU-Boot影响的影响的S-Record格式格式U-BOOT编译生

40、成的映像文件4.烧写到开发板上,运行和调试烧写到开发板上,运行和调试新开发的板子没有任何程序可以执行,也不能启动,需要先将U-Boot烧写到flash或者SD卡中。这里使用最为广泛的硬件设备就是前文介绍过的JTAG接口。工具名称工具名称说明说明bmp_logo制作标记的位图结构体制作标记的位图结构体envcrc检验检验U-Boot内部嵌入的环境内部嵌入的环境变量变量gen_eth_addr生成以太网接口生成以太网接口MAC地址地址Img2srec转换转换SREC格式映像格式映像mkimage转换转换U-Boot格式映像格式映像updaterU-Boot自动更新升级工具自动更新升级工具表7-8U

41、-Boot常用工具7.5.2 内核的配置、编译和移植内核的配置、编译和移植1.MakefileLinux内核中的哪些文件将被编译?怎样编译这些文件?连接这些文件的顺序如何?其实所有这些都是通过Makefile来管理的。在内核源码的各级目录中含有很多个 Makefile 文件,有的还要包含其它的配置文件或规则文件。所有这些文件一起构成了 Linux 的 Makfile 体系 名称名称描述描述顶层顶层MakefileMakefile体体系系的的核核心心,从从总总体体上上控制内核的编译、连接控制内核的编译、连接.config配配置置文文件件,在在配配置置内内核核时时生生成成。所所有有的的Makefi

42、le文文件件都都根根据据.config的内容来决定使用哪些文件的内容来决定使用哪些文件Arch/$(ARCH)/Makefile与与体体系系结结构构相相关关的的Makefile,用用来来决决定定由由哪哪些些体体系系结结构构相相关关的的文文件件参与生成内核参与生成内核Scripts/Makefile.*所所有有Makefile共共用用的的通通用用规规则则,脚本等脚本等Kbuild Makefile各各级级子子目目录录下下的的Makefile,它它们们被被上上一一层层Makefile调调用用以以编编译译当当前前目目录下的文件录下的文件表7-9Linux内核源码Makefile体系的5个部分Make

43、file编译、连接的大致工作流程为:(1)内核源码根目录下的.config文件中定义了很多变量,Makefile通过这些变量的值来决定源文件编译的方式(编译进内核、编译成模块、不编译),以及涉及哪些子目录和源文件。(2)根目录下的顶层的Makefile决定根目录下有哪些子目录将被编译进内核,arch/$(ARCH)/Makefile决定arch/$(ARCH)目录下哪些文件和目录被编译进内核。(3)各级子目录下的Makefile决定所在目录下的源文件的编译方式,以及进入哪些子目录继续调用它们的Makefile。(4)在顶层Makefile和arch/$(ARCH)/Makefile中还设置了全

44、局的编译、连接选项:CFLAGS(编译C文件的选项)、LDFLAGS(连接文件的选项)、AFLAGS(编译汇编文件的选项)、ARFLAGS(制作库文件的选项)。(5)各级子目录下的Makefile可设置局部的编译、连接选项:EXTRA_CFLAGS、EXTRA_LDFLAGS、EXTRA_AFLAGS、EXTRA_ARFLAGS。(6)最后,顶层Makefile按照一定的顺序组织文件,根据连接脚本生成内核映像文件。2.内核的内核的Kconfig分析分析为了理解Kconfig文件的作用,需要先了解内核配置界面。在内核源码的根目录下运行命令:#makemenuconfigARCH=armCROSS

45、_COMPILE=arm-linux-这样会出现一个菜单式的内核配置界面,通过它就可以对支持的芯片类型和驱动程序进行选择,或者去除不需要的选项等,这个过程就称为“配置内核”在内核源码的绝大多数子目录中,都具有一个Makefile文件和Kconfig文件。Kconfig就是内核配置界面的源文件,它的内容被内核配置程序读取用以生成配置界面,从而供开发人员配置内核,并根据具体的配置在内核源码根目录下生成相应的配置文件config。Kconfig文件的基本要素是config条目(entry),它用来配置一个选项,或者可以说,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件.config中。3

46、.内核的配置选项内核的配置选项Linux内核配置选项非常多,一般是在某个缺省配置文件的基础上进行修改。ARCH?=armCROSS_COMPILE?=arm-linux-原生的内核源码根目录下是没有配置文件.config 的,一般通过加载某个缺省的配置文件来创建.config 文件,然后再通过命令“make menuconfig”来修改配置。内核配置的基本原则是把不必要的功能都去掉,不仅可以减小内核大小,还可以节省编译内核和内核模块的时间。4.内核移植内核移植对于内核移植而言,主要是添加开发板初始化和驱动程序的代码,这些代码大部分是跟体系结构相关。具体到cotrex-A8型开发板来说,linu

47、x已经有了较好的支持。比如从Kernel官方维护网站kernel.org上下载到2.6.35的源代码,解压后查看arch/arm/目录下已经包含了三星S5PV210的支持,即三星官方评估开发板SMDK210的相关文件mach-smdkv210了。移植Kernel只需要修改两个开发板之间的差别之处就可以了。4.内核移植内核移植对于内核移植而言,主要是添加开发板初始化和驱动程序的代码,这些代码大部分是跟体系结构相关。具体到cotrex-A8型开发板来说,linux已经有了较好的支持。比如从Kernel 官方维护网站 kernel.org 上下载到 2.6.35的源代码,解压后查看arch/arm/

48、目录下已经包含了三星 S5PV210 的支持,即三星官方评估开发板 SMDK210的相关文件 mach-smdkv210 了。移植 Kernel 只需要修改两个开发板之间的差别之处就可以了。Gdb调试器调试器Part Six7.67.6GDB(GNUDeBugger)是自由软件基金会(FreeSoftwareFoundation,FSF)的软件工具之一。它的作用是协助程序员找到代码中的错误。(1)进入GDBGdbtesttest是要调试的程序,由gcc test.c-g-o test生成。进入后提示符变为(Gdb)。(2)查看源码(Gdb)l源码会进行行号提示。如果需要查看在其他文件中定义的函

49、数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。(3)设置断点(Gdb)b6这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是Gdb的行号。(4)查看断点处情况(Gdb)infob可以键入info b来查看断点处情况,可以设置多个断点;(5)运行代码(Gdb)r(6)显示变量值(Gdb)pn在程序暂停时,键入p 变量名(print)即可;GDB在显示变量值时都会在对应值之前加上$N标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作$N,而无需写冗长的变量名;(7)观察变量(Gd

50、b)watchn在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令watch来观察变量的变化情况,GDB在n设置了观察点;(8)单步运行(Gdb)n(9)程序继续运行(Gdb)c使程序继续往下运行,直到再次遇到断点或程序结束;(10)退出GDB(Gdb)qGdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么Gdb会把其例出来。远程调试远程调试Part Six7.77.7在嵌入式软件调试过程中,调试器通常运行于主机环境中,被调试的软件则运

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

当前位置:首页 > 网络技术 > 前端技术

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报