web-dev-qa-db-ja.com

デルが電源アダプタでCPUをスロットルしないようにする

Dellラップトップで、電源アダプタがコンピュータに認識されないという古い問題が発生しています。事実、それはライン内のデータケーブルの断線に過ぎないことを知っています。正しい位置に配置すると、ケーブルが認識され、コンピューターがCPUの20%へのスロットリングを停止するためです。コンピュータを接続するたびに電源コードをいじらないように、これを無効にできる方法はありますか?

6
user173724

私はこれをいくつか調査しましたが、OEM ACアダプター(またはデータピンが壊れているもの)を検出しない場合、最近のDellラップトップがCPUをスロットリングしないようにするための良い方法はおそらくないことがわかりました。

SpeedStepを無効にしたり、「追加のスリープモード」を無効にしたり、BIOSで電力プロファイルをいじったりしても、違いはありません。すべてのオーバークロックオプションがロックアウトされているため、「Intel Extreme Tuning」ユーティリティはこれらのマザーボードをサポートしていないようですが、OEM以外の充電器が接続されている場合、CPUサーマルスロットリングが作動していると報告され、CPU-ZはFSBマルチプライヤを5倍に下げ、コア電圧を0.6ボルトに。

おそらく、BIOSは、OEM以外のアダプターが検出されたときに、マザーボードの温度の誤った測定値をCPUに送信してスロットルを調整するように設計されていると思います。デルがこのシステムを設計したとき、OEMアダプタに縛られることを非常に真剣に考えていたようです。

編集:少なくともWindowsで、不明なアダプターのスロットリングを無効にできるユーティリティを見つけました(ユーティリティがLinuxで動作するかどうか、または同様のものがあるかどうかはまだわかりません) ThrottleStop 「BD PROCHOT」と呼ばれるチェックボックスがあり、無効にするとCPUコア電圧と乗数が通常にリセットされます。どうやらこれは「CPUへの2方向の信号経路です。これにより、マザーボードやGPUなどのラップトップの他のコンポーネントがCPUに信号を送信して、CPUが高すぎると見なすように仕向けることができます。機能」は、未知のACアダプターが検出されたときにこの信号をCPUに送信することにより、BIOSによって実装されます。

13
Bitrex

これは、Cコンパイラ/ GCCでコンパイルできる(OSに依存しないasprintfの実装がある限り)OSに依存しないプログラムであり、システムの起動時に自動的に実行するように設定すると、これらのIntelベースのラップトップでのスロットルが無効になります。プログラムの実行前に「msrtools」がインストールされ、スタートアップファイルに「modprobe msr」があり、プログラムのroot権限でXubuntuを実行するDell Inspiron 5558ラップトップでこれを正常に使用して、ユーザー側からMSRレジスタを読み書きできるようにしました(他のOSでは、「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;
}
2
Bitrex

-Intel-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は最大で実行されます!

0
ZAP