外部存储器,内部存储器和缓存是如何组织的?

时间:2010-04-10 18:33:53

标签: memory caching cpu

考虑如下系统:具有ARM Cortex-A8和Neon Vector协处理器的硬件板,以及在Cortex-A8上运行的嵌入式Linux OS。在这种环境下,如果某个应用程序 - 比如视频解码器 - 正在执行,那么:

  • 如何确定哪些缓冲区将在外部存储器中,哪些缓冲区将在内部SRAM中分配等。

  • 当在这样的系统/代码上调用calloc / malloc时,返回的指针来自哪个内存:内部还是外部?

  • 用户可以在自己选择的内存(内部/外部)中分配缓冲区吗?

  • 在ARM架构中,还有另一个称为“紧耦合存储器”(TCM)的存储器。那是什么以及用户如何启用和使用它?我可以在这个内存中声明缓冲区吗?

  • 我是否需要查看硬件板的内存映射(如果有)以了解典型硬件板中存在的所有这些不同的物理内存?

  • 操作系统在区分这些不同记忆方面扮演了多少角色?

很抱歉有多个问题,但我认为它们都是相互关联的。

1 个答案:

答案 0 :(得分:4)

请注意,我不熟悉ARM或嵌入式Linux,因此我的所有评论都是从一般的角度出发。

首先,关于缓存:在启动过程中很早,操作系统会进行一些缓存初始化。这取决于处理器与处理器之间的不同,但实际效果是确保正确初始化缓存,然后由处理器启用缓存。此后,缓存仅由处理器操作,操作系统或程序无需进一步交互。

现在,转到外部(片外)和内部(片上)存储器:

操作系统拥有系统上的所有硬件,包括内部和外部存储器,因此最终负责在内核和用户进程中发现,配置和分配这些资源。在典型的系统(例如,您的桌面或1u服务器)中,通常不会有任何特殊的内部(片上)ram,因此操作系统可以平等对待所有的dram。它将进入一个通用的页面池(通常为4k),用于分配进程,文件系统缓冲区等。在具有各种特殊内存(nvram,高速片上内存和其他一些内存)的系统上,操作系统的一般政策通常不正确。

如何向用户呈现这将取决于将操作系统移植到此系统时所做的选择。

  • 可以修改操作系统以明确知道此特殊内存,并提供特殊系统调用以将其分配给用户域进程。但是,这可能是相当多的工作,除非使用的嵌入式Linux至少有一些支持这种东西。

  • 我可能采取的方法是避免修改内核本身,而是为内部内存编写设备驱动程序。这种驱动程序通常会提供某种mmap接口,以允许用户进程获得对内部存储器的简单基于地址的访问。

以下是您的一些具体问题的答案。

  

操作系统在区分这些不同记忆方面扮演了多少角色?

如果你的系统采用了上面描述的设备驱动程序方法,那么操作系统可能只知道外部存储器,或者可能只是内部存储器足够正确地初始化它们,尽管这可能也在设备驱动程序中,如果在所有可能的。如果操作系统更明确地了解片上存储器,那么它肯定会包含任何所需的初始化代码,以及某种方案来提供对用户进程的访问。

  

如何确定哪些缓冲区将在外部存储器中,哪些缓冲区将在内部SRAM中分配等。

操作系统似乎不太可能尝试自动执行此类选择。相反,我怀疑操作系统或设备驱动程序会提供通用接口来提供对片上内存的访问,并将其留给您的用户代码来决定如何处理它。

  

当在这样的系统/代码上调用calloc / malloc时,返回的指针来自哪个内存:内部还是外部?

几乎可以肯定,malloc和朋友会返回指向一般片外存储器的指针。在上面建议的基于驱动程序的方法中,您可以使用mmap来访问片上内存。如果你需要做比这更细粒度的分配,你需要编写自己的分配器,或者找一个可以给出明确的内存区域的分配器。

  

用户是否可以在他选择的内存(内部/外部)中分配缓冲区?

如果通过 buffers ,则表示从标准malloc调用返回的区域,可能不是。但是,如果你的意思是“用户程序可以以某种方式获得指向片上存储器的指针”,那么答案几乎肯定是肯定的,但机制将取决于将linux移植到该系统时所做的选择。

  

在ARM架构中,还有另一个称为“紧耦合存储器”(TCM)的存储器。那是什么以及用户如何启用和使用它?我可以在这个内存中声明缓冲区吗?

我不知道这是什么。如果我不得不猜测,我认为它只是片上ram的另一种形式,但由于它有不同的名称,也许我错了。

  

我是否需要查看硬件板的内存映射(如果有)以了解典型硬件板中存在的所有这些不同的物理内存?

如果操作系统和/或设备驱动程序提供了对这些内存区域的某种抽象访问,那么您无需明确了解地址映射。但是,需要这些知识才能在内核或设备驱动程序中实现此访问。

我希望这会有所帮助。