CPUID标准函数01H是什么?

2023-11-29

我需要检查ECX对于位 30,这是必要的 CPU 功能RDRAND。来自RDRAND Wiki,

如果支持,则在调用 CPUID 标准功能 01H 后设置 ECX 寄存器的位 30。

我不太清楚这意味着什么。 》标准功能01H"?

意思是不是EAX=80000001h?我不太确定如何继续。


我认为这意味着调用 cpuid 函数时 %eax 应该为 1。硬件人员有奇怪的惯例,所以他们说01H而不是 1 或 0x1。

See the 英特尔手册第 2 卷第 3 章表 3.8。 eax的初始值为01H。返回的 ECX 充满了表 3.10 中的特征信息。在该表底部的第 30 位,它表示值为 1 表示处理器支持 RDRAND。

如果你有 gcc,你可以尝试这样的事情:

evaitl@bb ~/se $ cat foo.c 
#include <stdio.h>
#include <cpuid.h>
int main(){
    unsigned eax=0, ebx=0, ecx=0, edx=0;
    unsigned max_lvl=__get_cpuid_max(0,&ebx);
    printf("Max level: %d sig %x\n",max_lvl,ebx);
    ebx=0;
    for(int lvl=0; lvl<=max_lvl; ++lvl){
        __get_cpuid(lvl,&eax, &ebx, &ecx, &edx);
        printf("lvl %-2d eax %08x ebx %08x ecx %08x edx %08x\n",
               lvl, eax, ebx, ecx, edx);
        eax=ebx=ecx=edx=0;
    }
    return 0;
}
evaitl@bb ~/se $ ./foo 
Max level: 13 sig 756e6547
lvl 0  eax 0000000d ebx 756e6547 ecx 6c65746e edx 49656e69
lvl 1  eax 000306e4 ebx 07200800 ecx 7fbee3bf edx bfebfbff
lvl 2  eax 76036301 ebx 00f0b2ff ecx 00000000 edx 00ca0000
lvl 3  eax 00000000 ebx 00000000 ecx 00000000 edx 00000000
lvl 4  eax 00000000 ebx 00000000 ecx 00000000 edx 00000000
lvl 5  eax 00000040 ebx 00000040 ecx 00000003 edx 00001120
lvl 6  eax 00000077 ebx 00000002 ecx 00000009 edx 00000000
lvl 7  eax 00000000 ebx 00000000 ecx 00000000 edx 00000000
lvl 8  eax 00000000 ebx 00000000 ecx 00000000 edx 00000000
lvl 9  eax 00000001 ebx 00000000 ecx 00000000 edx 00000000
lvl 10 eax 07300403 ebx 00000000 ecx 00000000 edx 00000603
lvl 11 eax 00000000 ebx 00000000 ecx 0000006e edx 00000007
lvl 12 eax 00000000 ebx 00000000 ecx 00000000 edx 00000000
lvl 13 eax 00000000 ebx 00000000 ecx 00000000 edx 00000000

解码所有内容需要相当多的时间,但 中的定义可以提供帮助:

/* %ecx */
#define bit_SSE3    (1 << 0)
#define bit_PCLMUL  (1 << 1)
#define bit_LZCNT   (1 << 5)
#define bit_SSSE3   (1 << 9)
#define bit_FMA     (1 << 12)
#define bit_CMPXCHG16B  (1 << 13)
#define bit_SSE4_1  (1 << 19)
#define bit_SSE4_2  (1 << 20)
#define bit_MOVBE   (1 << 22)
#define bit_POPCNT  (1 << 23)
#define bit_AES     (1 << 25)
#define bit_XSAVE   (1 << 26)
#define bit_OSXSAVE (1 << 27)
#define bit_AVX     (1 << 28)
#define bit_F16C    (1 << 29)
#define bit_RDRND   (1 << 30)

头文件中还有很多内容。您会注意到我的 ecx (7fbee3bf) 的第 30 位设置为级别 1,因此我有可用的 RDRND 指令。

通过这条指令实际上可以提取出更多信息。调用 cpuid 时,eax 具有最高位设置的扩展信息。此外,许多级别具有不同的“叶子”,具体取决于调用 cpuid 时 ecx 的值。无聊的人可能会花一两天的时间编写一些代码来完成所有特征提取并使其看起来很漂亮。或者,可以执行“grep flags /proc/cpuinfo”并得到如下内容:

标志 : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe 系统调用 nx pdpe1gb rdtscp lm Constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 监视器 ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm PCID DCA sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt 热米达阿拉特 pln pts

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPUID标准函数01H是什么? 的相关文章

  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task

