当我分析我的程序时,我发现“_raw_spin_unlock_irq”系统调用会导致 ARM Cortex A15 板上的大量 iTLB 未命中。在我仔细检查了汇编代码后,我发现“cpsie”指令可能是原因之一。因此,我编写了一个短代码来验证我的假设。
以下是我的代码:
#include "stdio.h"
#include "stdlib.h"
void compute()
{
int i = 100000000;
do {
asm volatile(
"cpsie i"
:
:
: "memory", "cc"
i--;
} while (i > 0);
}
int main()
{
compute();
return 0;
}
然后我使用 perf 工具检查 iTLB 未命中,它报告:
89172 dTLB 负载未命中
5694 dTLB 存储未命中
43248 iTLB 加载未命中
去掉“cpsie i”指令后,结果为:
23453 dTLB 负载未命中
1453 dTLB 存储未命中
12035 iTLB 加载未命中
结果表明,“cpsie i”增加了 4 倍 iTLB 未命中。我使用 perf 报告对二进制代码进行了注释,69.5% 的 iTLB 未命中发生在“cpsie i”指令之后。
│ void compute()
│ {
│ push {r7}
│ sub sp, #12
│ add r7,
│ int i = 100000000;
│ mov.w r3, #57600 ; 0xe100
│ movt r3, #1525 ; 0x5f5
│ str r3, [r7, #4]
│ do {
│ asm volatile(
13.93 │ cpsie i
│ "cpsie i"
│ :
│ :
│ :"memory", "cc");
│ i--;
69.26 │ ldr r3, [r7, #4]
│ subs r3, #1
│ str r3, [r7, #4]
│ }while(i > 0);
16.80 │ ldr r3, [r7, #4]
│ cmp r3,
│ bgt.n 8400 <compute+0x10>
│ }
│ add.w r7, r7, #12
│ mov sp,
│ pop {r7}
│ bx lr
我很困惑为什么在“cpsie i”指令之后发生了很多 iTLB 未命中?有什么办法可以防止吗?谢谢!