Fork me on GitHub
侧边栏

【ARM Cache 及 MMU 系列文章 6.4 -- ARMv8v9 如何读取 Cache Tag 及分析其数据?】

Cache Tag 数据读取

在处理器中,缓存是一种快速存储资源,用于减少访问主内存时的延迟。缓存通过存储主内存中经常访问的数据来实现这一点。为了有效地管理这些数据,缓存被组织成行(lines)或块(blocks),每个行或块包含了一段连续的内存数据。每个缓存行都与一个缓存标签(cache tag)相关联,这个标签用于标识存储在缓存行中的数据属于内存的哪个位置。本文将介绍如何读取Cache Tag 中的数据。

读取命令

选择读取的路和组

读取tag数据并解析

测试代码

如下测试代码,读取了第0组,和共4路的tag:

void a520_cache_read(void)
{
        *(uint64_t *)(0x99900000) = 0x5a5a5a5a;

        for (int way = 0; way < 4; way++) {
                uint64_t tag = a520_dcache_tag(0, way);
                log_info("set %d, way %d, tag %lx\n", 0, way, tag);
        }
}

tag 读取汇编代码实现:

/* 
 * set
 * way
 * /
func a520_dcache_tag
    LSL  w0, w0, #6
    LSL  w1, w1, #30
    orr  w0, w0, w1
    sys #6, c15,c2,#0, x0
    isb
    mrs x0, S3_6_C15_C0_0
    ret
endfunc a520_dcache_tag

测试结果

4

bit[27:0] 的值为 0x99900 正好对应上物理地址的 bit[39:12]

posted @ 2025-09-08 08:00  yooooooo  阅读(22)  评论(0)    收藏  举报