Đọc các thanh ghi cụ thể của mô hình CPU trên linux


3

Tôi đang chạy Ubuntu 15.10 nhưng cũng thử nghiệm nó trên Debian. Tôi có Intel i5-5675C bộ xử lý. tôi đang dùng msr-tools-1.3 để làm điều đó. Tôi có thể đọc đăng ký 0x00001a2 với lệnh sau:

rdmsr 0x00001a2

Nó cung cấp cho tôi một số đầu ra tốt theo biểu dữ liệu. Tuy nhiên tôi không thể làm bất cứ điều gì có ích với giá trị này.

Tôi muốn đọc một số thanh ghi cụ thể theo mô hình từ CPU của tôi liên quan đến nhiệt độ hoặc điện áp hoặc một cái gì đó hữu ích. Thông tin dữ liệu:

Bảng dữ liệu tập 1

Bảng dữ liệu tập 2

Từ bảng dữ liệu tập 2: 5.2.52 IA32-IA32_THERM_STATUS ,

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

Tôi nhận được một lỗi như thế này. Tôi đã thử chạy nó trên cả 4 lõi CPU và đã kích hoạt modprobe và các tệp có trong / dev / cpu / {CPU_ID} / msr :

sudo modprobe msr

Đây là đầu ra 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, "\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 +++

Làm gì uname -r hiển thị và những gì bạn đang chuyển đến rdmsr?
tijko

Không có MSR 0x59c0. Bạn không thể đọc những gì không có ở đó.
MSR

Câu trả lời:


1

Bạn đã đọc sai bảng dữ liệu.

IA32—IA32_THERM_STATUS là một thanh ghi cấu hình trong thiết bị PCI nền tảng, không phải là MSR CPU. Nó không thể được đọc bằng cách sử dụng rdmsr.


Điều đó là sai! Tất nhiên bạn có thể đọc IA32_THERM_STATUS (trong hầu hết các trường hợp địa chỉ 0x19c). Nhưng bạn phải tải kernel msr trước.
abu_bua

@abu_bua Bối cảnh rất quan trọng. OP đặc biệt đề cập đến một thanh ghi được mô tả trong biểu dữ liệu với độ lệch 59c0h; thanh ghi này là một phần của thiết bị PCI nền tảng. Nó ở trang 144 của intel.com/content/dam/www/public/us/en/document/datasheets/ mẹo
duskwuff

@abu_bua thực sự điều này là đúng, và nó bổ sung cho câu trả lời của tôi. IA32—IA32_THERM_STATUS là tại MCHBAR+0x59c0 bên trong ký ức không gian. Mặc dù nó thực sự có thể đọc được IA32_THERM_STATUS thông qua giao diện MSR tại địa chỉ 0x19c, phần bù 0x59c0 mà OP tìm thấy có liên quan đến MMIO, không phải MSR. Vì vậy, chắc chắn, OP đã hiểu nhầm bảng dữ liệu.
Ruslan

Xin lỗi, tôi đã đọc sai câu hỏi của op!
abu_bua

1

Lưu ý dòng:

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

Ở đâu 22976 = 0x59c0, đó là địa chỉ MSR bạn đang cố đọc. Các EIO lỗi xuất hiện khi ở msr_read thực hiện chức năng gọi ndmsr_safe_on_cpu dẫn tới ndmsr_safe gọi macro bản địa_read_msr_safe chức năng dẫn đến ngoại lệ #GP khi thực hiện RDMSR chỉ dẫn.

Vì vậy, CPU của bạn không hỗ trợ MSR mà bạn đang cố đọc.

Nhưng, như đã chỉ ra trong trả lời bởi duskwuff , bạn đang đọc bảng dữ liệu sai. Giá trị bù 0x59c0 là giá trị bù so với MCHBAR, chỉ vào ký ức không gian - đó không phải là địa chỉ của bất kỳ MSR nào. Để tìm đúng địa chỉ MSR bạn nên đọc Tập 3B của sổ tay Intel - Hướng dẫn lập trình hệ thống , cụ thể là, chương 14.4. Có nói rằng IA32_THERM_STATUS (lưu ý, không IA32—IA32_THERM_STATUS ) MSR có địa chỉ 0x19c.


Bạn đã đúng, điều đó có nghĩa là đăng ký không tồn tại.
abu_bua

0

Hai thứ nhảy ra

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

Mở thông qua trả về bộ mô tả tệp với giá trị 3

Các msr registers chỉ có thể được đọc / ghi bằng Root. Trang nam làm cho điều này rõ ràng.

SUDO được sử dụng để đại diện cho S nâng cấp Bạn dịch LÀM . Trên Linux hiện đại giống như S thay thế Bạn dịch LÀM . SUDO không có nghĩa là người dùng thực thi tác vụ nhất thiết phải là Root. Thường thì nó tạm thời nâng cao trạng thái của người dùng để thực hiện mọi việc như người dùng đó Vì vậy, trong khi bạn có thể có quyền root bạn có thể vẫn thất bại UserID == 0 kiểm tra.

Hãy thử cùng một lệnh trong một vỏ gốc và xem nếu nó thất bại.


Nếu sự cố xảy ra với quyền, bạn sẽ không mở được tệp. Vấn đề thực tế xảy ra sau đó, vào pread, trả lại EIO.
Ruslan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.