X86 初始化CPU上的性能计数器监视器控制寄存器

X86 初始化CPU上的性能计数器监视器控制寄存器,x86,operating-system,cpu-architecture,performancecounter,X86,Operating System,Cpu Architecture,Performancecounter,有人知道哪个模块负责初始化x86 CPU上的性能计数器监视器(PCM)控制寄存器吗?它是由重置时的硬件完成的,还是由引导加载程序或其他一些内核模块完成的?性能监视器计数器(PMC)不需要初始化,它们需要在软件想要使用该功能时进行编程(或设置) 复位后,CPU不会对PMC做任何事情,至少在架构上看不到任何东西(即程序员可见) 引导加载程序不处理这些事情 它是一个处理PMC的内核模块,因为它们是特定于型号的寄存器(MSR),只能通过具有特权的指令(如rdmsr,wrmsr)访问(即它们需要在内核空间

有人知道哪个模块负责初始化x86 CPU上的性能计数器监视器(PCM)控制寄存器吗?它是由重置时的硬件完成的,还是由引导加载程序或其他一些内核模块完成的?

性能监视器计数器(PMC)不需要初始化,它们需要在软件想要使用该功能时进行编程(或设置)

复位后,CPU不会对PMC做任何事情,至少在架构上看不到任何东西(即程序员可见)

引导加载程序不处理这些事情

它是一个处理PMC的内核模块,因为它们是特定于型号的寄存器(MSR),只能通过具有特权的指令(如
rdmsr
wrmsr
)访问(即它们需要在内核空间中运行代码)。 然后,内核模块可以通过操作系统接口或允许非特权代码执行指令
rdpmc
(尽管它只允许读取已经预设的计数器),将功能公开给用户空间程序



要了解有关PMC的更多信息,请参阅。

性能监视器计数器(PMC)不需要初始化,当软件想要使用该功能时,它们需要编程(或设置)

复位后,CPU不会对PMC做任何事情,至少在架构上看不到任何东西(即程序员可见)

引导加载程序不处理这些事情

它是一个处理PMC的内核模块,因为它们是特定于型号的寄存器(MSR),只能通过具有特权的指令(如
rdmsr
wrmsr
)访问(即它们需要在内核空间中运行代码)。 然后,内核模块可以通过操作系统接口或允许非特权代码执行指令
rdpmc
(尽管它只允许读取已经预设的计数器),将功能公开给用户空间程序



要了解有关PMC的更多信息,请参阅。

IIRC,内核可以启用对性能计数器的直接用户空间访问。(也就是说,设置一些东西,使其在用户空间中工作)@PeterCordes如果我没有错的话,用户空间程序只能使用
rdpmc
进行读取。但值得一提的是,谢谢!我没有手动使用RDPMC,但我认为它只是用于读取实际计数器。要选择您希望它们计数的值,我认为您需要WRMSR。尽管如此,这对于非常低的开销测量来说已经足够了,甚至低于RDTSC。(您可以计算核心时钟周期,而不是墙上的时钟参考周期。)IIRC,内核可以启用对perf计数器的直接用户空间访问。(也就是说,设置一些东西,使其在用户空间中工作)@PeterCordes如果我没有错的话,用户空间程序只能使用
rdpmc
进行读取。但值得一提的是,谢谢!我没有手动使用RDPMC,但我认为它只是用于读取实际计数器。要选择您希望它们计数的值,我认为您需要WRMSR。尽管如此,这对于非常低的开销测量来说已经足够了,甚至低于RDTSC。(您可以计算核心时钟周期,而不是挂钟参考周期。)