gpt4 book ai didi

assembly - 当 D-cache 关闭时,使 D-cache 失效的目的是什么?

转载 作者:行者123 更新时间:2023-12-04 09:12:38 26 4
gpt4 key购买 nike

在 Linux 内核源 arch/arm64/kernel/head.S 中,引导要求指出引导加载程序必须在 D-cache 关闭的情况下进入:

/*
* Kernel startup entry point.
* ---------------------------
*
* The requirements are:
* MMU = off, D-cache = off, I-cache = on or off,
* x0 = physical address to the FDT blob.
...
*/
然后,在 preserve_boot_args()函数,在将参数加载到 boot_args 后,有一个调用使 D-cache 的一个区域无效。大批
SYM_CODE_START_LOCAL(preserve_boot_args)
mov x21, x0 // x21=FDT

adr_l x0, boot_args // record the contents of
stp x21, x1, [x0] // x0 .. x3 at kernel entry
stp x2, x3, [x0, #16]

dmb sy // needed before dc ivac with
// MMU off

mov x1, #0x20 // 4 x 8 bytes
b __inval_dcache_area // tail call
SYM_CODE_END(preserve_boot_args)
如果 D-cache 关闭,为什么 D-cache 行需要失效?

最佳答案

Why does the D-cache line need to be invalidated if the D-cache isoff?


这些寄存器 stp x21, x1, [x0] \ stp x2, x3, [x0, #16]boot_args 开始写入内存地址。缓存关闭,因此数据将直接写入内存。
D-Cache 不受此类写入的影响。因此,D-Cache 包含它在关闭之前保存的数据,或者如果芯片通电则包含一些垃圾。
通过无效 boot_args + 0x20如果启用 D-cache,您可以保证稍后从内存中读取写入的数据。
考虑场景:
  • 写入区域未失效
  • 稍后启用缓存
  • D-Caches 的行包含来自 [ boot_args 的数据.. boot_args + 0x20 ] 内存区域
  • [ boot_args .. boot_args + 0x20 ] 内存区域被读回寄存器

  • 因此,在这种情况下,会出现缓存命中,缓存中的“垃圾”将进入寄存器,而不是从内存中获取的“正确”数据。

    关于assembly - 当 D-cache 关闭时,使 D-cache 失效的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63323122/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com