ARMLinux启动过程分析_百度文库.

合集下载

ARMLinux启动过程分析

ARMLinux启动过程分析
分, 它可以做为L n x 系统 中文件 和数 据 的存储区域 , iu 通 于该 存储 器 的最前端 , 以系统 上电或复位 后执行 的第一 所 常它还包 括系统 配置文件 和运 行应 用软件所 需要的库 。 应 段 程序 便是 b ola e 。 o t d r 而因为存储 b ola e 的存 储 o o to d r
Bo to d r o l a e 是嵌 入 式 系 统 的引导 加 载 程 序 , 是 系 它 L n s 统 上 电后运 行 的第一段 程 序, iu 其作 用类似 于 PC 机 上 的
T r ad 在 1 9 年开 发出来 的, 后在GNU的支持 下, ov ls 9 1 之
B1 。 完成 对系统 的初始 化任 务之 后, 0S 在 它会将 非 易失性 L n x 获得了巨大的发展 。虽然 L n x 在 桌面 P 机 存 储器 ( iu iu C 通常是 Fah D C 等) l 或 0 s 中的Ln x 内核 拷贝 iu 上 的普及程 度远 不及微软 的 Wid ws操作 系统 , no 但它的 到 RAM 中去 , 然后跳 转到 内核的第一 条指 令处继 续执 发 展速 度 之快 、 用户数 量的 日益增 多 , 是微软 所 不能 轻 行, 也 从而 启动 L n x 内核。 iu 视 的。 而近 些年来 L n x 在嵌 入式领 域 的迅猛 发 展, iu 更 由此可见, o t a e 和 L n x 内核有着密不可分 b ol d r o iu 是给 L n x 注入 了新 的活力。 iu 的联 系, 想清 楚的了解 L n x内核的启动 过程 , 要 iu 我们必
计算机 x
姚成强 木
【 内容 摘要 】 嵌 入 式 Ln x 的可移植性使得 我们可以在 各种 电子产品上看到 它的身影。 iu 对于

嵌入式linux系统的启动流程

嵌入式linux系统的启动流程

嵌入式linux系统的启动流程
嵌入式Linux系统的启动流程一般包括以下几个步骤:
1.硬件初始化:首先会对硬件进行初始化,例如设置时钟、中
断控制等。

这一步骤通常是由硬件自身进行初始化,也受到系统的BIOS或Bootloader的控制。

2.Bootloader引导:接下来,系统会从存储介质(如闪存、SD
卡等)的Bootloader区域读取引导程序。

Bootloader是一段程序,可以从存储介质中加载内核镜像和根文件系统,它负责进行硬件初始化、进行引导选项的选择,以及加载内核到内存中。

3.Linux内核加载:Bootloader会将内核镜像从存储介质中加载到系统内存中。

内核镜像是包含操作系统核心的一个二进制文件,它由开发者编译并与设备硬件特定的驱动程序进行连接。

4.内核初始化:一旦内核被加载到内存中,系统会进入内核初
始化阶段。

在这个阶段,内核会初始化设备驱动程序、文件系统、网络协议栈等系统核心。

5.启动用户空间:在内核初始化完毕后,系统将启动第一个用
户空间进程(init进程)。

init进程会读取并解析配置文件(如
/etc/inittab)来决定如何启动其他系统服务和应用程序。

6.启动其他系统服务和应用程序:在用户空间启动后,init进
程会根据配置文件启动其他系统服务和应用程序。

这些服务和应用程序通常运行在用户空间,提供各种功能和服务。

以上是嵌入式Linux系统的基本启动流程,不同的嵌入式系统可能会有一些差异。

同时,一些特定的系统也可以添加其他的启动流程步骤,如初始化设备树、加载设备固件文件等。

全志平台linux启动流程分析全志平台linux启动流程分析

全志平台linux启动流程分析全志平台linux启动流程分析

全志平台linux启动流程分析全志平台linux启动流程分析一、BROM阶段机器上电之后会执行固化在BROM里面的一段引导程序,这个程序会依次遍历所有支持的启动介质,直到找到第一个支持的。

目前支持的启动介质是sd/mmc卡、nand和spinor。

当程序初始化启动介质成功后,就从固定位置读入Bootloader的Boot0到SRAM,然后跳到SRAM执行。

下面展示了BROM的执行流程二、Bootloader阶段Bootloader是全志平台上从小系统一直沿用下来的内核加载器,在这里的主要职责是加载U-Boot到DRAM。

Bootloader分为两个部分,分别是Boot0和Boot1。

Boot0:初始化DRAM,加载Boot1到DRAM;Boot1:调频,加载U-Boot到DRAM;为什么Bootloader要划分成Boot0和Boot1两个部分?因为在Bootloader阶段,使用的SRAM大小是32KB,除去C运行环境需要的栈空间,可用的空间在24KB左右,这点不足以载入整个Bootloader。

