以下代码是否有效以检查CPU是否支持SSE3指令集?
使用该IsProcessorFeaturePresent()
功能显然不适用于Windows XP(请参阅http://msdn.microsoft.com/en-us/library/ms724482(v=vs.85).aspx).
bool CheckSSE3()
{
int CPUInfo[4] = {-1};
//-- Get number of valid info ids
__cpuid(CPUInfo, 0);
int nIds = CPUInfo[0];
//-- Get info for id "1"
if (nIds >= 1)
{
__cpuid(CPUInfo, 1);
bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false;
return bSSE3NewInstructions;
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 与我的其他问题相关,请帮我调试"未知模块中发生未处理的类型'System.AccessViolationException'异常.附加信息:尝试读取或写入受保护的内存.这通常表明其他内存已损坏." 逐步执行代码,一切都会一直运行,直到实际调用del()并在该行中失败.
这段代码基于本文的示例和python代码,它在python中运行.我无法得到代码示例,因为它可以工作(相同的例外),但我希望它只是有点过时或者其他东西.
编辑:如果你关心我们如何到达这里,看看编辑历史,这是无趣的.
public static class CpuID
{
public static byte[] Invoke(int level)
{
IntPtr codePointer = IntPtr.Zero;
try
{
// compile
byte[] codeBytes;
if (IntPtr.Size == 4)
{
codeBytes = x86CodeBytes;
}
else
{
codeBytes = x64CodeBytes;
}
codePointer = VirtualAlloc(
IntPtr.Zero,
new UIntPtr((uint)codeBytes.Length),
AllocationType.COMMIT | AllocationType.RESERVE,
MemoryProtection.EXECUTE_READWRITE
);
Marshal.Copy(codeBytes, 0, codePointer, codeBytes.Length);
CpuIDDelegate cpuIdDelg = (CpuIDDelegate)Marshal.GetDelegateForFunctionPointer(codePointer, typeof(CpuIDDelegate));
// invoke
GCHandle handle = default(GCHandle);
var buffer = new byte[16];
try
{ …
Run Code Online (Sandbox Code Playgroud) 有趣的是它在游戏和其他软件中的工作原理。
更准确地说,我正在寻求一个解决方案C++
。
就像是:
if AMX available -> Use AMX version of the math library
else if AVX-512 available -> Use AVX-512 version of the math library
else if AVX-256 available -> Use AVX-256 version of the math library
etc.
Run Code Online (Sandbox Code Playgroud)
我的基本想法是在不同的 DLL 中编译库并在运行时交换它们,但这对我来说似乎不是最好的解决方案。
考虑到我用C++编写代码,如果可能的话,我想使用类似内在函数的解决方案来阅读有关硬件的有用信息,我的顾虑/注意事项是:
我要回答的最后一个问题是:如何用内在函数做类似的事情?因为我没有找到除CPUID操作码以外的任何东西来获取这种信息.
我有一些具有多个实现的加密代码,根据运行的CPU的功能在运行时选择哪个实现.到目前为止移植这一点非常简单,Windows,Linux和Android都很容易.
但在iOS中它似乎并不容易.虽然x86 CPU具有cpuid
检测功能的指令,但即使从用户模式也是如此,ARM等效功能具有特权.如果没有OS协作,就无法在ARM上检测CPU功能.
在Windows中,IsProcessorFeaturePresent
用于检测ARM CPU功能.在Linux上,/proc/cpuinfo
是要走的路.Android有一个cpufeatures
库(/proc/cpuinfo
仍然可以工作).Mac OS提供了sysctlbyname
带hw.optional.*
.
但iOS呢?iOS内核hw.optional.*
与Mac OS类似,但它在iOS 10中被锁定.(因此,我的问题不是这个问题的重复,因为情况已经改变了.)另外,获取这些列表似乎很难 - Apple的开源网站运行一个自动化流程,从公开发布的操作系统源中清除所有特定于ARM的代码,以使越狱者更加努力.
我想知道当前处理器上的二级缓存大小是多少。幸运的是,有一个名为的库cpu_features
可以实现这一点,甚至更多。在内部,它使用cpuid
指令来获取所有这些信息。
我想知道,如果我尝试在混合架构(例如 Alder Lake)上使用它会发生什么?其效率和性能核心具有不同的特点。我假设该cpuid
指令返回有关当前线程运行的核心的信息。所以基本上,如果它被安排在性能核心上运行,它会描述性能核心。
这样做的问题是操作系统可以决定稍后将线程移动到效率核心,在这种情况下,从中接收到的任何信息都cpuid
不再正确。并且该程序甚至不知道它已被迁移。这可以通过手动将线程“固定”到核心并设置其亲和力来解决。为了区分性能和效率核心,我可以按顺序将线程固定到每个核心,并比较cpuid
.
不过,我想知道cpuid
结果是否确实依赖于核心,以及是否有更好的方法来查询有关处理器的信息,而无需循环遍历所有核心,只需将它们分类为其中一个两类。
此代码尝试检索哪些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()
Run Code Online (Sandbox Code Playgroud)
如果您是一名Python程序员并且知道这段代码在做什么,那对我来说将是一个很大的帮助.
我想用java创建加密; 我如何获得CPU ID或任何东西在PC中是独一无二的,如BIOS或...
例如System.getCpuId(); :)这只是一个例子;)
非常感谢 ...
我正在尝试收集系统信息并在Intel Xeon E5420上注意到以下内容:
执行后CPUID(EAX=1)
,EDX [28]设置,表示支持超线程,尽管处理器在英特尔网站上列为不支持超线程(ark.intel.com)
有没有人对此有解释?
我已经使用PHP创建了一个应用程序,我将把它卖给我当地的市场.我个人会去他们的位置安装/配置Apache和MySQL以及安装我自己的代码.
我想要一个安全系统,以便如果有人试图将我的代码复制到未经授权的机器,它将无法运行.
我知道没有人可以阻止逆向工程应用程序.甚至.exe(二进制)文件都被破解,并且PHP(源代码)任何人都可以做.
在我的国家,那些反向工程师真的很难找到,所以我想提出最小的安全选项,如:
1)创建类(比如说Navigation
),它标识系统信息,如CPU ID,计算机名称或硬件ID的任意组合,以生成UNIQUE_ID并与我给定的UNIQUE_ID(我向其销售应用程序的个人)匹配.如果有效,则返回导航菜单.否则它只会破坏数据库并通过抛出异常来停止执行,可能就像:
class Navigation {
public function d() {
return current system UNIQUE_ID;
}
public function get() {
$a = file_get_contents('hash');
$c = $this->d();
if (crypt($c) != $a) {
//destory database
throw new Exception('');
} else {
return "<ul><li><a>home</a></li></ul>"; //navigation menu
}
}
}
Run Code Online (Sandbox Code Playgroud)
2)然后在安装过程中,我将在"hash"文件中更改系统UNIQUE_ID,创建一个对象,并将其保存到文件(nav.obj)中:
(install.php了)
<?php
$a=new Navigation;
$out=serialize($a);
file_put_contents('nav.obj', $out);
Run Code Online (Sandbox Code Playgroud)
3)在header.php中(包含在每个文件中):
<?php
$menu=file_get_contents('nav.obj');
$menu=unserialize($a);
echo $menu->get();
?>
Run Code Online (Sandbox Code Playgroud)
我知道这种方法不是完全证明,但我很确定大约60%的PHP开发人员无法破解它!
现在我只需要获取当前系统UNIQUE_ID.