程序代码载体---存储器介绍

文章目录

在了解Uboot之前,我们先来了解一下代码的载体,看看代码到底存储在什么地方?
答案是:存储器(用来存储程序和各种数据信息的记忆部件)
存储器:许多存储单元的集合,按单元号顺序排列。每个单元由若干二进制位(8位 16位 32位)构成,以表示存储单元中存放的数值,这种结构和数组的结构非常相似。存储器的单元地址只有一个,固定不变,而存储在其中的信息是可以更换的。存储器就是按照二进制来存储数据的器件,存储空间叫做存储区。
存储单元:是CPU访问存储器的基本单位。以8位二进制作为一个存储单元,也就是一个字节。也就是说存储单元的大小是恒定不变的就是一个字节。一个字通常由一个或多个(一般是字节的整数位)字节构成。例如286微机的字由2个字节组成,它的字长为16;486微机的字由4个字节组成,它的字长为32位。
存储字长:一个存储单元存储一串二进制代码(存储字),这串二进制代码的位数称为存储字长,存储字长可以是8位、16位、32位等。
存储字:是指存放在一个存储单元中的二进制代码组合。地址线一次确定一个存储单元,地址线上值可能取的所有组合确定了存储单元的个数。所以,存储单元的个数=2^地址线的条数。MAR是相对于存储器来说的地址 ,比如存储器只有20位地址线 那么MAR也就是20位
存储容量:指存储器可以容纳的二进制信息量,用存储器中存储地址寄存器MAR的编址数与存储字位数的乘积表示。(存储容量=地址寄存器MAR的编址数<存储单元个数=2^地址线的条数>*存储字位数(存储字长,也是存储单元的大小))—-计算出来的是所能存储的二进制代码的总位数不是字节
在这里插入图片描述

按存储器的使用类型可分为只读存储器(ROM)随机存取存储器(RAM)
存储器按其存储介质特性主要分为“易失性存储器”和“非易失性存储器”两大类。其中的“易失/非易失”是指存储器断电后,它存储的数据内容是否会丢失的特性。由于一般易失性存储器存取速度快,而非易失性存储器可长期保存数据,它们都在计算机中占据着重要角色。在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘。
在这里插入图片描述

RAM:
随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM 一般用来保存程序数据、中间结果,比如我们在程序中定义了一个变量 a,然后对这个 a 进行读写操作,a 是一个变量,我们需要很方便的对这个变量进行读写操作,方法就是直接“a”进行读写操作,不需要在乎具体的读写过程。我们可以随意的对 RAM 中任何地址的数据进行读写操作,非常方便。
SRAM:
静态的随机存取存储器,又被称为静态RAM,利用双稳态电路进行存储。即使有干扰对稳态电路也没影响,所以有双稳态性,“静态”是指只要不掉电,存储在SRAM中的数据就可以一直保存,只要有电,SRAM中的数据就不会有变化。加电情况下,不需要一直刷新,数据不会丢失。SRAM 的存储单元以锁存器来存储数据,这种电路结构不需要定时刷新充电,就能保持状态。
DRAM:
动态随机存取存储器,需要不断的刷新,才能保存数据。主要的作用原理是利用电容内存储电荷的多寡来代表一个二进制比特(bit)是1还是0。,有电荷代表 1,无电荷代表 0,由于在现实中电容会有漏电的现象,导致电位差不足而使记忆消失,因此除非电容经常周期性地充电,否则无法确保记忆长存。DRAM读取具有破坏性,也就是说,在读操作中会破坏内存单元行中的数据。因此,必需在该行上的读或写操作结束时,把行数据写回到同一行中。这一操作称为预充电,是行上的最后一项操作。必须完成这一操作之后,才能访问新的行,这一操作称为关闭打开的行。
DRAM---->SDRAM:
同步动态随机存储器(同步的DRAM),DRAM可以分为同步和异步两种,这两种方式根据通讯时是否需要使用时钟信号来区分。
同步:指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;
动态:指存储阵列需要不断的刷新来保证数据不丢失;
随机:指数据不是线性依次存储,而是自由指定地址进行数据读写。
下图是一种利用时钟进行同步的通讯时序,它在时钟的上升沿表示有效数据,也就是SDRAM。
在这里插入图片描述
SDRAM的内部是一个存储阵列,你可以把它想象成一张表格。我们在向这个表格中写入数据的时候,需要先指定一个行(Row),再指定一个列(Column),就可以准确地找到所需要的“单元格”,这就是SDRAM寻址的基本原理。
SDRAM总存储容量 = L-Bank的数量×行数×列数×存储单元的容量
在CPU中,SRAM用做cache,DRAM用做主存
在这里插入图片描述
DRAM---->DDR SDRAM:
双倍速率同步动态随机存储器,是内存的其中一种。SDRAM在一个时钟周期内只传输一次数据,它是在时钟的上升期进行数据传输;而DDR内存则是一个时钟周期内传输两次数据,它能够在时钟的上升期和下降期各传输一次数据,因此称为双倍速率同步动态随机存储器。DDR内存可以在与SDRAM相同的总线频率下达到更高的数据传输率。DDR SDRAM 有多个内存条,提供多个隔行扫描的内存访问,从而提高内存带宽。内存条是一个内存阵列,两个内存条是两个内存阵列,四个内存条是四个内存阵列,
在这里插入图片描述
DDR、DDR2、DDR3······又有什么区别?
DDR(DDR2、DDR3、DDR4)演进的基础组件和功能/操作保持不变,但时钟速度增加了差异化因素。例如,DDR2 RAM为DDR SDRAM接口添加了2倍时钟倍频器,从而在保持相同总线速度的同时使数据传输速度翻倍。通过这种方式,从内存阵列到I/O缓冲区采用了「4位预取」。同样,DDR3模块预取8位数据,DDR4模块预取16位数据。

ROM:
只读存储器,“只读存储器”这个定义不准确。比如我们买手机,通常会告诉你这个手机是 4+64 或 6+128 配置,说的就是 RAM 为 4GB 或 6GB,ROM 为 64G 或128GB。但是这个 ROM 是 Flash,比如 EMMC 或 UFS 存储器,因为历史原因,很多人还是将Flash 叫做 ROM。但是 EMMC 和 UFS,甚至是 NAND Flash,这些都是可以进行写操作的!只是写起来比较麻烦,要先进行擦除,然后再发送要写的地址或扇区,最后才是要写入的数据,学习过 STM32,使用过 WM25QXX 系列的 SPI Flash 的同学应该深有体会。可以看出,相比于RAM,向 ROM 或者 Flash 写入数据要复杂很多,因此意味着速度就会变慢(相比 RAM),但是ROM 和 Flash 可以将容量做的很大,而且掉电以后数据不会丢失,适合用来存储资料,比如音乐、图片、视频等信息。
EEPROM:
电可擦除存储器。EEPROM 可以重复擦写,它的擦除和写入都是直接使用电路控制,不需要再使用外部设备来擦写。而且可以按字节为单位修改数据,无需整个芯片擦除。现在主要使用的 ROM 芯片都是 EEPROM。
FLASH:
存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据 ,同时可以快速读取数据。,可以对存储器单元块进行擦写和再编程。
FLASH--->NOR FLASH:
NORFlash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NORFLASH里面的代码,采取内存的随机读取技术。NOR Flash和普通的内存比较像的一点是他们都可以支持随机访问,这使它也具有支持XIP的特性,可以像普通ROM一样执行程序。这点让它成为BIOS等开机就要执行的代码的绝佳载体。现在几乎所有的BIOS和一些机顶盒上都是使用NOR Flash,它的大小一般在1MB到32MB之间,价格昂贵。
FLASH--->NAND FLASH:
NAND 闪存的存储单元则采用串行结构,没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,存储单元的读写是以页和块为单位来进行(一页包含若干字节,若干页则组成储存块, NAND 的存储块大小为 8 到 32KB ),这种结构最大的优点在于容量可以做得很大,超过 512MB 容量的 NAND 产品相当普遍, NAND 闪存的成本较低,有利于大规模普及。NAND Flash广泛应用在各种存储卡,U盘,SSD,eMMC等等大容量设备中。它的颗粒根据每个存储单元内存储比特个数的不同,可以分为 SLC(Single-Level Cell)、MLC(Multi-Level Cell) 和 TLC(Triple-Level Cell) 三类。其中,在一个存储单元中,SLC 可以存储 1 个比特,MLC 可以存储 2 个比特,TLC 则可以存储 3 个比特。NAND Flash 的单个存储单元存储的比特位越多,读写性能会越差,寿命也越短,但是成本会更低。

  1. 都是非易失存储介质。即掉电都不会丢失内容。
  2. 在写入前都需要擦除。实际上NOR Flash的一个bit可以从1变成0,而要从0变1就要擦除整块。NAND flash都需要擦除。
    在这里插入图片描述