因此,需要将Bootloader划分成两个部分,尽可能将繁重的任务放在Boot1执行,这个情况类似于Linux系统中断执行环境的上半部和下半部。

1. boot0执行过程2. boot1的执行过程Boot1会进行一次系统调频,将CPU的频率调到用户在sys_config1.fex target段配置的boot_clock。

如何在Boot1让机器进入升级模式?(1)按住power键,再按任意键3下;(2)接上串口启动,进入Boot1后在键盘输入2;如何替换Bootloader分区的内容?接上串口启动,进入Boot1后在键盘输入1,USB会挂载Bootloader分区到PC上,卷标是“Volume”,替换掉相关的文件之后重启机器即可生效。

Boot1会检测低电关机,以及插入火牛开机的情况进入关机程序。

后者需要在sys_config1.fex里配置。

Linux 内核启动分析

Linux 内核启动分析

Linux 内核启动分析1. 内核启动地址1.1. 名词解释ZTEXTADDR解压代码运行的开始地址。

没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。

这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。

Start address of decompressor. here's no point in talking about virtual or physical addresses here, since the MMU will be off at the time when you call the decompressor code. Y ou normally call the kernel at this address to start it booting. This doesn't have to be located in RAM, it can be in flash or other read-only or read-write addressable medium.ZRELADDR内核启动在RAM中的地址。

压缩的内核映像被解压到这个地址,然后执行。

This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:__virt_to_phys(TEXTADDR) == ZRELADDRThe initial part of the kernel is carefully coded to be position independent.TEXTADDR内核启动的虚拟地址,与ZRELADDR相对应。

一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。

arm版本linux系统的启动流程

arm版本linux系统的启动流程

arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。

在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。

本文将详细介绍ARM版本Linux系统的启动流程。

一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。

在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。

引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。

二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。

内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。

内核需要设置异常向量表,以便正确处理异常。

2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。

3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。

init进程是系统中所有其他进程的父进程,负责系统的初始化工作。

三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。

在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。

设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。

它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。

四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。

启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。

2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。

优选(VR虚拟现实)ARMLinux启动过程分析

优选(VR虚拟现实)ARMLinux启动过程分析

优选(VR虚拟现实)ARMLinux启动过程分析ARM Linux启动过程分析赵楠本章学习目标:●了解Linux结构及平台属性●了解bootloader的相关知识●熟悉并掌握启动过程摘要:从嵌入式系统到超级服务站,嵌入式Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。

Linux 是一个完整通用的Unix 类分布式操作系统,它的结构紧凑、功能强、效率高、可移植性好且在Internet 上可自由取用。

对于不同体系结构的处理器来说Linux的启动过程也有所不同。

本文以S3C2410 ARM处理器为例,详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。

关键词:ARM Linux bootloader 启动过程Abstract: from the embedded system to super service station, embedded Linux portability allows us to various electronic products in the form of seeing it. Linux is a complete general Unix class distributed operating system, it's structure compact, the function is strong, high efficiency, good portability and in the Internet can be free to take. For different system structure of the processor is the start of the Linux process is also different. Based on the ARM processor S3C2410 as an example, the paper analyses system after the execution flow of electric bootloader and ARM Linux start-up process.Keywords: ARM Linux bootloader start-up process1. 引言Linux 最初是由瑞典赫尔辛基大学的学生Linus Torvalds在1991 年开发出来的,之后在GNU的支持下,Linux 获得了巨大的发展。

ARM的启动分析详解及应用

ARM的启动分析详解及应用

ARM的启动分析详解及应用ARM是一款广泛应用于嵌入式系统和移动设备的处理器架构。

在ARM的启动过程中,主要涉及到硬件初始化、加载引导程序和启动操作系统等步骤。

下面将对ARM的启动过程进行详细分析,并讨论其在实际应用中的应用。

硬件初始化:在ARM的启动过程中,首先需要对硬件进行初始化。

这包括对中央处理器(CPU)、存储器、外设等进行初始化操作。

例如,初始化CPU的控制和配置寄存器,设置存储器的访问模式和权限等。

硬件初始化的目的是确保系统处于一个稳定的状态,为后续的操作打下基础。

加载引导程序:引导程序是ARM启动的关键部分,它负责初始化系统环境和加载操作系统的镜像文件。

引导程序通常位于启动设备的引导扇区或者特定的存储器地址中。

在ARM中,引导程序可以是U-Boot、Das U-Boot或是其他自定义的引导程序。

加载引导程序的方式可以是通过串口、以太网或者其他类似的介质。

引导程序的主要功能是初始化设备和外设,配置内存和中断控制器等。

它会加载操作系统的镜像文件到内存中,并跳转到操作系统的起始地址,从而将控制权交给操作系统。

