3

Я использую Ubuntu 15.10, но тестирую и Debian. У меня процессор Intel i5-5675C . Я использую msr-tools-1.3, чтобы сделать это. Я могу прочитать регистр 0x00001a2 с помощью следующей команды:

rdmsr 0x00001a2

Это дает мне хороший вывод в соответствии с таблицей. Однако я не могу ничего сделать с этим значением.

Я хотел бы прочитать некоторые специфичные для модели регистры из моего процессора, связанные с температурой или напряжением или что-то полезное. Информация о технических характеристиках:

Спецификация Том 1

Спецификация Vol 2

Из таблицы данных том 2: 5.2.52 IA32-IA32_THERM_STATUS,

 rdmsr 0x000059c0
 rdmsr: CPU 0 cannot read MSR 0x000059c0

Я получаю ошибку, как это. Я попытался запустить его на всех 4 ядрах процессора и включил modprobe, и файлы присутствуют в /dev/cpu/{CPU_ID}/msr:

sudo modprobe msr

Вот следующий результат:

sudo strace rdmsr 0x59c0
execve("/usr/sbin/rdmsr", ["rdmsr", "0x59c0"], [/* 25 vars */]) = 0
brk(0)                                  = 0x84d000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe87cb3f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=92026, ...}) = 0
mmap(NULL, 92026, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe87cb28000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\v\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1869392, ...}) = 0
mmap(NULL, 3972864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe87c554000
mprotect(0x7fe87c714000, 2097152, PROT_NONE) = 0
mmap(0x7fe87c914000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7fe87c914000
mmap(0x7fe87c91a000, 16128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe87c91a000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe87cb27000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe87cb26000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe87cb25000
arch_prctl(ARCH_SET_FS, 0x7fe87cb26700) = 0
mprotect(0x7fe87c914000, 16384, PROT_READ) = 0
mprotect(0x602000, 4096, PROT_READ)     = 0
mprotect(0x7fe87cb41000, 4096, PROT_READ) = 0
munmap(0x7fe87cb28000, 92026)           = 0
open("/dev/cpu/0/msr", O_RDONLY)        = 3
pread(3, 0x7ffcd2bddf78, 8, 22976)      = -1 EIO (Input/output error)
write(2, "rdmsr: CPU 0 cannot read MSR 0x0"..., 40rdmsr: CPU 0 cannot read MSR 0x000059c0
) = 40
exit_group(4)                           = ?
+++ exited with 4 +++

3 ответа3

1

Вы неправильно прочитали таблицу данных.

IA32—IA32_THERM_STATUS - это регистр конфигурации в устройстве PCI платформы, а не MSR ЦП. Он не может быть прочитан с помощью rdmsr .

1

Обратите внимание на строку:

pread(3, 0x7ffcd2bddf78, 8, 22976)      = -1 EIO (Input/output error)

где 22976 = 0x59c0 , то есть адрес MSR, который вы пытаетесь прочитать. Ошибка EIO возникает, когда в функции msr_read вызов rdmsr_safe_on_cpu, приводящий к макросу rdmsr_safe, вызывающему функцию native_read_msr_safe, приводит к исключению #GP при выполнении инструкции RDMSR .

Итак, ваш процессор не поддерживает MSR, который вы пытаетесь прочитать.

Но, как указано в ответе duskwuff, вы читаете не ту таблицу. Смещение 0x59c0 - это смещение относительно MCHBAR , которое указывает на область памяти - это не адрес какой-либо MSR. Чтобы найти правильный адрес MSR, вы должны прочитать Том 3B руководства Intel - Руководство по системному программированию, а именно его главу 14.4. Там сказано, что IA32_THERM_STATUS (обратите внимание, не IA32—IA32_THERM_STATUS) имеет адрес 0x19c.

0

Две вещи выпрыгивают

open("/dev/cpu/0/msr", O_RDONLY) = 3

Открыть передано, возвращая дескриптор файла со значением 3

msr registers могут быть прочитаны / записаны только с Root. Справочная страница проясняет это.

SUDO раньше означало S uper U ser DO. На современных Linux больше походит S ubstitute U сер DO. SUDO не означает, что пользователь, выполняющий задачу, обязательно является Root. Часто это временно повышает статус пользователя, чтобы делать вещи, как этот пользователь. Таким образом, хотя у вас могут быть права доступа root, вы все равно можете не выполнить проверку UserID == 0 .

Попробуйте эту же команду в корневой оболочке и посмотрите, не сработает ли она.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .