版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式与ARM体系构造总结ARM汇编程序设计 掌握ARM汇编规范掌握ARM指令的汇编程序设计 掌握汇编言语与C言语的混合编程5ARM初始化过程分析第章本章目的了解ARM初始化过程熟习BootLoader的实现原理认识Bootloader的主要义务 熟习BootLoader的构造框架5.1 引言 本章详细地引见了基于嵌入式系统中的 OS 启动加载程序Boot Loader 的概念、软件设计的主要义务以及构造框架等内容 。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader
2、两大部分。2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 4. 用户运用程序。特定于用户的运用程序。有时在用户运用程序和内核层之间能够还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 。引导加载程序是系统加电后运转的第一段软件代码。回想一下 PC 的体系构造我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader比如,L
3、ILO 和 GRUB 等一同组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要运转义务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运转,也即开场启动操作系统。 而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序注,有的嵌入式 CPU 也会内嵌一段短小的启动程序,因此整个系统的加载启动义务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0 x00
4、000000 处开场执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。 5.1 引言5.1 引言系统的启动通常有两种方式,一种是可以直接从Flash启动,另一种是可以将紧缩的内存映像文件从Flash为节省Flash资源、提高速度中复制、解压到RAM,再从RAM启动。当电源翻开时,普通的系统会去执行ROM运用较多的是Flash里面的启动代码。这些代码是用汇编言语编写的,其主要作用在于初始化CPU和板上的必备硬件如内存、中断控制器等。有时候用户还必需根据本人板子的硬件资源情况做适当的调整与修正。 系统启动代码完成根本软硬件环境初始化后,对于有操作系统的情况下,启动操作系统、启
5、动内存管理、义务调度、加载驱动程序等,最后执行运用程序或等待用户命令;对于没有操作系统的系统直接执行运用程序或等待用户命令。 设置中断异常向量系统存放器配置看门狗及外围电路初始化存储器电路初始化初始化栈指针变量初始化数据区预备高级言语入口函数调用启动代码是用来初始化电路以及用来为高级言语写的软件做好运转前预备的一小段汇编言语,在商业实时操作系统中,启动代码部分普通被称为板级支持包,英文缩写为BSP。它的主要功能就是:电路初始化和为高级言语编写的软件运转做预备。右图:嵌入式系统启动流程图5.1 引言 5.2 Bootloader概述 简单地说,Boot Loader 就是在操作系统内核运转之前运
6、转的一段小程序。经过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个适宜的形状,以便为最终调用操作系统内核预备好正确的环境。 通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不能够的。虽然如此,我们依然可以对 Boot Loader 归纳出一些通用的概念来,以指点用户特定的 Boot Loader 设计与实现。 5.2 Bootloader概述1. Boot Loader 所支持的 CPU 和嵌入式板每种不同的 CPU 体系构造都有不同的 Boot Loade
7、r。有些 Boot Loader 也支持多种体系构造的 CPU,比如 U-Boot 就同时支持 ARM 体系构造和MIPS 体系构造。除了依赖于 CPU 的体系构造外,Boot Loader 实践上也依赖于详细的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运转在一块板子上的 Boot Loader 程序也能运转在另一块板子上,通常也都需求修正 Boot Loader 的源程序。 5.2 Bootloader概述2. Boot Loader 的安装媒介Installation Medium系统加电或复位后,一切的 CPU 通常都从某
8、个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0 x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。 以下图就是一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配构造图。 KernelRoot FilesystemBootLoaderBoot Parameters 5.2
9、Bootloader概述3. 用来控制 Boot Loader 的设备或机制主机和目的机之间普统统过串口建立衔接,Boot Loader 软件在执行时通常会经过串口来进展 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。4. Boot Loader 的启动过程是单阶段Single Stage还是多阶段Multi-Stage通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。而至于在 stage 1 和 stage
10、 2 详细完成哪些义务将在下面讨论。 5.2 Bootloader概述5. Boot Loader 的操作方式 (Operation Mode)大多数 Boot Loader 都包含两种不同的操作方式:“启动加载方式和“下载方式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载方式与下载任务方式的区别。 启动加载Boot loading方式: 这种方式也称为“自主Autonomous方式。也即 Boot Loader 从目的机上的某个固态存储设备上将操作系统加载到 RAM 中运转,整个过程并没有用户的介入。下载D
11、ownloading方式: 在这种方式下,目的机上的 Boot Loader 将经过串口衔接或网络衔接等通讯手段从主机Host下载文件,比如:下载内核映像和根文件系统映像等。 6. BootLoader 与主机之间进展文件传输所用的通讯设备及协议最常见的情况就是,目的机上的 Boot Loader 经过串口与主机之间进展文件传输,传输协议通常是 xmodemymodemzmodem 协议中的一种。但是,串口传输的速度是有限的,因此经过以太网衔接并借助 TFTP 协议来下载文件是个更好的选择。在经过以太网衔接和 TFTP 协议来下载文件时,主机方必需有一个软件用来的提供 TFTP 效力。 5.3
12、 BootLoader的主要义务与典型构造框架假定内核映像与根文件系统映像都被加载到 RAM 中运转. 另外,由于 Boot Loader 的实现依赖于 CPU 的体系构造,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系构造的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编言语来实现,以到达短小精悍的目的。而 stage2 那么通常用C言语来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。 5.3 BootLoader的主要义务与典型构造框架5.3.1 Bootloader的stage1
13、Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序): 1硬件设备初始化。 2为加载 Boot Loader 的 stage2 预备 RAM 空间。 3拷贝 Boot Loader 的 stage2 到 RAM 空间中。 4设置好堆栈。 5跳转到 stage2 的 C 入口点。 5.3BootLoader的主要义务与典型构造框架1 根本的硬件初始化 这是 Boot Loader 一开场就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行预备好一些根本的硬件环境。它通常包括以下步骤以执行的先后顺序: 1.屏蔽一切的中断。为中断提供效力通常是 O
14、S 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不用呼应任何中断。中断屏蔽可以经过写 CPU 的中断屏蔽存放器或形状存放器比如 ARM 的 CPSR 存放器来完成。 2.设置 CPU 的速度和时钟频率。 3.RAM 初始化。包括正确地设置系统的内存控制器的功能存放器以及各内存库控制存放器等。 4.初始化 LED。典型地,经过 GPIO 来驱动 LED,其目的是阐明系统的形状是 OK 还是 Error。假设板子上没有 LED,那么也可以经过初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息来完成这一点。 5.封锁 CPU 内部指令数据 cach
15、e。 5.3BootLoader的主要义务与典型构造框架2 为加载 stage2 预备 RAM 空间 为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必需为加载 Boot Loader 的 stage2 预备好一段可用的 RAM 空间范围。 由于 stage2 通常是 C 言语执行代码,因此在思索空间大小时,除了 stage2 可执行映象的大小外,还必需把堆栈空间也思索进来。此外,空间大小最好是 memory page 大小(通常是 4KB)的倍数。普通而言,1M 的 RAM 空间曾经足够了。将 stage2 安排到整个 RAM 空间的最顶 1MB(也即(Ram
16、End-1MB) - RamEnd)是一种值得引荐的方法。 RAM 空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start 和 stage2_end(这两个地址均以 4 字节边境对齐)。因此: stage2_endstage2_startstage2_size 5.3BootLoader的主要义务与典型构造框架另外,还必需确保所安排的地址范围的确实确是可读写的 RAM 空间,因此,必需对他所安排的地址范围进展测试。(检测算法为:test_mempage,向内存中写入恣意的数字。比如:向第一个字写入 0 x55,第 2 个字写入 0 xaa。再
17、读出来,比较是不是写入的数据.) 3 拷贝 stage2 到 RAM 中 拷贝时要确定两点:(1) stage2 的可执行映象在固态存储设备的存放起始地址和终止地址;(2) RAM 空间的起始地址。 5.3BootLoader的主要义务与典型构造框架4 设置堆栈指针 sp 堆栈指针设置是为了执行 C 言语代码作好预备。通常我们可以把 sp 的值设置为(stage2_end-4).系统的物理内存规划应该如右图2所示。 5.3BootLoader的主要义务与典型构造框架5 跳转到 stage2 的 C 入口点 在上述一切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执行了。比
18、如,在 ARM 系统中,这可以经过修正 PC 存放器为适宜的地址来实现。 5.3BootLoader的主要义务与典型构造框架5.3.2 Boot Loader 的 stage2stage2 的代码通常用 C 言语来实现。但是与普通 C 言语运用程序不同的是,在编译和链接 boot loader 这样的程序时,我们不能运用 glibc 库中的任何支持函数。这就给我们带来一个问题,那就是从那里跳转进 main() 函数呢?main() 函数的起始地址作为整个 stage2 执行映像的入口点。这样做有两个缺陷:1)无法经过main() 函数传送函数参数;2)无法处置 main() 函数前往的情况。一
19、种更为巧妙的方法是利用 trampoline(弹簧床)的概念。也即,用汇编言语写一段trampoline 小程序,并将这段 trampoline 小程序来作为 stage2 可执行映象的执行入口点。然后可以在 trampoline 汇编小程序中用 CPU 跳转指令跳入 main() 函数中去执行;而当 main() 函数前往时,CPU 执行途径显然再次回到trampoline 程序。简而言之,这种方法的思想就是:用这段 trampoline 小程序来作为 main() 函数的外部包裹(external wrapper)。 5.3BootLoader的主要义务与典型构造框架下面给出一个简单的 t
20、rampoline 程序例如(来自blob): 可以看出,当 main() 函数前往后,我们又用一条跳转指令重新执行 trampoline 程序当然也就重新执行 main() 函数,这也就是 trampoline(弹簧床)一词的意思所在。 .text.globl _trampoline_trampoline:blmain/* if main ever returns we just call it again */b_trampoline 5.3BootLoader的主要义务与典型构造框架1.初始化本阶段要运用到的硬件设备 初始化至少一个串口,以便和终端用户进展 I/O 输出信息;初始化计时器
21、等。 在初始化这些设备之前,也可以重新把 LED 灯点亮,以阐明我们曾经进入 main() 函数执行。 设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。 5.3BootLoader的主要义务与典型构造框架2 .检测系统的内存映射memory map 所谓内存映射就是指在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM 单元。(比如,在 Samsung S3C44B0X CPU 中,从 0 x0c00,0000 到 0 x1000,0000 之间的 64M 地址空间被用作系统的 RAM 地址空间。)详细的嵌入式系统往往只把 CPU 预留的全部 RAM 地址
22、空间中的一部分映射到 RAM 单元上,而让剩下的那部分预留 RAM 地址空间处于未运用形状。 由于上述这个现实,因此 Boot Loader 的 stage2 必需在它想干点什么 (比如,将存储在 flash 上的内核映像读到 RAM 空间中) 之前检测整个系统的内存映射情况,也即它必需知道 CPU 预留的全部 RAM 地址空间中的哪些被真正映射到 RAM 地址单元,哪些是处于 unused 形状的。 5.3BootLoader的主要义务与典型构造框架3 .加载内核映像和根文件系统映像 (1) 规划内存占用的规划 这里包括两个方面:(1)内核映像所占用的内存范围;2根文件系统所占用的内存范围。
23、在规划内存占用的规划时,主要思索基地址和映像的大小两个方面。 内核映像,普通将其拷贝到从(MEM_START0 x8000) 这个基地址开场的大约1MB大小的内存范围内(嵌入式 Linux 的内核普通都不操过 1MB)。为什么要把从 MEM_START 到 MEM_START0 x8000 这段 32KB 大小的内存空出来呢?这是由于 Linux 内核要在这段内存中放置一些全局数据构造,如:启动参数和内核页表等信息。根文件系统映像,那么普通将其拷贝到MEM_START+0 x0010,0000 开场的地方。假设用 Ramdisk 作为根文件系统映像,那么其解压后的大小普通是1MB。 5.3Bo
24、otLoader的主要义务与典型构造框架2从 Flash 上拷贝 由于像 ARM 这样的嵌入式 CPU 通常都是在一致的内存地址空间中寻址 Flash 等固态存储设备的,因此从 Flash 上读取数据与从 RAM 单元中读取数据并没有什么不同。用一个简单的循环就可以完成从 Flash 设备上拷贝映像的任务: while(count) *dest+ = *src+; count -= 4; 5.3BootLoader的主要义务与典型构造框架4 .设置内核的启动参数 应该说,在将内核映像和根文件系统映像拷贝到 RAM 空间中后,就可以预备启动 Linux 内核了。但是在调用内核之前,应该作一步预备
25、任务,即:设置 Linux 内核的启动参数。 Linux 2.4.x 以后的内核都期望以标志列表(tagged list)的方式来传送启动参数。启动参数标志列表以标志 ATAG_CORE 开场,以标志 ATAG_NONE 终了。每个标志由标识被传送参数的 tag_header 构造以及随后的参数值数据构造来组成。数据构造 tag 和 tag_header 定义在 Linux 内核源码的include/asm/setup.h 头文件中. 5.3BootLoader的主要义务与典型构造框架5 .调用内核 Boot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳
26、转到 MEM_START0 x8000 地址处。在跳转时,以下条件要满足: 1 CPU 存放器的设置: 2 CPU 方式: 必需制止中断IRQs和FIQs; CPU 必需 SVC 方式; 3 Cache 和 MMU 的设置:MMU 必需封锁; 指令 Cache 可以翻开也可以封锁; 数据 Cache 必需封锁; R00; R1机器类型 ID;关于 Machine Type Number, 可以参见 linux/arch/arm/tools/mach-types。 R2启动参数标志列表在 RAM 中起始基地址;5.4串口终端 在 boot loader 程序的设计与实现中,没有什么可以比从串口终
27、端正确地收到打印信息能更令人激动了。此外,向串口终端打印信息也是一个非常重要而又有效的调试手段。但是,我们经常会碰到串口终端显示乱码或根本没有显示的问题。呵斥这个问题主要有两种缘由:(1) boot loader 对串口的初始化设置不正确。(2) 运转在 host 端的终端仿真程序对串口的设置不正确,这包括:波特率、奇偶校验、数据位和停顿位等方面的设置。 5.4串口终端 此外,有时也会碰到这样的问题,那就是:在 boot loader 的运转过程中我们可以正确地向串口终端输出信息,但当 boot loader 启动内核后却无法看到内核的启动输出信息。对这一问题的缘由可以从以下几个方面来思索:
28、(1) 首先请确认他的内核在编译时配置了对串口终端的支持,并配置了正确的串口驱动程序。 (2) 他的 boot loader 对串口的初始化设置能够会和内核对串口的初始化设置不一致。此外,对于诸如 s3c44b0 x 这样的 CPU,CPU 时钟频率的设置也会影响串口,因此假设 boot loader 和内核对其 CPU 时钟频率的设置不一致,也会使串口终端无法正确显示信息。 (3) 最后,还要确认 boot loader 所用的内核基地址必需和内核映像在编译时所用的运转基地址一致,尤其是对于 uClinux 而言。假设他的内核映像在编译时用的基地址是 0 xc0008000,但他的 boot
29、 loader 却将它加载到 0 xc0010000 处去执行,那么内核映像当然不能正确地执行了。 2410初始化分析可执行文件组成及内存映射 可执行文件的组成在ADS下,可执行文件有两种,一种是.axf文件,带有调试信息,可供AXD调试工具运用.另一种是.bin文件,可执行的二进制代码文件。我们重点是讲描.bin文件的组成。我们把可执行文件分为两种情况:分别为存放态和运转态。1. 存放态存放态是指可执行文件经过fromelf产生后,在存储介质(flash或磁盘)上的分布. 此时可执行文件一般由两部分组成:分别是代码段和数据段。代码段又分为可执行代码段(.text)和只读数据段(.rodata
30、),数据段又分为初始化数据段(.data)和未初始化数据段(.bss)。可执行文件的存放态如下:+| .bss |+- 数据段| .data |+| .rodata |_| 代码段| .text |+运转态可执行文件经过装载过程, 搬入到RAM中运转, 这时候可执行文件就变成运转态。在ADS下对可执行代码各段有另一个称号:| . |+| .bss | ZI 段+- 数据段| .data | RW 段+| .rodata |_| 代码段(RO 段)| .text |+| . |装载前当可执行文件装载后, 在RAM中的分布如下:| . |+- ZI段终了地址| ZI 段 |+- ZI段起始地址|
31、保管区2 |+- RW段终了地址| RW 段 |+- RW段起始地址| 保管区1 |+- RO段终了地址| RO 段 |+- RO段起始地址| . |装载后所以装载过程必需完成把执行文件的各个段从存储介质上搬到RAM指定的位置。而这个装载过程由谁来完成呢?由我们的启动程序来完成.装载过程在ADS中,可以经过两种方式来指定可执行代码各段在RAM中的位置,一个是用armlink来指定,一种是用scatter文件来指定.RAM区的起始地址:0 x30000000.1. armlink指定代码段地址我们通常的代码,只用指定两个段开场地址, RO段的起始地址和RW段的起始地址, ZI段紧接在RW段之后.例如见该部分的. scatter指定代码段地址我们也可以经过scatter文件指定可执行文件各段的详细地址. Scatter文件如下:MYLOADER 0 x30000000;MYLOADER: 为可执行文件的称号, 可自定义;0 x3000000: 起始地址RO 0 x30000000;RO 只读代码段的称号;0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 理疗室通风整改方案
- 2023-2024学年湖南省郴州市汝城县八年级上学期期中语文试题含答案
- 敬老助老活动方案
- 湖北公务员面试模拟6
- 黑龙江行政职业能力模拟84
- 北京市申论真题2023年
- 地方公务员江苏申论86
- 二年级下册品德教案
- 湖北公务员面试模拟73
- 江西申论模拟4
- 数学建模论文-对长江流域水质状况的评估及其发展预测模型
- 2024年矿业权评估师考试(重点)题库200题(含答案解析)
- 中药细辛课件
- 2023-2024学年山东省淄博市张店区八年级(上)期中英语试卷(五四学制)
- 《屠呦呦人物介绍班会》班会课件
- 2024年云南省大数据限公司招聘81人高频考题难、易错点模拟试题(共500题)附带答案详解
- 护士服务规范与礼仪(护士礼仪服务规范)培训课件
- 质量通病防治措施手册
- 2024入团考试题库含答案(完整版)
- MOOC 旅游学概论-中国地质大学(武汉) 中国大学慕课答案
- 围手术期血糖管理指南
评论
0/150
提交评论