我在我的Fedora系统上的VMware上运行一个Ubuntu服务器VM,我想检索我的主机的TSC值.根据VMware,我可以通过执行RDPMC 0x10000来做到这一点.这在C++中使用内联汇编可以工作,但现在我需要在Go中执行相同的操作.
基本上,我的代码逻辑驻留在两个文件中.在.s文件中,我有以下内容:
#include "textflag.h"
// func rdPmcTsc() uint64
TEXT ·rdPmcTsc(SB), NOSPLIT, $0
MOVL $0x10000, CX
RDPMC
RET
我将其链接到一个.go文件中,如下所示:
//go:nosplit
func rdPmcTsc() uint64
我一直在VScode上调试它,看看AX和DX寄存器中的值,汇编代码似乎可以正常工作.然而,一旦我需要使用Go中的值,它就会将25Ti左右的值转换为8000左右的值,并出现其他类似的错误. 我已经环顾四周很久了,但我没有找到任何合理的解释来解释为什么会发生这种情况.而且,据我所知,我试图获取RDPMC0x10000值的方法似乎就是在GO中应该如何完成它.
如果有人知道如何在围棋中获得正确的返回值,知道为什么它可能不起作用或诸如此类的事情,那就太好了.