Other Parts Discussed in Thread: AM4376
工具/软件:Linux
对于基于 AM4376 ARM cortex-A 的 MPU、似乎硬件支持页面/区域大小为16MB、1MB、64KB 和4KB 虚拟到物理地址转换。
似乎该 Linux 仅支持1MB (第一级)和4KB (第二级) 页表。
请在 地址转换中启用16MB (超部分)和64KB (大页面)。 至少对于 ioremap 函数。
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.
对于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 大小设置第二级页表。
不是、这不是我要找的。 此存储器锁定 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 缺失、并 提高实时系统的性能。