ARM启动原理和启动过程分析

这篇具有很好参考价值的文章主要介绍了ARM启动原理和启动过程分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

简单介绍ARM设备启动原理和启动过程,帮助了解一些嵌入式相关理论基础知识。此文章是看韦东山老师的uboot启动课程总结的。

一 几种存储介质的介绍

1 SRAM:SRAM(Static Random Access Memory),即静态随机存取存储器。它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。SRAM主要用于二级高速缓存(Level2 Cache)。它利用晶体管来存储数据。与DRAM相比较,SRAM的速度快,但在相同面积中SRAM的容量要比其他类型的内存小。部分ARM9的CPU内部都集成有一个SRAM。

        这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用,这对我们后面讨论启动过程必不可少,比如s3c2440这颗CPU上内部这个SRAM大小为4KB,datasheet里把它叫做Stepping Stone,江湖人称“起步石”。

2 SDRAM:同步动态随机存储器,同步是指 Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写,用作内存。我们常说的DDR就是SDRAM家族中的一种。SDRAM使用需要先初始化才可以使用,不能直接使用。

3 NORFLASH:NOR FLASH地址线和数据线分开,有地址和控制信号,NORFLASH像内存一样是直接挂在系统总线上的,这样有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问NORFLASH上存储的内容,同时他还支持XIP(即片上执行,不用将代码搬到内存中,直接在NORFLASH上就能运行)。 此处说的在片上运行,只是代码部分在片上运行,程序中的变量还是要重定位到SDRAM中去。后面会提到。

4 NANDFLASH:NANDFLASH它并不是直接挂载系统总线上,而是通过NANDFLASH控制器(这个一般集成在CPU内部)来完成读写操作的。如果我们把NORFLASH的那种寻址方式叫直接寻址的话(不是汇编里的那个直接寻址,这里指CPU能够直接通过地址线访问存储器的存储单元,CPU可以直接访问NORFLASH,不能直接访问NANDFLASH),那么这里的NANDFLASH就是间接寻址(这里需要NANDFLASH控制器来寻址)。所以我们在使用NANDFLASH之前,一定要初始NANDFLASH控制器。

5 eMMC:eMMC = Nand FLASH + 控制器 + 标准封装接口

它的一个明显优势是在封装中集成了一个控制器,提供标准接口并管理闪存。eMMC和Nand flash 之间的区别,主要是:在组成结构上,eMMC存储芯片简化了存储器的设计,将Nand Flash芯片和控制芯片以MCP技术封装在一起,省去零组件耗用电路板的面积,同时也让手机厂商或是计算机厂商在设计新产品时的便利性大大提高。而Nand Flash仅仅只是一块存储设备,若要进行数据传输的话,只能通过主机端的控制器来进行操作。

6 UFS:UFS = Nand + 控制器 + 标准封装接口

UFS最新标准是UFS4.0,它是eMMC的进阶版,最大带宽可以达到23.2Gbps,读取速度高达4200MBps,写入速度高达2800MBps。目前,大多数5G手机的机型都用上了UFS 储存方案

二 NOR FLASH与NAND FLASH的性能区别

●NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 
●NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用●NAND的困难在于flash的管理和需要特殊的系统接口。
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5s快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少。

三 启动方式

 1 从XIP(Excute in chip)设备启动,比如从NOR启动,NORFLASH基地址被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是原来的地址0x40000000)。然后CPU从0x00000000开始执行(也就是在NORFLASH中执行)。这就是所谓的片上执行,但是程序中的需要写的变量,是无法进行修改的,所以这部分内容也需要重定位到SDRAM中执行。

2 从非XIP(Excute in chip)设备启动,比如从NAND启动(或者SD卡等),CPU会自动(这里的自动需要解释下,并不是我们所谓的自己搬运,而是从非XIP设备启动的芯片一般会内置一块区域BOOTROM,用来存储一段程序,一级加载)从NANDFLASH中读取前4KB(具体看SOC配置)的数据内容(SPL,二级加载)放置在片内SRAM里,同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。CPU是从0x00000000开始执行,也就是NAND FLASH里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把NANDFLASH中大代码复制到RAM(一般是SDRAM)中去执行。SPL程序的作用就是搬运用户代码到SDRAM中。

arm启动流程,arm linux 学习,arm开发,linux

       从上图可以大概分析下启动过程和启动原理。

启动方式1:

arm启动流程,arm linux 学习,arm开发,linux

 1 开机上电后BOOTROM中程序运行

 2 BOOTROM程序将SPL程序拷贝到片内SRAM

3 SPL程序运行,初始化DDR

4 SPL程序将uboot程序拷贝到片外SDRAM(DDR)

5 uboot程序运行,重定位

6 重定位,搬运到SDRAM另外区域

7 修改地址,运行

启动方式2:

arm启动流程,arm linux 学习,arm开发,linux       

1 开机上电后BOOTROM中程序运行

2 BOOTROM程序功能强大,读取DDR配置文件初始化DDR,然后将uboot程序拷贝到片外SDRAM(DDR)

3 uboot程序运行,重定位

