如何在aarch64中刷新缓存行



如何在用户空间代码中刷新aarch64上的缓存行?就像在x86上一样,我们可以使用以下lib调用:

_mm_clflush(&array);

我尝试了以下代码:

void flush(void)
{
asm volatile ( "MCR p15, 0, =0x0,c7, c6, 0n");
return;
}

但是GCC有编译错误:

Error: unknown mnemonic `mcr' -- `mcr p15,0,=0x0,c7,c6,0'

谢谢。


根据@Peter的评论更新:我尝试了以下代码的__builtin___clear_cache

int tt = 0;
unsigned long *ptr;
tt++;
TIMESTAMP(ts2);
printf("cycle: %lu. %dn", ts2-ts1, tt);
ptr = &tt;
__builtin___clear_cache(ptr, ptr+128);
TIMESTAMP(ts1);
tt++;
TIMESTAMP(ts2);
printf("cycle: %lu. %dn", ts2-ts1, tt);

结果似乎没有表明我们已经成功地将数据从数据缓存中逐出:

cycle: 5. 1
cycle: 0. 2

我查看了拆卸,并参考了AARCH64使用手册。似乎内置函数已经清理了缓存,对吧?

0000000000400788 <__clear_cache>:
400788:       14000002        b       400790 <__aarch64_sync_cache_range>
40078c:       00000000        .inst   0x00000000 ; undefined
0000000000400790 <__aarch64_sync_cache_range>:
400790:       b0000083        adrp    x3, 411000 <_GLOBAL_OFFSET_TABLE_+0x28>
400794:       b9404462        ldr     w2, [x3,#68]
400798:       35000082        cbnz    w2, 4007a8 <__aarch64_sync_cache_range+0x18>
40079c:       d53b0024        mrs     x4, ctr_el0
4007a0:       2a0403e2        mov     w2, w4
4007a4:       b9004464        str     w4, [x3,#68]
4007a8:       d3504c44        ubfx    x4, x2, #16, #4
4007ac:       52800083        mov     w3, #0x4                        // #4
4007b0:       12000c45        and     w5, w2, #0xf
4007b4:       1ac42064        lsl     w4, w3, w4
4007b8:       51000482        sub     w2, w4, #0x1
4007bc:       1ac52063        lsl     w3, w3, w5
4007c0:       8a220002        bic     x2, x0, x2
4007c4:       93407c84        sxtw    x4, w4
4007c8:       eb01005f        cmp     x2, x1
4007cc:       540000a2        b.cs    4007e0 <__aarch64_sync_cache_range+0x50>
4007d0:       d50b7b22        dc      cvau, x2
4007d4:       8b040042        add     x2, x2, x4
4007d8:       eb02003f        cmp     x1, x2
4007dc:       54ffffa8        b.hi    4007d0 <__aarch64_sync_cache_range+0x40>
4007e0:       d5033b9f        dsb     ish
4007e4:       51000462        sub     w2, w3, #0x1
4007e8:       93407c63        sxtw    x3, w3
4007ec:       8a220000        bic     x0, x0, x2
4007f0:       eb00003f        cmp     x1, x0
4007f4:       540000a9        b.ls    400808 <__aarch64_sync_cache_range+0x78>
4007f8:       d50b7520        ic      ivau, x0
4007fc:       8b030000        add     x0, x0, x3
400800:       eb00003f        cmp     x1, x0
400804:       54ffffa8        b.hi    4007f8 <__aarch64_sync_cache_range+0x68>
400808:       d5033b9f        dsb     ish
40080c:       d5033fdf        isb
400810:       d65f03c0        ret
400814:       00000000        .inst   0x00000000 ; undefined


1。"MCR p15,0,=0x0,c7,c6,0\n"是Aarch32指令


2.正如@Peter上面提到的,"flush"(或ARM TRM术语中的"clean"(将数据从缓存复制到内存中,但缓存副本仍然有效。简单地说,你的__builtin___clear_cache测试一团糟。


3."Invalidate"从缓存中删除数据,并确保从内存中读取数据。(不过,有一个问题,在失效后,数据可能会被预取回缓存。因此,即使失效,测试也可能会一团糟(。


4.检查ARM TRM的"通过VA进行清洁"指令,其中大部分/所有指令都可以在用户空间之外执行。请注意,访问可能会被操作系统禁用/捕获,在这种情况下,您的应用程序将产生故障,并可能被操作系统终止。

PS:顺便说一句,你想通过冲洗来归档什么?

相关内容

  • 没有找到相关文章

最新更新