阻止戴尔使用电源适配器限制 CPU 速度

阻止戴尔使用电源适配器限制 CPU 速度

我的戴尔笔记本电脑一直遇到电源适配器无法被计算机识别的老问题。我知道这只是线路中的数据线断了,因为如果我将其放置正确,数据线就会被识别,计算机就会停止将 CPU 限制在 20%。有没有什么方法可以禁用这个功能,这样我就不用每次插入计算机时都摆弄电源线了?

答案1

我对此进行了一些调查,发现当最近的戴尔笔记本电脑无法检测到 OEM AC 适配器(或数据针损坏的适配器)时,可能没有什么好的方法可以防止它限制 CPU。

禁用 SpeedStep 或“附加睡眠模式”或调整 BIOS 中的电源配置文件都无济于事。“Intel Extreme Tuning”实用程序似乎不支持这些主板,因为所有超频选项都被锁定,但当连接非 OEM 充电器时,它会报告 CPU 热节流已启用,CPU-Z 显示 FSB 倍频器降至 5 倍,核心电压为 0.6 伏。

我猜想 BIOS 的设计可能是为了在检测到非 OEM 适配器时向 CPU 发送错误的主板温度读数,从而导致其节流。看来戴尔在设计此系统时非常认真地将您锁定在 OEM 适配器上。

编辑:我发现了一个实用程序,它至少在 Windows 下可以让你禁用未知适配器限制(我还不知道该实用程序是否可以在 Linux 下运行,或者是否有类似的东西。)油门停止有一个名为“BD PROCHOT”的复选框,禁用后会使 CPU 核心电压和倍频器重置为正常值。显然,这是一条“通向 CPU 的双向信号路径。它允许笔记本电脑中的其他组件(如主板或 GPU)向 CPU 发送信号,从而欺骗 CPU 认为它太热”,这证实了 BIOS 实现此“功能”的方式是在检测到未知交流适配器时向 CPU 发送此信号。

答案2

-仅适用于英特尔 CPU-

首先在 Linux 中安装 MSR-TOOLS。

sudo apt install msr-tools

您应该通过以下命令将 msr 作为内核模块加载

sudo modprobe msr

从模型特定寄存器 (MSR) 读取值 - 0x1FC

sudo rdmsr 0x1FC

最后将值写入模型特定寄存器(MSR)-0x1FC

sudo wrmsr 0x1FC 4004d

就是这样!您的 CPU 以最大速度运行!

答案3

这是一个独立于操作系统的程序,您可以使用 C 编译器/GCC 进行编译(只要它具有可用的 asprintf 实现),并设置为在系统启动时自动运行,这应该可以禁用这些基于 Intel 的笔记本电脑上的节流,我已在运行 Xubuntu 的 Dell Inspiron 5558 笔记本电脑上成功使用了该程序,并在程序执行之前在启动文件中安装了“msrtools”并安装了“modprobe msr”,以允许从用户端读取和写入 MSR 寄存器(其他操作系统可能需要不同的命令来让“const char* cmd”读取/写入处理器寄存器位置 0x1FC,并且可能需要 root/特权用户访问可执行文件,无论采用何种形式)

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define BUFSIZE (64)

int get_msr_value(uint64_t* reg_value) {
  const char* cmd = "rdmsr -u 0x1FC";
  char cmd_buf[BUFSIZE];

  FILE* fp;

  if ((fp = popen(cmd, "r")) == NULL) {
    printf("Error opening pipe!\n");
    return -1;
  }

  cmd_buf[strcspn(fgets(cmd_buf, BUFSIZE, fp), "\n")] = 0;
  *reg_value = atoi(cmd_buf);

  if (pclose(fp)) {
    printf("Command not found or exited with error status\n");
    return -1;
  }

  return 0;
}

int main(void) {
  const char* cmd = "wrmsr -a 0x1FC";
  char* concat_cmd;
  int ret;
  uint64_t* reg_value = &(uint64_t){0};

  if ((ret = get_msr_value(reg_value))) {
    return ret;
  }

  printf("Old register value: %lu\n", *reg_value);

  *reg_value = *reg_value & 0xFFFFFFFE;  // clear bit 0

  printf("New register value: %lu\n", *reg_value);

  if (asprintf(&concat_cmd, "%s %i", cmd, *reg_value) == -1)
    return -1;

  printf("Executing: %s\n", concat_cmd);

  system(concat_cmd);
  free(concat_cmd);

  return 0;
}

答案4

“英特尔动态平台和热框架”是限制 CPU 以正常速度运行的程序。
卸载英特尔动态平台和热框架应该可以解决问题。

相关内容