一、嵌入式系统上电,程序在CPU、Flash、DDR中的运行过程

CPU总线接口图

首先,程序以机器码的形式,即二进制码的形式存在FLASH中;

上电后,CPU通过控制器将待运行的程序从FLASH中读入内存中;

代码在内存中运行时,控制器将需要计算的数据存入寄存器中;

运算器从寄存器中读取数据进行运算,并将结果存入寄存器中;

控制器将寄存器中的结果读入内存中;

由此,形成一个闭环的程序运行过程。

以代码段举例说明:

系统开始运行的时候,程序首先躺在flash里面,分为3个段,代码段、数据段,bss段,控制器读取到CPU内部通用寄存器,cpu的机制会在内存中给他们各自分配好内存空间。

比如代码段在上电后代码的执行过程:

第一步,CPU对内部的BOOT ROM进行直接读取并解析指令后初始化部分DDR,指令会自动在内存上分配代码段;

第二步,CPU上的Flash控制器将flash上的代码拷贝到内存的代码段,然后CPU读取并执行解析代码,此时CPU的运算器会工作,在DDR的堆和栈中不断的存取数据,再根据解析下一行或下几行的代码的要求,访问指定地址的空间,去存放数据。因为要处理数据,放入内存中运行时,会有在DDR中多出2部分(堆和栈)用来处理数据。

BOOT ROM:BOOT ROM是CPU当中的一段启动代码。因为DDR和Flash其实也是外设,他们也需要一段代码去初始化他们的寄存器,使他们能被使用,所以一般会有一段启动代码在CPU,CPU上电就会运行里面的代码,这是硬件设计好的。

二、嵌入式设备上电到应用层的过程步骤:

1、上电,CPU运行

嵌入式设备上电后,CPU开始运行,通常CPU会从某一个固定的物理地址开始运行,这个物理地址一般是Flash芯片的起始物理地址。Flash芯片的最初一段通常存放的是Bootloader,于是CPU就会开始运行Bootloader的代码。

那CPU是如何读取Flash上的数据的呢?

我们知道CPU可以读写Flash上的数据,但是不能直接执行Flash上的指令,CPU通常只能执行内存中的指令,那么CPU刚开始运行时怎样去执行Flash上的指令呢?这里分两种情况,Flash芯片主要分为两种,一种是Nor Flash,另一种是Nand Flash,Nor Flash具有可以直接在Flash芯片上执行指令的特点。如果嵌入式设备采用的是Nor Flash,那就比较简单了,CPU可以直接运行在Nor Flash上的指令。如果采用的是Nand Flash呢,怎么办?目前主要有两种方法,一种方法是Flash控制器能够把Nand Flash的前4k数据搬到4k的内部RAM中,并设置CPU从这个内部RAM的起始地址开始启动执行。另一种方法是Flash控制器能够把Nand Flash的前4k数据的地址映射到系统总线的某个地址上,并设定CPU从这个地址开始启动执行。这两种方法都是硬件来完成的。

2、Bootloader对于开发板资源的初始化

Bootloader分为两个部分,第一部分是汇编代码且不做压缩,第二部分是C代码且有压缩的。Bootloader开始执行时,第一部分汇编代码先负责初始化CPU、PLL、DDR、Cache等硬件,让CPU和内存能够稳定运行,然后解压第二部分的Image,并拷贝到到内存执行。第二部分C代码完成串口、flash、网口等驱动的加载,并构建一个shell环境来接受用户输入。注意,在整个Bootloader运行其间CPU的MMU是没有被初始化的,所有的地址访问都是采用物理地址直接访问的。

3、 Bootloader拷贝内核镜像,为内核的运行准备环境

在完成Bootloader初始化后,根据代码中设定的内核区物理地址,Bootloader会把内核区压缩后的Linux镜像拷贝到内存中并解压。同时准备好内核的启动参数,如:console=ttyS0,115200 root=31:2 mtdparts=ar7100-nor0:196608(boot),835236(kernel),-(rootfs),这里主要是把Bootloader里设置的MTD分区信息传递给内核,还有需要加载的根文件系统。最后跳转到内核入口开始运行。

4、 Linux内核对于其各个子系统的和MMU的初始化

Linux内核代码开始执行,会先进行内核各个子系统初始化,并完成对MMU的初始化。MMU是CPU中的一个单元,它跟操作系统一起配合完成从虚拟地址到物理地址的转换。如果CPU带有MMU单元,则CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,这个地址称为物理地址。在这个过程中Linux内核会维护页表结构,它保存着内核和进程的虚拟地址到物理地址的映射,而MMU则通过Linux内核页表去完成地址翻译和保护工作。

5、内核挂载根文件系统

接下来Linux内核会挂载根文件系统,要挂载的根文件系统是通过内核启动参数来获取的。这里有一个问题,根文件系统通常表示为一个Linux文件系统下的某个MTD设备,但在加载根文件系统前Linux还没有一个文件系统,那它怎样通过访问文件系统中的MTD设备来加载根文件系统呢?事实上,根文件系统的安装分为两个阶段,首先Linux内核会安装一个特殊的RootFS文件系统,该文件系统仅提供一个作为初始安装点的空目录,然后Linux内核再在空目录上安装一个真正的根目录。Linux内核对Flash的访问都是通过MTD子系统来进行的,它抽象了对于各种Flash设备的访问,提供统一的接口。

6、内核对于各种驱动程序的初始化

Linux内核继续初始化各种类型的驱动程序,完成之后会启动第一个应用程序,它的进程ID为1。这个应用程序可以由内核启动参数传入,如果没有则会默认执行/sbin/init。init进程会读取配置文件/etc/inittab,根据配置文件的内容它会完成两个工作,执行rcS和启动Shell。至此,Linux系统已经启动完成,给用户提供了一个Shell的交互环境,后续的行为就取决于用户的输入或者系统特定应用的加载。

参考文章:

cpu、flash、DDR(内存)、冯诺伊曼、哈佛之间的关系

嵌入式硬件上电后,程序的运行过程剖析(CPU、FLASH、内存)

浅析嵌入式Linux系统的构成和启动过程

嵌入式系统上电,程序的运行过程相关推荐

  1. hello程序的运行过程-从计算机系统角度

    hello程序的运行过程-从计算机系统角度 1.gcc编译器驱动程序读取源程序文件hello.c,并将它翻译成一个可执行目标文件hello.翻译过程分为四个阶段:预处理阶段,编译阶段,汇编阶段,链接阶 ...

  2. 基于IAP和USB技术的嵌入式系统应用程序升级

    对于内含IAP功能的嵌入式微控制器提出基于IAP和USB技术的系统应用程序升级的新方法.U盘被用作程序代码的存储设备,将微控制器的存储器Flash和SRAM进行有效的区间分配,经外部扩展接口USB,微 ...

  3. 学习Java第一天:1、Java是什么?2、面向对象的编程思想的特点 3、Java的开发工具 4、安装JDK和配置环境变量 5、Java程序的运行过程 6、Java语言的特点

    目录 1.Java是什么? 2.面向对象的编程思想的特点 3.Java的开发工具 4.安装JDK和配置环境变量 5.Java程序的运行过程 6.Java语言的特点 1.Java是什么? java是一门 ...

  4. idea调试怎么跳出循环_使用IDEA的Debug调试功能,查看程序的运行过程

    Debug追踪,使用IDEA的断点调试功能,查看程序的运行过程 知乎视频​www.zhihu.com 1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 ...

  5. 小程序执行运行过程原理_活性污泥法基本原理、净化反应过程、工艺类型和运行过程中存在的问题...

    ↑ 点击上方"表面活性剂平台"关注我们 活性污泥法实质上是天然水体自净作用的人工强化,能从污水中去除溶解态和胶体态的可生物降解有机物以及能被活性污泥吸附的悬浮固体和其他物质,具有对 ...

  6. java语言执行过程_Java程序的运行过程(执行流程)分析

    万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程.从<使用记事本编写运行Java程序>一节的案例可以看出,Java 程序的运行必须经过编写.编译和运行 3 ...

  7. 小程序执行运行过程原理_分享 | 还在焦虑等成绩?成绩小助手了解下

    在咱们北林,期末考试后,我们往往不知道具体什么时候出成绩,以致我们隔三岔五地就要登一次系统,看看成绩是否更新,甚是麻烦. 为了缓解同学们反复查询的苦恼和焦虑的心情,我用python编写了一个小程序「成 ...

  8. Java教程:Java程序的运行过程(执行流程)分析

    Java教程万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程. 本篇文章由 泉州SEO www.234yp.com 整理发布,Java教程 www.234yp.com/ ...

  9. Java程序的运行过程(执行流程)分析

    Java 程序的运行必须经过编写.编译和运行 3 个步骤: 1.编写:是指在 Java 开发环境中进行程序代码的输入,最终形成后缀名为 .java 的 Java 源文件. 2.编译:是指使用 Java ...

  10. Windows 窗口程序的运行过程

    如图所示: 操作系统角度: Windows内核中维护了两个消息队列:系统消息队列 程序消息队列(采用虚拟内存,故对一个程序来说,只能看到自己的那份消息队列里的内容) 用户的各种I/O操作,先被操作系统 ...

最新文章

  1. [9.28模拟] good
  2. 免费音乐接口,当时写音乐播放器没资源,今天特意用nodejs写了一个,并布署到了cloudfo......
  3. 科大星云诗社动态20210504
  4. 超硬核!11 个非常实用的 Python 和 Shell 拿来就用脚本实例!
  5. 【Tool】Augmentor和imgaug——python图像数据增强库
  6. 京东商城确认购买jingdong.com域名
  7. Qt Console Application 与 Qt GUI Application互转
  8. HDU 3555: Bomb
  9. 聚类算法 距离矩阵_机器学习基础-层次聚类
  10. vue html属性绑定,2、Vue元素属性的绑定以及HTML的绑定
  11. Map与JSON数据之间的互相转化
  12. js实现简易拖拽图片验证功能
  13. 詹森不等式到底是什么?
  14. 19年电赛B题设计总结
  15. Allegro172版本DFM规则之DFT outline
  16. host文件位置 修改ip映射地址
  17. html怎样写出x的平方,x的平方怎么打出来
  18. 计算机注销之后一直黑屏,Win7旗舰版电脑注销完黑屏怎么解决?
  19. React实现(Web端)网易云音乐项目(三),错过了真的可惜呀
  20. python小白到大牛pdf_清华大学出版《python小白到大牛》PDF版分享

热门文章

  1. 【Windows Server】由于没有远程桌面授权服务器可以提供许可证
  2. [1140]linux查看历史命令history
  3. nginx80转443
  4. X310工作原理及设备描述详细信息
  5. 如何解决md打不开问题?
  6. 企业微信私聊安全吗?
  7. Python解析CDD文件
  8. python中集合用什么符号表示_Python 集合set添加删除、交集、并集、集合操作符号...
  9. PropertyBeanUtils.copyProperties(dest, orig)
  10. 器件选型-ARM7,ARM9,ARM11,Cortex系列基础知识