程序执行的空间是可以被 CACHE 的! 以提高效率, 但是使用时要注意:
1: 如果是使用 ARM720T 之类的 CPU (冯诺依曼结构). 直接把代码从 ROM 搬到 RAM 然后修改 PC
就可以运行了, 因为这类 CPU 只有统一的 CACHE, 指令数据共享一个 CACHE 所以不会有什么问题
2: 如果是使用 ARM920T (或更高)之类的 CPU(哈佛结构). 直接把代码从 ROM 搬到 RAM 然后修改 PC
程序是不能正常运行的!!! 因为 CPU CACHE 分为两部分: 指令和数据. 两个 CACHE 的操作是完全独立
的. 你把代码当作数据搬到 RAM 实际使用的是 D-CACHE(数据 CACHE). 其实还有一部分没有搬到实
际的 RAM 中(仅存在在D-CACHE中). 所以运行可能会出现问题!!!
使用CPU拷贝代码并运行, 正确的步骤如下:
1: 将代码拷贝到 RAM
2: 将 D-CAHCE 没有回写的数据回写内存(同时记得清楚写缓冲器)
3: 将 I-CACHE(指令CACHE)设置为无效(访问不命中)
4: 跳转程序执行 RAM 代码即可!!!
使用DMA拷贝代码并运行, 正确的步骤如下:
1: 将 D-CAHCE 没有回写的数据回写内存(同时记得清楚写缓冲器)
2: 操作 DMA 搬运代码!
3: 如果等待 DMA 搬运的过程中没有 RAM 操作. 直接将 D-CACHE 无效!
4: 将 I-CACHE(指令CACHE)设置为无效(访问不命中)
5: 跳转程序执行 RAM 代码即可!!!
以上方法默认 MMU 将所有的地址都设置为 CACHE 模式. (当然有了页表的配合, 还有很多更优的方法)
期待你的发现!!!
祝你好运!
好久没上了! 都变样了!
|