启动操作系统:在引导程序加载并跳转到操作系统的起始地址后,操作系统开始运行。

操作系统负责管理硬件资源、提供系统服务和支持应用程序的运行。

常见的ARM操作系统有Linux、Android等。

ARM的启动分析步骤在实际应用中具有重要的意义。

首先,通过硬件初始化可以确保系统处于一个稳定的状态,避免因为硬件问题导致系统崩溃或运行不正常。

其次,加载引导程序可以实现自定义的系统启动流程和初始化操作,满足特定应用需求。

最后,启动操作系统可以为用户提供高效、稳定的系统环境,并支持各种应用程序的运行。

在实际的应用中,ARM的启动分析步骤具有广泛的应用。

例如,嵌入式系统可以通过自定义的引导程序来实现特定的启动流程和初始化操作,以满足设备的需求。

移动设备则可以通过加载引导程序和启动操作系统来提供稳定的系统环境和良好的用户体验。

第8章 基于ARM的Linux内核移植

第8章  基于ARM的Linux内核移植

(2)编译测试参考板的Linux内核 为了测试Linux对参考板的支持情况,最好配置编 译Linux内核,在目标参考板上运行测试一下。 对于交叉开发来说,首先应在顶层Makefile中设置 ARCH、CROSS_COMPILE和EXTRA_VERSION 变量,然后才能选择配置指定的体系结构平台。 ARM平台的例子如下 ARCH := arm CROSS_COMPILE := arm-linuxEXTRA_VERSION :=
8.1.2 开发板内核移植 对于内核移植工作来说,主要是添加开发板初始 化和驱动程序的代码。这部分代码大部分跟体系 结构相关,在arch目录下按照不同的体系结构管理 ,下面以ARM S3C2410平台为例,分析内核代码 移植过程。 Linux2.6内核已经支持S3C2410处理器的多种硬件 板,我们可以参考SMDK2410参考板,来移植开 发板的内核
真正系统平台号的定义位置在arch/arm/tools/mach-types 文件。 #machine_is_xx CONFIG_xx MACH_TYPE_xx number smd2410 ARCH_SMDK2410 SMDK2410 193 arch/arm/tools/mach-types中每一行定义一个系统平台号 。“machine_is_xxx”是用来判断当前的平台号名称 ;CONFIG_xxxx是在内核配置时生成的; MACH_TYPE_xxx是系统平台号的定义;number是系 统平台的值。
#include/asm/mach/arch.h
#define MACHINE_START(_type,_name) const struct machine_desc _mach_desc_##_type \ _attribute_((_section_(“.init”))) = { \ .nr = MACH_TYPE_##_type,\ .name = name, … #define MACHINE_END };
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM Linux启动过程分析一个嵌入式Linux 系统从软件角度看可以分为四个部分[1]:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。

其中 bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用 Linux 内核。

Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。

根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。

应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。

如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。

从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。

Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。

在嵌入式系统开发的过程中,很大一部分精力都是花在bootloader 和 Linux 内核的开发或移植上。

如果能清楚的了解 bootloader 执行流程和 Linux的启动过程,将有助于明确开发过程中所需的工作,从而加速嵌入式系统的开发过程。

而这正是本文的所要研究的内容。

2. Bootloader 2.1 Bootloader的概念和作用Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的BIOS。

在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。

由此可见,bootloader 和 Linux 内核有着密不可分的联系,要想清楚的了解 Linux内核的启动过程,我们必须先得认识bootloader的执行过程,这样才能对嵌入式系统的整个启过程有清晰的掌握。

2.2 Bootloader的执行过程不同的处理器上电或复位后执行的第一条指令地址并不相同,对于 ARM 处理器来说,该地址为 0x00000000。

对于一般的嵌入式系统,通常把 Flash 等非易失性存储器映射到这个地址处,而 bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 bootloader。

而因为存储 bootloader的存储器不同,bootloader的执行过程也并不相同,下面将具体分析。

嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Flash 又分为 Nor Flash 和Nand Flash 两种。

它们之间的不同在于: Nor Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。

而Nand Flash并不支持XIP,所以要想执行 Nand Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。

实际应用中的 bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置 Linux 启动参数,给 Flash 分区等;也可以设计得很简单,只完成最基本的功能。

但为了能达到启动Linux 内核的目的,所有的 bootloader都必须具备以下功能:BR> 1 初始化RAM 因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用Linux内核做好准备。

初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。

2 初始化串口串口在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户交互的方式之一。

Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。

虽然它并不是 bootloader 必须要完成的工作,但是通过串口输出信息是调试 bootloader 和Linux 内核的强有力的工具,所以一般的 bootloader 都会在执行过程中初始化一个串口做为调试端口。

3 检测处理器类型Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。

Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。

