我一直在研究引导加载器,并且对大部分的源代码都有一个解释,ROM代码在大多数芯片上,它们告诉芯片在启动后该去哪里,然后ROM代码将一小块代码加载到SRAM中。
我的问题是DRAM需要一个控制器才能运行,但为什么SRAM不需要呢?谁控制SRAM?或者它是如何被控制的?另外,在系统对SRAM进行处理并且DRAM耗尽之后,会发生什么情况?
我还不知道这是否有意义,但最好能从u和Linux的角度来回答。
发布于 2021-12-10 07:43:37
两者都需要控制器,但DRAM需要定期刷新以保持其状态(在凝汽器中),而与通过锁存电路存储其状态的SRAM不同。
这意味着,如果要在重置后(例如从Linux或U)保留内存的内容,则必须在重置步骤期间将DRAM控制器配置为“自动刷新”内存。SRAM没有这样的需求。
发布于 2021-12-10 10:39:54
通常,当您从引导加载器的角度引用SRAM时,控制器可以访问的是内部RAM。控制器使用AHB/AXI总线(用于基于ARM的设备)访问此RAM。可能有一个存储器桥将从AHB/AXI总线的信号转换为存储器总线。因此,从软件的角度来说,它是透明的,不需要特定的软件配置来访问这个RAM。
发布于 2021-12-10 23:36:19
..。然后ROM代码将一小块代码加载到SRAM中。
对于某些SoC来说,这是一个常见的过程,但这不是必需的。有替代的引导方案。
使用CRIS处理器的Etrax SoC(现在已停产)要求将DRAM参数存储在非易失性存储器(NVM)中。嵌入式ROM引导代码访问此NVM,并初始化DRAM控制器。因此,ROM引导代码能够直接引导Linux内核。
一些ARM SoC具有引导存储器选择器(BMS)引脚(例如Atmel AT91SAM9xxx和微芯片SAMA5Dx),可以禁用内部ROM代码,并且处理器在从具有就地执行(XIP)功能的外部NVM (例如NVM或闪存)重置后执行代码。这种引导方案可以定制为初始化外部DRAM,然后加载U甚至Linux内核。
我的问题是DRAM需要一个控制器才能运行,但为什么SRAM不需要呢?谁控制SRAM?或者它是如何被控制的?
DRAM需要一个控制器,因为这种类型的内存技术需要定期刷新。在可以访问DRAM之前,需要以编程方式初始化DRAM控制器。加载到SRAM中的引导代码的一个功能是执行DRAM控制器的初始化。
相比之下,SRAM接口要简单得多。通常没有"SRAM控制器“。SRAM接口的控制逻辑通常达到要求“控制器”的复杂程度。例如,我使用了一个SBC,它的Z80微处理器直接连接到SRAM (HM6264)和EPROM (MBM2764)内存IC,再加上一些地址解码逻辑。
现代SoC上的"SRAM控制器“主要是外部SRAM与内部系统总线的缓冲接口。SoC的内部内存不需要任何软件初始化,并且可以在重置后立即访问。
另外,在系统对SRAM进行处理并且DRAM耗尽之后,会发生什么情况?
通常,当内部SRAM不作为Linux内核管理的内存的一部分时,它就会被闲置。我不知道这是否是由于任何技术原因,例如虚拟内存或缓存问题,或者疏忽,还是对同构内存的简单性的渴望。
对于一些so来说,内部SRAM的数量是如此之少(例如Atmel AT91SAM926x中的8KB),因此在内核中使用它的努力可以被认为是一个糟糕的成本效益权衡。
请参阅有关Atmel/微芯片SAMA5D3x上SRAM的核补丁的讨论。
设备驱动程序仍然可以使用内部SRAM作为其专用内存区域作为高速缓冲区。例如,有一个核补丁来使用SRAM来保存以太网传输数据包,以避免传输不足的错误。
https://stackoverflow.com/questions/70300977
复制相似问题