实战之 arm64 刷 cache
小问题
- arm64下如何使用指令将数据cache全部刷掉?
- 用户态是否可以刷cache
1. 前言
通常的我们说的刷cache可能包括了两类动作:
- clean: 将cache里面的新内容写入到ddr
- invalidate: 将cache里面的内容无效掉,即丢掉
虽然都说刷cache,实际可能是上面两类动作的一种或者组合
例如:如果刷指令cache,因为指令是只读的,直接invalidate即可。
如果刷数据cache,如果明确可以直接丢掉数据则可以直接使用invalidate;
通常的刷数据cache需要先clean再invalidate;
当然数据cache也可以只clean不invalidate
2. cache的结构
|
cpu0 |
- |
cpu1 |
- |
cpu2 |
- |
cpu3 |
- |
| level1 |
I |
D |
I |
D |
I |
D |
I |
D |
| level2 |
cluster0-U |
- |
- |
- |
cluster1-U |
- |
- |
- |
| ddr缓存(l3) |
all-share-U |
- |
- |
- |
- |
- |
- |
- |
| ddr |
- |
- |
- |
- |
- |
- |
- |
- |
3. 刷cache有哪些指令
3.1 刷指令cache的指令
| 指令 |
解释 |
动作 |
是否支持用户态执行 |
| IC IALLUIS |
Invalidate all to Point of Unification, Inner Shareable |
I |
否 |
| IC IALLU |
Invalidate all to Point of Unification |
I |
否 |
| IC IVAU, Xt |
Invalidate by virtual address to Point of Unification |
I |
是 |
3.2 刷数据cache的指令
| 指令 |
解释 |
动作 |
是否支持用户态执行 |
| DC IVAC, Xt |
Invalidate by virtual address to Point of Coherency |
I |
否 |
| DC ISW, Xt |
Invalidate by set/way |
I</ |