4 设置Linux启动参数Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。

目前传递启动参数主要采用两种方式:即通过 struct param_struct 和struct tag(标记列表,tagged list)两种结构传递。

struct param_struct 是一种比较老的参数传递方式,在 2.4 版本以前的内核中使用较多。

从 2.4 版本以后 Linux 内核基本上采用标记列表的方式。

但为了保持和以前版本的兼容性,它仍支持 struct param_struct 参数传递方式,只不过在内核启动过程中它将被转换成标记列表方式。

标记列表方式是种比较新的参数传递方式,它必须以 ATAG_CORE 开始,并以ATAG_NONE 结尾。

中间可以根据需要加入其他列表。

Linux内核在启动过程中会根据该启动参数进行相应的初始化工作。

5 调用Linux内核映像Bootloader完成的最后一项工作便是调用 Linux内核。

如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。

但由于在Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行。

不论哪种情况,在跳到 Linux 内核执行之前 CUP的寄存器必须满足以下条件:r0=0,r1=处理器类型,r2=标记列表在 RAM中的地址。

3. Linux内核的启动过程在bootloader将Linux 内核映像拷贝到RAM 以后,可以通过下例代码启动Linux 内核:call_linux(0, machine_type, kernel_params_base。

其中,machine_tpye 是bootloader检测出来的处理器类型,kernel_params_base 是启动参数在RAM 的地址。

通过这种方式将 Linux 启动需要的参数从 bootloader传递到内核。

Linux 内核有两种映像:一种是非压缩内核,叫Image,另一种是它的压缩版本,叫zImage。

根据内核映像的不同,Linux 内核的启动在开始阶段也有所不同。

zImage 是 Image经过压缩形成的,所以它的大小比 Image 小。

但为了能使用 zImage,必须在它的开头加上解压缩的代码,将 zImage 解压缩之后才能执行,因此它的执行速度比 Image 要慢。

但考虑到嵌入式系统的存储空容量一般比较小,采用zImage 可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。

所以一般的嵌入式系统均采用压缩内核的方式。

对于 ARM 系列处理器来说,zImage 的入口程序即为 arch/arm/boot/compressed/head.S。

它依次完成以下工作:开启MMU 和Cache,调用decompress_kernel(解压内核,最后通过调用call_kernel(进入非压缩内核Image 的启动。

下面将具体分析在此之后Linux 内核的启动过程。

3.1 Linux内核入口Linux 非压缩内核的入口位于文件/arch/arm/kernel/head-armv.S 中的 stext 段。

该段的基地址就是压缩内核解压后的跳转地址。

如果系统中加载的内核是非压缩的Image,那么bootloader将内核从Flash中拷贝到RAM 后将直接跳到该地址处,从而启动 Linux 内核。

不同体系结构的 Linux 系统的入口文件是不同的,而且因为该文件与具体体系结构有关,所以一般均用汇编语言编写。

对基于ARM 处理的Linux 系统来说,该文件就是head-armv.S。

该程序通过查找处理器内核类型和处理器类型调用相应的初始化函数,再建立页表,最后跳转到start_kernel(函数开始内核的初始化工作。

检测处理器内核类型是在汇编子函数__lookup_processor_type中完成的。

通过以下代码可实现对它的调用:bl __lookup_processor_type。

__lookup_processor_type调用结束返回原程序时,会将返回结果保存到寄存器中。

其中r8 保存了页表的标志位,r9 保存了处理器的 ID 号,r10 保存了与处理器相关的 struproc_info_list 结构地址。

检测处理器类型是在汇编子函数 __lookup_architecture_type 中完成的。

与__lookup_processor_type 类似,它通过代码:“bl __lookup_processor_type”来实现对它的调用。

该函数返回时,会将返回结构保存在r5、r6 和 r7 三个寄存器中。

其中 r5 保存了 RAM 的起始基地址,r6 保存了 I/O基地址,r7 保存了 I/O的页表偏移地址。

当检测处理器内核和处理器类型结束后,将调用__create_page_tables 子函数来建立页表,它所要做的工作就是将 RAM 基地址开始的 4M 空间的物理地址映射到 0xC0000000 开始的虚拟地址处。

对笔者的 S3C2410 开发板而言,RAM 连接到物理地址0x30000000 处,当调用__create_page_tables 结束后0x30000000 ~0x30400000 物理地址将映射到0xC0000000~0xC0400000 虚拟地址处。

当所有的初始化结束之后,使用如下代码来跳到 C 程序的入口函数start_kernel(处,开始之后的内核初始化工作:b SYMBOL_NAME(start_kernel3.2 start_kernel函数start_kernel是所有 Linux 平台进入系统内核初始化后的入口函数,它主要完成剩余的与硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个Linux 内核便启动完毕。

相关文档
最新文档