This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM4376:16MB 超级分区和64KB 大页面支持

Guru**** 2931860 points

Other Parts Discussed in Thread: AM4376

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/663207/linux-am4376-16mb-super-section-and-64kb-large-page-support

器件型号:AM4376

工具/软件:Linux

对于基于 AM4376 ARM cortex-A 的 MPU、似乎硬件支持页面/区域大小为16MB、1MB、64KB 和4KB 虚拟到物理地址转换。  

似乎该 Linux 仅支持1MB (第一级)和4KB (第二级) 页表。  

请在 地址转换中启用16MB (超部分)和64KB (大页面)。 至少对于 ioremap 函数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Lawrence、

    您能否指定您使用的 Linux 版本?



    BR
    Tsvetolin Shulev

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    linux-4.9.28-rt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于16MB 区域的 Ioremap、只需应用以下补丁即可。

    索引:arch/arm/mm/ioremap.c
    ===================================================================================================================================
    -- arch/arm/mm/ioremap.c (修订版625)
    ++ arch/arm/mm/ioremap.c (工作副本)
    @@-316、6 +316、9 @@
    !((paddr | size | addr)&~SUPERSECTION_MASK)){
    area->flags |= VM_ARM_SECTION 映射;
    ERR = remap_area_supersections (addr、pfn、size、type);
    +}否则、如果(((cpu_architecture ()=cpu_arch_armv7)&&!((paddr | size | addr)&~SUPERSECTION_MASK))为{
    + area->flags |= VM_ARM_SECTION 映射;
    + err = remap_area_supersections (addr、pfn、size、type);
    }否则、如果(!(((paddr | size | addr)&~PMD_mask)){
    area->flags |= VM_ARM_SECTION 映射;
    ERR = remap_area_sections (addr、pfn、size、type);

    我正在寻找如何为64KB Pte 大小设置第二级页表。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lawrence、

    您提出的问题需要进行一些研究,我需要与 TI 开发人员讨论,以确定是否可以更改页面大小。 SDK 内核和 TI 针对某个版本执行的测试在很大程度上依赖于采用 Linux 社区提供的内容来设置处理器的核心架构。

    请提供您的应用程序为何需要更改页面大小的原因和任何支持数据吗?

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    作为嵌入式系统、我们在 GPMC 上连接了 FPGA 和少数其他器件、映射了16MB 和64KB 存储器。

    应用程序会主动对这些 FPGA 和器件进行读/写处理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    开发过程询问页面大小为何重要? 在 ioremap 之后、无论 page_size 或 ioremap 大小如何、都可以获得连续的虚拟地址。 MMU 负责映射、它对虚拟地址是透明的、无论是底层 PAGE_SIZE 是4K 还是64K。

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    性能至关重要。 TLB 漏损越小、过载嵌入式系统就越好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    RT Wiki 介绍了存储器锁定 API。
    wiki.linuxfoundation.org/.../memory

    下面的代码来自上面的 wiki。 此 API 调用是否会锁定存储器并防止 TLB 缺失? 这是否适用于您的应用?

    /*锁定内存*/
    if (mlockall (MCL_CURRENT_MCL_Future)=-1){
    printf ("mlockall 失败:%m\n");
    exit(-2);


    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不是、这不是我要找的。 此存储器锁定 API 适用于具有交换设备的系统、例如将硬盘分区配置为交换空间、并且不允许某些线程的程序和/或数据交换到磁盘。  

    在大多数嵌入式系统中、始终没有配置交换设备。 每个线程的程序、数据和堆栈都已加载到内存中并从内存(即 DDR)运行。

    此外、我还将讨论如何配置 ARM MMU、以使用较少的页表条目(即 PTE)映射器件的 IO 空间(即存储器映射)、 从而减少 TLB 丢失。

    ARM 内的翻译后备缓冲器最多只能在 微型 TLB 中存储32个 PTT、 在主 TLB 中存储2路相关的2x32或2x64 PTT、具体取决于硬件 实现。  

    显然、如果我的程序随机 访问 FPGA、FPGA 被映射到 64K 存储器窗口 (即16个 PTE、每个窗口为4K)、则会触发大量 TLB 缺失。  

    根据我的理解、可以在 micro TLB 中找到的 PTE 需要少于几个时钟周期来执行转换。 如果此转换未命中、ARM CPU 将尝试在主 TLB 中找到 PTE、它将花费大约10至20个时钟周期。 如果主 TLB 仍然未命中、则会触发一个页面步行以在主存储器中找到该 PTE、这通常需要100多个时钟周期。 由于整个 CPU 暂停以等待页面转换、因此这些100多个时钟周期会浪费时间。

    因此、如果单 个64K PTE 可以覆盖64K 字节窗口、则会减少 TLB 缺失、并  提高实时系统的性能。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我需要在内部对此再次进行进一步研究。 此区域可能不是 TI 提供的区域、我也会检查它。 您是否曾尝试在 ARM Linux 列表中提出此问题?

    linux-arm-kernel@lists.infradead.org

    此致、
    Schuyler
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复。  

    不、 我没有向 ARM Linux 提出这个问题。

    我认为我们 只是 TI Linux 的最终用户、而不是开放源码 Linux 开发委员会的成员。  

    我的印象是、TI Linux 是 Linux 开发 委员会的成员、并且积极参与 Linux 技术的开发。

    谢谢、

    劳伦斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lawrence、

    我们认为这是您必须向 ARM Linux 社区提出的问题。 虽然 TI 是 Linux 社区的一部分、但 TI 仅提供支持 TI 销售的 SOC 的开关结构和外设驱动程序的代码。 在开发 Linux SOC 驱动程序时、启用 TI 继承的 ARM 架构的代码。 您感兴趣的代码不是 TI 开发的、因此无法真正提供支持。

    您正在寻找的解决方案的下一步是询问社区此页面大小更改是否是可添加的功能。 一个贡献者仍然必须完成这项工作、并且熟悉 ARM Linux 代码如何针对页面大小设置代码。

    要开始的邮件列表如下所示:

    linux-arm-kernel@lists.infradead.org

    此致、
    Schuyler