代码之家  ›  专栏  ›  技术社区  ›  goldenmean

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

  •  0
  • goldenmean  · 技术社区  · 14 年前

    考虑这样一个系统:一个硬件板,有arm cortex-a8和neon向量协处理器,以及运行在cortex-a8上的嵌入式linux操作系统。在此环境中,如果正在执行某个应用程序(例如视频解码器),则:

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

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

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

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

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

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

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

    1 回复  |  直到 13 年前
        1
  •  4
  •   Dale Hagglund    13 年前

    请注意,我不熟悉arm,也不特别熟悉嵌入式linux,所以我的所有评论都是从一般的角度出发的。

    首先,关于缓存:在启动的早期,操作系统会进行一些缓存初始化。确切地说,这将导致不同的处理器,但净效果是确保缓存初始化正确,然后使其使用处理器。在此之后,高速缓存将由处理器独占操作,操作系统或程序不会进行进一步的交互。

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

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

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

    • 人们可以修改操作系统以明确地知道这个特殊的内存,并提供特殊的系统调用来将其分配给用户端进程。然而,这可能是相当多的工作,除非正在使用的嵌入式linux至少对这类事情有一些支持。

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

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

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

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

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

    在我看来,操作系统不太可能尝试自动完成这些选择。相反,我怀疑操作系统或设备驱动程序会提供一个通用接口来提供对片上存储器的访问,并由用户代码决定如何使用它。

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

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

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

    如果通过 缓冲器 你的意思是从标准返回的区域 马洛克 打电话,可能没有。但是,如果你的意思是“一个用户程序能够以某种方式获得一个指向片上存储器的指针”,那么答案几乎肯定是肯定的,但是机制将取决于将linux移植到这个系统时所做的选择。

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

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

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

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

    我希望这能有所帮助。