文章目录
在 ARMv8 架构中,系统寄存器的访问通常使用专有的指令。对于 MPIDR_EL1
(多处理器亲和性寄存器),可以使用 MRS
(Move System Register)指令将其值读取到一个通用寄存器中。
下面是一个以内联汇编写成的函数,用来读取 MPIDR_EL1
寄存器的值并返回:
uint64_t read_mpidr_el1(void)
{
uint64_t value;
__asm__ volatile("MRS %0, MPIDR_EL1" : "=r" (value));
return value;
}
这里 %0
是输出操作数的占位符,代表 value
变量。"=r"
是输出约束,指示编译器 value
是一个输出操作数,它将被分配到一个寄存器中,并且在执行 MRS
指令后它将包含该寄存器的值。
如果想要写一个纯汇编的函数,可以这样实现:
.global read_mpidr_el1
.text
read_mpidr_el1:
MRS X0, MPIDR_EL1
RET
在这个纯汇编函数中,MPIDR_EL1
寄存器的值被读入 X0
寄存器(ARMv8 架构的第一个通用寄存器),然后该函数通过 RET
指令返回。在 ARMv8 架构中,函数的返回值通常通过 X0
寄存器传递。
请注意,无论是内联汇编还是纯汇编函数,都需要在拥有适当权限的执行环境中运行,因为 MPIDR_EL1
是一个只有在特定执行级别(EL1 或更高)才能访问的寄存器。如果在不允许的执行环境中尝试读取它,将引起异常。
MPIDR_EL1寄存器
多核处理器的亲和寄存器,每个处理器单元都具有独立该寄存器。该寄存器值为该处理单元的另一种标识、表示对应处理器单元的亲和力,该值用于系统调度。
- AFF0 :表示一个 core 中的第几个 thread,大多数 core 都是 single-threaded core,所以大多数 core 中的该值是 0.
- AFF1:表示一个 cluster 中的第几个 cpu
- AFF2/AFF3:表示系统中的第几个 cluster,这个值由 SOC 厂商给 core 的输入信号决定