随机推荐

  • 我应该释放使用字符串文字初始化的 char* 吗?

    我应该自由吗char 使用字符串文字初始化变量时 对我来说 语法会让我假设它们只是堆栈分配的 但这个例子告诉我 它们不是 include
  • 如何foreach具有键值的多维数组

    我有一个带有键值的多维数组 我想循环该数组中的数据 但我不知道如何 这是我的数组 myArray Array 134 gt Array 1138 gt Array id gt 1138 qty gt 1 price gt 4900000 n
  • x64 汇编函数(调用/返回与推送/弹出/跳转)

    使用内置调用和返回指令与手动压入和弹出堆栈以及使用函数跳转之间有什么区别 从功能上讲 如果你做得正确 什么也没有 然而 它需要更多的指令和 或寄存器来模拟call ret using push pop 当然如果你真的想发挥到极致 你也可以效
  • 如何显示 JQPLOT 图形而不是长文本

    我在控制器类中有一个返回 JSON 数据的方法 public ActionResult ChartDataJSON Chart chart new Chart DataSet ds dbLayer GetChartData DataTabl
  • D3js 代码在调用两次时会复制图表而不是刷新

    这是我的 D3js 代码 function ShowGraph data var w 600 h 600 padding 36 p 31 barwidth 1 var bar height d3 scale linear domain d3
  • git分支工作流程策略

    我是 git 的新手 对 Git 有一点了解 我公司目前有1个方案 该方案分为5个产品 每个产品由不同的团队处理 目前我公司 git 有 5 个分支机构 例如 dev 该分支供开发人员构建程序 dev program com test al
  • 在 jsdom 加载的脚本中设置全局变量

    我正在尝试在 Node js 中运行一些浏览器代码以简化测试 deasync就是这个原因 目前 我使用jsdom解析唯一的html文件 起初 我试图让它也加载脚本 这些脚本链接在
  • 从文本文件中获取数据并将其显示在html表格中

    我为每一行都有一个这种模式的文本文件 Username Score 我正在尝试以此创建一个记分板 这是我的尝试 table width 200 border 1 tr td width 85 Nom td td width 99 Score
  • 如何循环访问 For 循环容器中以数字形式存储的日期值?

    我有一个For Loop Container使用日期作为InitExpression 加载日期 但该值采用数字格式 20120229 我需要这种方式 因为我无法修改它 现在 我想设置AssingExpression值以这样的方式 加载日期变
  • Oracle SQL相关更新

    我有三张桌子 t1 columns a c t2 columns a b t3 columns b c d 现在我想要的是用 t3 d 更新 t1 c 但我不能只使用 t1 c t3 c 从 t3 更新 t1 我还必须遍历 t3 b t2
  • 从 google apps 脚本发送 iso-8859-1 字符

    我正在尝试调用从谷歌应用程序脚本发送短信的服务 该服务需要 ISO 8859 1 格式的数据 下面的代码发送一条消息 其中 为坏字符 function sendSMS var doc SpreadsheetApp getActiveSpre
  • 列表上的 Groovy 点表示法

    我不明白 Groovy 中以下构造的目的 每当你有一些东西的集合时 就调用它items 您只需访问集合上的属性即可映射该属性 即 items prop items collect it prop 这对我来说看起来很奇怪 因为我认为第一个符号
  • 警告:mysqli::mysqli():(HY000/1045):[重复]中的用户“database”@“localhost”(使用密码:NO)访问被拒绝

    这个问题在这里已经有答案了 我正在尝试使用 php 连接数据库 但出现此错误 警告 mysqli mysqli HY000 1045 第 7 行 C wamp64 www Login test 2 0 connectivity php 中的
  • 如何从消息队列中删除消息(仅当其格式正确时)?

    我想从一个队列中获取消息并将其发送到数据库 我只想在特定格式下才这样做 如果我使用Receive直接调用方法 访问时出现异常Body的消息 我失去了消息 因为Receive的方法MessageQueue从队列中删除消息 为了避免丢失消息 现
  • 通用列表 - 移动列表中的项目

    所以我有一个通用列表和一个oldIndex and a newIndex value 我想将物品移至oldIndex to newIndex 尽可能简单 有什么建议么 Note 该项目应位于以下项目之间 newIndex 1 and new
  • 无法导入 facebook-sdk 4.0.1

    我有 android studio 1 1 0 我刚刚创建了一个新项目 我正在尝试导入新的 facebook sdk 4 0 1 但无法执行此操作 我遵循脸书入门 But can not get it work My app structu
  • 如何检查 URL 是否有效

    如何检查字符串是否是有效的 URL 例如 http hello it gt yes http bra ziz gt no 如果这是一个有效的 URL 我如何检查它是否相对于图像文件 Notice 正如 CGuess 所指出的 这个问题存在一
  • 单击按钮之前执行 Tkinter 按钮命令[重复]

    这个问题在这里已经有答案了 我创建了一个框架 其中我有两个浏览按钮 我想浏览两个以 txt 扩展名结尾的文件并将其打印在屏幕上 在我的场景中 在按下框架上的按钮之前浏览调用的函数 我期待当我按下按钮时它应该被调用 附完整代码 请有人纠正我做
  • Ruby `require` 调用在自定义代码上失败

    我发现我使用没有问题require加载类似 Sinatra Web 框架的东西 但我似乎无法使用require加载我自己的自定义代码 例如我有两个文件 test1 rb test2 rb test1 rb 的内容是 usr bin env
  • CPUID标准函数01H是什么?

    我需要检查ECX对于位 30 这是必要的 CPU 功能RDRAND 来自RDRAND Wiki 如果支持 则在调用 CPUID 标准功能 01H 后设置 ECX 寄存器的位 30 我不太清楚这意味着什么 标准功能01H 意思是不是EAX 8