Lendo registros específicos do modelo da CPU no linux

3

Estou executando o Ubuntu 15.10, mas também o teste no Debian. Eu tenho processador Intel i5-5675C . Eu estou usando o msr-tools-1.3 para fazer isso. Eu sou capaz de ler o registro 0x00001a2 com o seguinte comando:

rdmsr 0x00001a2

Isso me dá uma boa saída de acordo com a folha de dados. No entanto, não posso fazer nada com este valor.

Eu gostaria de ler alguns registros específicos do modelo da minha CPU associados à temperatura ou tensão ou algo útil. Informações da folha de dados:

Folha de dados Vol 1

Folha de dados Vol 2

A partir da folha de dados Vol 2: 5.2.52 IA32-IA32_THERM_STATUS ,

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

Eu recebo um erro como este. Eu tentei executá-lo em todos os 4 núcleos de CPU e habilitei modprobe e os arquivos estão presentes em / dev / cpu / {CPU_ID} / msr :

sudo modprobe msr

Aqui está a saída strace:

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, "7ELF
rdmsr 0x00001a2
 rdmsr 0x000059c0
 rdmsr: CPU 0 cannot read MSR 0x000059c0
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, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%'\v%pre%%pre%%pre%%pre%%pre%"..., 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 +++
%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%'\v%pre%%pre%%pre%%pre%%pre%"..., 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 +++
    
por Zwierzak 23.04.2016 / 10:00

3 respostas

1

Você leu mal a planilha de dados.

IA32—IA32_THERM_STATUS é um registrador de configuração no dispositivo PCI da plataforma, não um MSR da CPU. Não pode ser lido usando rdmsr .

    
por 20.07.2018 / 06:20
1

Observe a linha:

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

onde 22976 = 0x59c0 , que é o endereço MSR que você está tentando ler. O erro EIO aparece quando em msr_read funciona a chamada para rdmsr_safe_on_cpu levando a rdmsr_safe macro chamando o native_read_msr_safe resulta na exceção #GP ao executar a instrução RDMSR .

Então, sua CPU não suporta o MSR que você está tentando ler.

Mas, como apontado na resposta do duskwuff , você está lendo a folha de dados incorreta. O offset 0x59c0 é o offset relativo a MCHBAR , que aponta para o espaço memória - não é um endereço de nenhum MSR. Para encontrar o endereço MSR correto, leia Volume 3B do manual da Intel - Guia de Programação do Sistema , a saber, seu capítulo 14.4. Lá está dito que IA32_THERM_STATUS (note, não IA32—IA32_THERM_STATUS ) MSR tem endereço 0x19c.

    
por 16.05.2018 / 12:43
0

Duas coisas saltam

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

Aberto passado retornando o descritor de arquivo com valor 3

O msr registers só pode ser lido / gravado com o Root. A man page deixa isso claro.

SUDO costumava representar S uper U ser DO . No Linux moderno é mais parecido com S ubstitute U ser DO . SUDO não significa que o usuário que está executando a tarefa seja necessariamente Root. Frequentemente eleva temporariamente o status de um usuário para fazer coisas como nesse usuário. Então, enquanto você pode ter permissões de root, você pode ainda falhar na verificação de UserID == 0 .

Tente o mesmo comando em um shell de root e veja se ele falha.

    
por 03.01.2017 / 19:01