我组装了一台新电脑,为了省钱,我没有买 Windows,所以我第一次尝试使用 Ubuntu 16.04 的 Linux。我知道 lm-sensors 是获取所需信息的标准方法,这些信息实际上只是电压,特别是 VCore。我希望能够监控 VCore 电压以便于超频(因为我的主板不允许固定电压,所以我无法通过自动 VID 监控危险电压)。
我安装了以下相关软件包:lm-sensors(v. 1:3.4.0-2)、libsensors4(v. 3:4.0-2)、libsensors-applet-plugin0(v. 3.0.0+git5-0.1ubuntu1)
CPU是i5-6600K,主板是华擎Z170A-X1/3.1
我运行后sensors-detect
发现,它找到的唯一传感器是 coretemp。它被添加到我的模块中,并且它对温度测量很有效。以下是运行传感器的示例输出:
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0: +47.0°C (high = +80.0°C, crit = +100.0°C)
Core 0: +46.0°C (high = +80.0°C, crit = +100.0°C)
Core 1: +47.0°C (high = +80.0°C, crit = +100.0°C)
Core 2: +34.0°C (high = +80.0°C, crit = +100.0°C)
Core 3: +45.0°C (high = +80.0°C, crit = +100.0°C)
我怀疑需要一个额外的传感器来获取电压,因为大多数指南都显示,sensors-detect
这会导致添加更多的模块,而不仅仅是核心温度。在我的例子中,发现了一个未知设备,它怀疑这可能是一个传感器……
Some Super I/O chips contain embedded sensors. We have to write to
standard I/O ports to probe them. This is usually safe.
Do you want to scan for Super I/O sensors? (YES/no): y
Probing for Super-I/O at 0x2e/0x2f
Trying family `National Semiconductor/ITE'... No
Trying family `SMSC'... No
Trying family `VIA/Winbond/Nuvoton/Fintek'... Yes
Found unknown chip with ID 0xd121
(logical device B has address 0x290, could be sensors)
Probing for Super-I/O at 0x4e/0x4f
Trying family `National Semiconductor/ITE'... No
Trying family `SMSC'... No
Trying family `VIA/Winbond/Nuvoton/Fintek'... No
Trying family `ITE'... No
我曾经dmesg
查看过内核环形缓冲区中提到的地址 0x290,并发现了这一行,这对我来说基本上是难以理解的,但我把它放在这里供您参考。
[ 0.206389] system 00:00: [io 0x0290-0x029f] has been reserved
此外,我还有其他应用程序,它们能够显示的信息有限。例如,I-NEX 有点像 Windows 上的 CPU-Z(如果您知道的话,请推荐一些更好的应用程序),它仅限于基本的 CPUID 内容,例如处理器 ID 字符串、光刻技术、插槽类型、支持的功能等。CPU VCore 和其他字段均未报告任何内容。无论我的 BIOS 超频设置如何,时钟速度、BLCK 速度、倍频器、涡轮时钟都报告为默认值(这是不正确的,因为我可以使用系统监视器监视 CPU 速度)。这类工具可能都依赖于 lm-sensors,我认为这是我的问题的根源,所以这并不奇怪。
我也尝试过使用 WINE 运行 CPU-Z,但结果基本相同:显示基本的 CPUID 信息,但没有显示我正在寻找的更详细的传感器信息。这是在初始化过程中发生错误之后:错误代码 0x2(2)。
这仅仅是主板不受支持的情况吗?如果是这样,是否会添加支持?有没有什么方法可以手动添加支持?有没有 lm-sensors 的替代品?有没有其他方法,例如,手动接近硬件级别并通过 bash 以某种方式访问电压?我是否应该尝试重新安装不同的版本/发行版?如果是这样,我是否一定会丢失此安装及其文件?
答案1
您可以使用以下方法监控最新(SNB 及更高版本)英特尔 CPU 上的核心电压:
watch -n1 'echo "scale=2; $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192" | bc'
具体来说:
sudo rdmsr 0x198 -u --bitfield 47:32
这将读取 MSR_PERF_STATUS MSR,并提取十进制的第 32 至 47 位,其中包含核心电压:
接下来,我们将其bc
通过管道传输至除以 8192:
echo "scale=2; $(...)/8192" | bc
指定scale=2
2 位小数,因为默认值 0 将始终显示 1V!
最后,我们将整个东西传递给watch -n1
它,重复执行命令(每秒一次)并显示输出。如果您只想获取电压,则只需要单引号内的部分。
1安装后msr-tools
,该命令需要它rdmsr
。
答案2
Wine 不会让您到达处理器的 ring0。这是可以执行特权指令的地方。
Linux 提供了一个内核模块 msr.ko,允许读取/写入英特尔架构软件开发人员手册中描述的特定型号寄存器。与 AMD 在其 BIOS 和内核开发人员指南中一样
https://software.intel.com/en-us/articles/intel-sdm
http://developer.amd.com/resources/developer-guides-manuals/
对于 6600K,您可能幸运地在其数据表中找到电压信息。将查询 PCI 以获取值。
您将在 MSR 寄存器和 CPUID 指令的帮助下编写算法来获取处理器 Turbo 比率,并使用两个 TSC 读取(按间隔采样)估算 BCLK。
加速频率是比率和基本时钟的乘积
我已经编写了 CoreFreq,它将在 vcore 旁边显示频率和空闲状态。请随意挖掘源代码中的算法: