【问题标题】:What does this line mean in Python?这条线在 Python 中是什么意思?
【发布时间】:2010-11-02 10:24:12
【问题描述】:

此代码试图检索哪些 CPU 信息。此代码是更大包的一部分。我不是 Python 程序员,我想将此代码转换为 C#。

from ctypes import c_uint, create_string_buffer, CFUNCTYPE, addressof
CPUID = create_string_buffer("\x53\x31\xc0\x40\x0f\xa2\x5b\xc3")
cpuinfo = CFUNCTYPE(c_uint)(addressof(CPUID))
print cpuinfo()

如果你是一名 Python 程序员并且知道这段代码在做什么,那对我来说将是一个很大的帮助。

【问题讨论】:

  • 看起来像硬编码的函数调用、平台、包详细信息等可能有助于回答
  • 第三行也应该是 cpuinfo = CFUNCTYPE(c_uint)(addressof(CPUID))

标签: c# python windows cpu cpuid


【解决方案1】:

它执行以下机器代码:

push bx
xor ax, ax
inc ax
cpuid
pop bx
retn

基本上它调用 CPU 的CPUID 指令以获取有关 CPU 的信息。由于 EAX=1,它获取处理器信息和功能位。然后将结果 32 位整数显示在屏幕上,请参阅 wikipedia 文章或this page 来解码结果。

编辑:既然这就是你要找的东西,here's an excellent article about 在 .NET/C# 环境中调用 CPUID(有点像,使用 P/Invoke)

【讨论】:

  • 该死的 :) 我通过谷歌搜索十六进制值得出了相同的结论。 cs.helsinki.fi/u/vahakang/ineptkey.pywen.wikipedia.org/wiki/CPUID 给了我线索。
  • 您实际上可能更喜欢使用 WMI 来获取此类信息,而不是尝试运行原始机器语言。 Windows 为您完成繁重的工作,提供的不仅仅是 CPUID。
  • @DrJokepu:PO 很可能使用 32 位机器。如果考虑 16 位版本,EAX 的上半部分也是不确定的,所以 EAX = 1 可能是错误的。
  • Bastien Léonard:是的,我想你是对的。目前我手头没有 32 位反汇编程序,但它应该相当简单。
【解决方案2】:

除了DrJokepu的回答。 python代码使用ctypes模块确实实现了以下C代码(/hack):

char *CPUID = "\x53\x31\xc0\x40\x0f\xa2\x5b\xc3"; // x86 code
unsigned int (*cpuid)() = (unsigned int (*)()) CPUID; // CPUID points to first instruction in above code; cast it to a function pointer

printf("%u",cpuid()); // calling cpuid() effectively executes the x86 code.

另请注意,这仅返回 EAX 中的信息,x86 代码可能还应该推送/弹出 ECX 和 EDX 的值以确保安全。

【讨论】:

  • 是的,我对 Python 并不熟悉,所以我只是猜到了 Python 部分。
猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2020-01-22
相关资源
最近更新 更多