Получение температуры CPU

Тема в разделе "WASM.NT.KERNEL", создана пользователем slesh, 9 мар 2011.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Собственно говоря потребовалось получать температуру процессора (основная поддержка AMD и Intel)
    И вот парочка вопросов:
    А) Для Intel делаю следующие действия:
    1) через KeSetSystemAffinityThreadEx/KeSetAffinityThread выбираю нужное ядро
    2) Читаю значения MSR (IA32_TEMPERATURE_TARGET и IA32_THERM_STATUS)
    3) извлекаю значение из нужных битов
    4) Отнимаю от значения IA32_TEMPERATURE_TARGET значение IA32_THERM_STATUS
    5) На выходе получаю температуру.
    И вот тут вот столкнулся с одной вещь: IA32_TEMPERATURE_TARGET почему-то равен нулю, а IA32_THERM_STATUS показывает не относительное значение температуры, а абсолютное. т.е. даю нагрузку на проц, замеряю значение это, оно ростёт, хотя судя по доке должно наоборот убывать. Причем данные показываются точно такие же как и в SpeedFun
    Как быть тогда с расчетами? Или же если IA32_TEMPERATURE_TARGET = 0 то использовать IA32_THERM_STATUS как абсолютное значение, а если IA32_TEMPERATURE_TARGET != 0 то как относительное?

    Б) Для AMD почитал доки, поискал исходники. В принципе всё понятно, за исключением следующей вещи:
    Как получать данные для конкретных ядер? Как я понял KeSetAffinityThread не прокатит, так как данные читаются из портов. И тогда судя по докам надо как-то переключаться да получение данных другова ядра. А как именно это сделать - хз. В частности для 4-х ядерных систем сложность возникает. Может кто нибудь подскажет как брать инфу из разных ядер (По номеру ядра)