存储器在ARM处理器上的作用
NOR Flash - 程序存储器
作为ARM处理器的程序存储器。因为我们必须将程序保存在一个掉电后还能保存数据的地方。上电后,NOR Flash就相当于一个随机读取的只读存储器。
那么,既然NOR Flash可以运行程序,我们为什么不直接在其上运行程序呢?
一般情况下,我们编译的程序中,.text段,.rodata段都是只读的,这没有问题。但是,.data段(数据段)和 .bss(未初始化的全局变量和静态变量)在程序的运行过程中变量的值是需要改变的(改变一个变量的值,需要改变对应物理地址上存储的内容),很可惜,NOR Flash只能直接读取,而无法进行写操作。
那么,为了解决这个问题,就需要SRAM了。
SRAM - 提供运行环境
其重要特性就是:容量小,512KB;运行程序速度快;价格贵。
可以作为程序运行时的堆栈空间。把ARM处理器的堆栈指针sp设置在SRAM中,为程序提供运行环境。
SRAM作为运行程序的场所是可以的,但是由于其昂贵的价格,极小的容量,而现在程序一般都非常庞大,所以满足不了我们的需求。正因为此,SDRAM应运而生。
SDRAM - 运行程序
它的重要特性是容量大:512M;程序运行速度快;价格便宜。
但是其掉电易失数据,上电后必须初始化DDR控制器,否则无法进行数据的读写。所以在运行系统内核之前必须对其进行初始化,这就是在NOR Flash 和 SRAM上搭建的程序的作用。
那它主要都完成什么工作呢?
1. 完成对处理器时钟的初始化
2. DDR的初始化
3. 给 gd_t *gd_ptr 赋值(用于存储uboot镜像的长度,重定位地址,重定位偏移量等信息)
在uboot搬运到DDR中运行前进行最小系统的初始化,之后就将uboot搬运到DDR中运行。那么,此时NOR Flash和SRAM的任务就完成了(也就是没有用了)。
链接文件
前面我们已经了解了嵌入式设备的存储介质,以及它们的用途。但是,对于编译后的代码如何在内存上分配,处理器是不知道,这需要我们人为地指定。这时候,后缀为lds的链接文件出现了,它规定了编译后的代码各个段是如何分配的。理解了它,对于我们对u-boot也是大有帮助的。
请添加图片描述

 栈区(stack)
 栈区介绍
  1.栈区与堆区是相互毗邻的,并且生长方向相反;当栈指针触及到堆指针时,意味着栈空间已经被耗尽(如今地址空间越来越大,及虚拟内存技术发展,栈与堆可能放置在内存的任何地方,但生长方向依然还是相向的)。
  2.栈区域包含一个LIFO结构的程序栈,其通常放置在内存的高地址处,栈区按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
  3.栈指针寄存器跟踪栈顶位置,每当有数值被压入栈中,栈顶指针会被调整,在一个函数的调用过程中,压入的一系列数值被称作“栈帧”,栈帧至少包含一个返回地址。
 存放内容
  1.临时创建和const定义的局部变量存放在栈区。
  2.函数调用和返回时,其入口参数和返回值存放在栈区。

 堆区(heap)
 堆区介绍
  堆区通常用作动态内存分配,堆空间起始于BSS段的末尾,并按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。返回地址。
 存放内容
  1.堆区用于存放程序运行中被动态分布的内存段,可增可减。
  2.可以用malloc等函数实现动态分布内存。当有malloc函数分配的内存时必须用free函数进行内存释放,否则会造成内存泄漏。

 全局区(静态区)
 全局区介绍
  和栈区一样,通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。全局区有.bss段和.data段组成,可读可写。
 .bss段
  1.未初始化的全局变量存放在.bss段。
  2.初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
  3…bss段不占用可执行文件空间,其内容有操作系统初始化。

 .data段
  1.已经初始化的全局变量存放在.data段。
  2.静态变量存放在.data段。
  3. .data段占用可执行文件空间,其内容有程序初始化。
  4.const定义的全局变量存放在.rodata段。

 常量区
  1.字符串、数字等常量存放在常量区。
  2.程序运行期间,常量区的内容不可以被修改。

 代码区
  1.程序执行代码存放在代码区,其值不能修改(若修改则会出现错误)。
  2.字符串常量也有可能存放在代码区。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值