如何组织外部内存,内部内存和缓存?

问题描述:

考虑一个系统如下:一个硬件板,具有ARM Cortex-A8和Neon Vector协处理器,以及在Cortex-A8上运行的嵌入式Linux操作系统。在这种环境下,如果某些应用程序 - 例如,视频解码器 - 被执行,则:如何组织外部内存,内部内存和缓存?

  • 它是如何决定哪些缓冲区将在外部存储器中,哪些会在内部SRAM分配等

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

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

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

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

  • 操作系统在区分这些不同的内存方面扮演了多大的角色?

对不起,有很多问题,但我认为它们都是相互关联的。

+0

你是什么意思的内部与外部记忆?您已经分别提到了缓存,所以我认为既不是“内存”,也不是“缓存”的一部分。您是否使用“内部存储器”来指代由Cortex-A8提供的一些片上RAM? – 2010-04-10 18:50:24

+0

@戴尔:我的意思是内部存储器 - 快速访问芯片内存。外部存储器=高延迟内存片外存储器,高速缓存是分开的,可以说L1高速缓存。 – goldenmean 2010-04-11 06:49:43

请注意,我并不熟悉ARM或嵌入式Linux的具体内容,因此我所有的评论都是从一般观点出发的。

首先,关于缓存:在引导很早的时候,操作系统会做一些缓存初始化。实际上,每个处理器会有所不同,但最终效果是确保缓存正确初始化,然后启用处理器使用。在此之后,缓存仅由处理器操作,操作系统或程序无需进一步交互。现在

,到外部(芯片外)和内部(片内)存储器:

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

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

  • 一个可以修改OS是明确地意识到这个特殊的内存,并提供特殊的系统调用分配给用户进程的土地。但是,这可能是相当多的工作,除非使用嵌入式Linux至少有一些支持这种事情。

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

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

操作系统在区分这些不同的内存方面扮演了多大的角色?

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

它是如何决定哪些缓冲区将在外部存储器中,哪些会在内部SRAM分配等

这似乎不太可能,我认为操作系统会尝试这样的选择自动化。相反,我怀疑操作系统或设备驱动程序会提供一个通用接口来提供对片上存储器的访问,并将其留给用户代码来决定如何处理它。

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

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

用户可以将缓冲区设置为被分配在他选择的记忆中(内部/外部)?

如果你指的是从地区标准malloc调用返回,大概不会缓冲区。但是,如果您的意思是“用户程序能否以某种方式获得指向片上内存的指针”,那么答案几乎肯定是,但机制将取决于将Linux移植到此系统时所做的选择。

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

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

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

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

我希望这有些帮助。

+0

@戴尔:嗨戴尔,谢谢你的详细解答。它有帮助。 – goldenmean 2010-04-11 12:44:49

+0

关于TCM,它是快速记忆。非常像高速缓存 - 事实上,在大多数设备中,内存可以配置为TCM或缓存 - 除了内容是静态的:如果您将数据存储在那里,它将保证保留。您将使用它来存储您需要快速访问的代码和数据,并且您无法承担使用缓存的不可预测性。例如。关键中断例程或任何非常时间关键的代码,您认为您可以(而且值得)比缓存分配机制更智能。 – Lolo 2015-01-07 17:34:18

+0

@Lolo感谢您的补充信息。 – 2015-01-08 06:17:08