Memory 外部内存、内部内存和缓存是如何组织的?
考虑一个如下的系统:一个具有ARM Cortex-A8和Neon向量协处理器的硬件板,以及运行在Cortex-A8上的嵌入式Linux操作系统。在此环境中,如果某个应用程序(如视频解码器)正在执行,则:Memory 外部内存、内部内存和缓存是如何组织的?,memory,caching,cpu,Memory,Caching,Cpu,考虑一个如下的系统:一个具有ARM Cortex-A8和Neon向量协处理器的硬件板,以及运行在Cortex-A8上的嵌入式Linux操作系统。在此环境中,如果某个应用程序(如视频解码器)正在执行,则: 如何决定哪些缓冲区将在外部内存中,哪些缓冲区将在内部SRAM中分配,等等 在这样的系统/代码上调用calloc/malloc时,返回的指针来自哪个内存:内部还是外部 用户是否可以在其选择的内存(内部/外部)中分配缓冲区 在ARM体系结构中,还有另一种称为“紧耦合内存”(TCM)的内存。这是什么
- 如何决定哪些缓冲区将在外部内存中,哪些缓冲区将在内部SRAM中分配,等等
- 在这样的系统/代码上调用calloc/malloc时,返回的指针来自哪个内存:内部还是外部
- 用户是否可以在其选择的内存(内部/外部)中分配缓冲区
- 在ARM体系结构中,还有另一种称为“紧耦合内存”(TCM)的内存。这是什么?用户如何启用和使用它?我可以在此内存中声明缓冲区吗
- 我是否需要查看硬件板的内存映射(如果有)以了解典型硬件板中存在的所有这些不同的物理内存
- 在区分这些不同的记忆方面,操作系统扮演了多大的角色
很抱歉提出了多个问题,但我认为它们都是相互关联的。请注意,我对ARM或嵌入式Linux都不太熟悉,因此我的所有评论都是从一般角度出发的 首先,关于缓存:在启动的早期,操作系统将进行一些缓存初始化。这需要的具体内容因处理器而异,但最终的效果是确保缓存正确初始化,然后允许处理器使用缓存。在此之后,缓存由处理器独占操作,操作系统或程序不再进行交互 现在,对外部(片外)和内部(片上)存储器: 操作系统拥有系统上的所有硬件,包括内部和外部内存,因此最终负责在内核中以及向用户进程发现、配置和分配这些资源。在典型的系统中(例如,您的桌面或1u服务器),通常不会有任何特殊的内部(片上)ram,因此操作系统可以平等地对待所有dram。它将进入一个通用页面池(通常为4k),用于分配进程、文件系统缓冲区等。在具有各种特殊内存(nvram、高速片上内存和其他一些)的系统上,操作系统的一般策略通常不正确 如何向用户展示这一点将取决于将操作系统移植到此系统时所做的选择
- 可以修改操作系统,使其明确地意识到这一特殊内存,并提供特殊的系统调用,将其分配给用户陆地进程。然而,这可能是相当多的工作,除非所使用的嵌入式linux至少对这类事情有一些支持
- 我可能会采取的方法是避免修改内核本身,而是为内部内存编写一个设备驱动程序。这种类型的驱动程序通常会提供某种
接口,以允许用户进程对内部内存进行简单的基于地址的访问mmap
malloc
和朋友们会将指针返回到通用片外存储器中。在上面建议的基于驱动程序的方法中,您可以使用mmap
访问片上内存。如果您需要进行更细粒度的分配,那么您需要编写自己的分配器,或者找到一个可以提供显式内存区域的分配器
用户是否可以在其选择的内存(内部/外部)中分配缓冲区
如果所说的缓冲区是指从标准malloc
调用返回的区域,则可能不是。但是,如果你的意思是“用户程序能以某种方式获得指向片上内存的指针”,那么答案几乎肯定是肯定的,但机制将取决于将linux移植到此系统时所做的选择
在ARM体系结构中,还有另一种称为“紧耦合内存”(TCM)的内存。这是什么?用户如何启用和使用它?我可以在此内存中声明缓冲区吗
我不知道这是什么。如果让我猜的话,我会假设它只是另一种形式的片上ram,但由于它有不同的名称,也许我错了
我是否需要查看硬件板的内存映射(如果有)以了解典型硬件板中存在的所有这些不同的物理内存
如果操作系统和/或设备驱动程序提供了对这些内存区域的某种抽象访问,那么您就不需要明确了解地址映射。然而,在任何一种情况下实现这种访问都需要这些知识