0

我是 2 核的 ARM Cortex A9 CPU。但我只使用 1 个核心,而另一个只是处于繁忙循环中。我使用部分(每个条目 1MB)设置 MMU 表,如下所示:

0x00000000-0x14ffffff => 0x00000000-0x14ffffff (non-cachable, non-bufferable)
0x15000000-0x24ffffff => 0x15000000-0x24ffffff (cachable, bufferable)
0x25000000-0x94ffffff => 0x25000000-0x94ffffff (non-cachable, non-bufferable)
0x15000000-0x24ffffff => 0x95000000-0xa4ffffff (non-cachable, non-bufferable)
0xa5000000-0xffffffff => 0xa5000000-0xffffffff (non-cachable, non-bufferable)

这很简单。我只想拥有一个 256MB 内存的镜像,用于不可缓存的访问。但是,当我多次写入 0x95000000-0xa4ffffff 的不可缓存内存部分时。我发现在我明确给出缓存刷新之前实际上并未写入写入。

我做错了什么还是这种映射无效?如果是这样的话,我不明白 Linux 的 ioremap 将如何在 ARM 上运行。如果有人能给我一些解释,那就太好了。非常感谢。

4

1 回答 1

1

首先:Cortex-A9 是 ARMv7-A 处理器。术语 non-cacheable/non-bufferable/cacheable/bufferable 不再是对映射的正确描述。实际的映射类型由 TEX[2:0]、C 和 B 位决定。

所以我实际上不得不在这里猜测一下你的映射实际上是什么。我的猜测是,您将大部分映射设置为强排序,并将镜像区域设置为可正常回写缓存。

在 ARM 体系结构中,具有指向同一物理位置的不同内存类型的多个虚拟映射通常不是一个好主意。它曾经被明确禁止,但最新版本的 ARMv7-AR 架构参考手册 (DDI 0406C.b) 有一个(相当长的)部分专门讨论“不匹配的内存属性”的含义。

我建议找到一种不同的方式来实现你的目标。

简单地将未缓存区域的映射更改为 Normal Non-cacheable 将是一个好的开始。没有正当理由为 RAM 使用强排序映射。

于 2013-11-20T07:43:35.667 回答