在 Linux 内核中,更准确地说是 3.9- rc6上的 /arch/arm/mach-exynos/cpuidle.c,这些行读取
static unsigned int g_pwr_ctrl, g_diag_reg;
static void save_cpu_arch_register(void)
{
/*read power control register*/
asm("mrc p15, 0, %0, c15, c0, 0" : "=r"(g_pwr_ctrl) : : "cc");
/*read diagnostic register*/
asm("mrc p15, 0, %0, c15, c0, 1" : "=r"(g_diag_reg) : : "cc");
return;
}
在研究了这个问题之后,这似乎是gcc 内联汇编。考虑到它是一个关键组件,因此asm
正在阅读它,因为它要么
- 更快,因此更高效
- 在 C 中不可用
我在学习汇编时查看了ARM 手册,但由于它的三个字母长度MCR
,我可以判断它是协处理器。MCR
内联汇编似乎访问电源控制寄存器并将结果(来自寄存器)保存到第一行的无符号整数中(我希望在某个时候调用)。
关于电源控制寄存器,arm手册列出,
- 实现 Cortex-A9 处理器的时钟延迟
- 动态时钟门控。
我无法理解为什么需要这样做,这可以在函数中动态访问。
最后,ARM 手册列出了 32 位宽寄存器的设计。基本时钟似乎设置在那里,我们是在从空闲上下文进程启动时读取这个吗?
我也发现了一个类似的问题——这也可能对你有所帮助。