4 重定位,搬运到SDRAM另外区域

5 修改地址,运行

以上便是ARM常用的两种启动方式。以及他们的区别。

另外,U-Boot有一个Download to SDRAM& Run这个选项,这个选项是把程序下载到SDRAM然后跳转到SDRAM开始执行。所以在做实验的时候,要考虑是要下载到NORFLASH中还是NANDFLASH中还是SDRAM中运行,代码是稍稍有点区别的。比如要下载到SDRAM中程序,它的开始地址是0X30000000,如果程序中有绝对地址跳转,就要考虑更改地址的值到底是多少,当然了,b和bl这样的相对跳转是没有影响的。如果要下载到NORFLASH中,它的开始地址是0X00000000,而且可以直接在NORFLASH中运行。如果是在NANDFLASH中运行,就要考虑程序是不是大于了4K。文章来源地址https://www.toymoban.com/news/detail-751615.html

到了这里,关于ARM启动原理和启动过程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)

    Redis Cluster提供了一套完整的功能技术,使得Redis能够以分布式的方式运行,并具备高可用性、容错性和扩展性。通过自动发现、主从选举、在线分片等机制,Redis Cluster能够自动管理集群中的节点,并保证数据的一致性和可靠性。同时,基于配置文件和转向机制,Redis Cluster能

    2024年02月14日
    浏览(37)
  • 完全理解ARM启动流程:Uboot-Kernel

    内容共计5W+字数,但是我还是很多地方说的不够尽兴。那么下次聊! bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。 PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例

    2024年04月15日
    浏览(39)
  • Android framework学习指南之Launcher启动过程原理分析

    Launcher是一个用来显示系统中已经安装的应用程序的应用程序,Launcher 在启动过程中会请求PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序,它的作

    2024年02月03日
    浏览(37)
  • ARM64函数调用流程分析

    ARM64 程序调用标准 下图是介绍一个简单函数调用的示例,在该示例中简单介绍了栈的使用。 2.1.1 main的C代码实现 2.1.2 main函数对应汇编及其分析 0000000000000114 main: main函数的入口 114: a9be7bfd stp x29, x30, [sp, #-32]! 将sp = sp - 32,为main函数开一个32Byte的栈空间,然后将x29(FP),X30(LR)寄

    2024年02月11日
    浏览(32)
  • qemu-基础篇——ARM 链接过程分析(六)

    这里新建五个文件 global_bss_file.c:定义了两个未初始化的全局变量 global_bss_file.c:定义了两个初始化的全局变量 global_function_file.c:定义了一个函数,函数实现传入的两个参数相加功能 global_rodata_file.c:定义了两个只读常量,并初始化 main.c:使用上述定义的变量和函数 根据上

    2024年02月04日
    浏览(32)
  • IMX6ULL ARM Linux开发板SD卡启动,SD卡的分区与分区格式化创建

    一、确定TF卡挂载到ubuntu上的设备名称及分区情况 1. 在ubuntu不接入TF卡的情况下, 使用df -lh /dev/sd*命令查看当前\\\"/dev/sd开头\\\"的设备。 2.将TF卡接入到ubuntu,再次使用df命令,进行查看,多出来的设备即是TF卡挂载到ubuntu的设备名称 如图所示,多出来的/dev/sdb1 /dev/sdb2即为TF卡的

    2024年02月04日
    浏览(35)
  • linux 内核ARM32启动

    基于linux4.19内核翻译理解 为了启动ARM Linux,您需要一个引导加载程序,它是在主内核之前运行的小程序。 引导加载程序被期望初始化各种设备,并最终调用Linux内核,向内核传递信息。 基本上,引导加载程序应该提供(至少)以下内容: 1.设置和初始化RAM。 2.初始化一个串

    2024年01月18日
    浏览(36)
  • ARM uboot 启动 Linux 内核

    此处,我使用的是九鼎提供的 uboot : 进入 uboot 的 sd_fusing 目录,执行命令烧写 uboot : ./sd_fusing.sh /dev/sdb 。 按任意键,进入 uboot 命令行: 将 Linux kernel 拷贝到 30008000。

    2024年02月11日
    浏览(37)
  • ARM Linux 内核启动1 —— 汇编阶段

    1、Makefile 分析 (1) kernel 的 Makefile 写法和规则等,和 uboot 的 Makefile 是一样的,甚至 Makefile 中的很多内容都是一样的。 (2) kernel 的 Makefile 比 uboot 的 Makefile 要复杂,这里我们并不会一行一行的详细分析。 (3) Makefile 中只有一些值得关注的会强调一下,其他不强调的地方暂时可以

    2024年02月12日
    浏览(45)
  • ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs

    懒人方式: 直接去方锐/qemu克隆项目,执行script目录的脚本即可 1. build_env.sh安装环境 2. build_rootfs.sh 生成rootfs 3. build_kernel.sh编译kernel 4. qemu_run.sh开始调试 2.1busybox代码的下载编译 Busybox下载地址:https://busybox.net/downloads/ Download 1.36.0 Busybox 默认会安装到 ./_install 目录下 制作ro

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包