Точное определение частоты CPU

Тема в разделе "WASM.ASSEMBLER", создана пользователем mr_Infern0, 4 май 2007.

  1. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    Pavia разве в п4 нет термодиода с который проц якобы сам опрашивает (в обход всяких ХВ мониторов)? я где то читал что там 2 термодиода один на HW монитор идёт второй на вунтр схемы сравнения Thermal Control Circuit ..
     
  2. Ken

    Ken New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2009
    Сообщения:
    7
    я целых 2 дня как подорванный дизассемблировал CrystalCPUID, пока не наткнулся на код:

    Код (Text):
    1. ;
    2.  
    3.         call    ds:timeGetDevCaps ; Query the timer device to determine its resolution
    4.         mov ecx, [ebp-1A0h]
    5.         push    ecx
    6.         call    ds:timeBeginPeriod ; Set the minimum timer resolution
    7.                     ; for an application or device driver
    8. ...
    9.         call    getMSR
    10. ...
    11.         call    ds:timeEndPeriod ; Clear a previously set minimum timer resolution
    12.         mov edx, [ebp-228h]
    13.         push    edx
    14.         call    ds:ReleaseMutex
    15.         mov eax, [ebp-228h]
    16.         push    eax
    17. ...
    18.         retn
    И у меня сложилось впечатление, что каким-то образом эта прога вычисляет скорость по времени и тактам.

    Например, вот так:

    taktBgn = rdtsc;
    mtimeBgn = getMicroTime;
    .........
    res = (rdtsc - taktBgn) / (getMicroTime - mtimeBgn).

    Вот и получается точное количество тактов в секунду (а процедура timeGetDevCaps вроде бы берет на аппаратном уровне). Хотя кто знает... думаю, почему в CPUID производители не засунут точную инфу о процессоре?
     
  3. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Потому что, в результате допущенной десятилетием-двумя ранее неразберихи условий, эта информация не будет точной. Скорее наоборот, она сбивать с толку и быть еще одним источником глюков ОС и прочего ПО, - а значит, как минимум она будет бесполезной, и как максимум - вредной.
    Предположим, в CPUID некоего процессора зашили его родную частоту, скажем, 1900 MHz. Это заранее накладывает недетские ограничения 1) на производителей железа (напр., в BIOS только фикс. частоты, без возможности выбора, во избежание проблем с работой ПО); 2) на пользователей (без возможности разгона, по той же причине); 3) на производителя процессора (один и тот же процессор нельзя промаркировать другим напряжением питания и другой частотой для специфичных узких областей применения).
    Кроме того, до сего момента в процессорах такой информации нет, а теперь вдруг появится - что тогда? Практически никому она нужна не будет - метод "ручного" определения частоты ядра будет применяться и далее в программах как более универсальный и, зачастую, достоверный.
    Вот если бы в процессоре был некий регистр, отражающий кол-во тактов за последние 10-100 мс (для чего потребуется как минимум внутренний генератор тактов, например, как в low-end Microchip PIC - 4 MHz) - вот это было бы неплохо. Но это невыгодно - старые методы вроде всех устраивают (в смысле, мировых контор-писателей ПО), а нагромождение лишних схем влечет за собой как дополнительные траты на производство, так и повышенное энергопотребление конечного изделия.
     
  4. Ken

    Ken New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2009
    Сообщения:
    7
    Мечты, конечно... ну хотя бы номинальную частоту сделали бы, помогло бы при определении производительности для всякого рода приложений. Например, на какой скорости следует запускать игру ;) А хотя я согласен, смысла в этом - никакого.
     
  5. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Ken

    Почему только такой вариант? А если так: при startup BIOS вычисляет (возможно, довольно точно) по тем же тактам текущую частоту CPU и пишет ее в один из MSR. Косвенно (мне) это подверждает дизасм SMI-hadnler'а: при запросе он (в большинстве случаев) читает - сам или через call-back'и в BIOS'е - MSR.

    Если есть возможность и немного времени, посмотри plz что в MSR и не похоже ли это на Hz и какой регистр читает эта прога.
     
  6. Ken

    Ken New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2009
    Сообщения:
    7
    Именно в этой проге я не смог обнаружить, что в MSR есть указатель герц.
     
  7. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    а всётаки до микрухи клокера никак не достучаться чтоб считать fsb и множитель? откуда CPU-Z берёт и fsb и множитель и т. п. явно не rdtsc..?
     
  8. Ken

    Ken New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2009
    Сообщения:
    7
    Судя по документации intel.com в MSR есть частота FSB, но только для процессоров намного более технологичнее моего, а так я не смог ничего обнаружить. Я и сам давно об этом хотел узнать. Возможно, нужно прямое обращение к BIOSу... увольте, не знаю :)

    Тут есть кое-что http://osdir.com/ml/kernel.cpufreq/2004-01/msg00011.html по FSB из MSR. Там еще есть такие строки:

    /* decode the FSB: see IA-32 Intel (C) Architecture Software
    - * Developer's Manual, Volume 3: System Prgramming Guide,
    - * revision #12 in Table B-1: MSRs in the Pentium 4 and
    - * Intel Xeon Processors, on page B-4 and B-5.
    - */

    Нужно обратиться к мануалу по процессорам.
     
  9. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    из msr как я понял можно множитель достать а fsb вычислить разделив внутр частоту на множитель... в intel core уже в готовом виде можно fsb получить.
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Когда я занималсо SMI я также дампил (для других целей) MSR-регистры. Если верно помню, частота была 1.6.

    ps Могу выложить idb с моим анализом SMI+BIOS - если кому будет интересно.

    Ken, есть возможность посмотреть твой файл?
     
  11. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    ps 1.6 ГГц, что такое "внутренняя частота" я не знаю ;)
     
  12. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    PSR1257 FSB - частота внешней (системной) шины, после умножителя "внутренняя" - частота ядра то бишь :)
     
  13. Ken

    Ken New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2009
    Сообщения:
    7
    По поводу внутренней частоты.

    http://www.msclub.ce.cctpu.edu.ru/bibl/ASVT/asvt14.htm

    В принципе, здесь тоже все сказано http://function.name/in/Assembler/RDMSR и особенно заинтересовала секция 26..24 CLKMD (Clock Mode) в MSR 1002H

    Файл idb у меня слишком большой, и не в этом дело. Просто все программы, которые я дизассемблировал (около 5-6), определяют частоту, используют Tls, EnterCriticalSection ... туда я не добрался.

    И вот еще нашел:
    Код (Text):
    1. #define MSR_IA32_PERF_STATUS 0x198
    2.  
    3.  
    4.         {
    5.  99         u8 current_multiplier, current_voltage;
    6. 100
    7. 101         /* Print voltage and multiplier */
    8. 102         rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
    9. 103         current_voltage = lo & 0xff;
    10. 104         printk(KERN_INFO "eps: Current voltage = %dmV\n",
    11. 105                 current_voltage * 16 + 700);
    12. 106         current_multiplier = (lo >> 8) & 0xff;
    13. 107         printk(KERN_INFO "eps: Current multiplier = %d\n",
    14. 108                 current_multiplier);
    15. 109         }
    http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/arch/x86/kernel/cpu/cpufreq/e_powersaver.c

    Я извиняюсь, что так много ссылок. писать неохота ужо
     
  14. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    хмм.. попытался считать 0x198 рег и BSOD... :dntknw:
     
  15. V1lko

    V1lko New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    53
    Бэ-бэ-бэ...
     
  16. V1lko

    V1lko New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    53
    Вот программка, выводящая частоту процика в Мгц. Писал на TASM'е, вроде работает...
    Код (Text):
    1. TITLE     Cpu
    2. JUMPS
    3. .MODEL    SMALL
    4. .STACK    100h
    5. .DATA
    6. Time   dd   ?
    7. TimeCounter   dd   17 dup(?)
    8. DeltaT   dd   16 dup(?)
    9. AverageTime   dd   ?
    10. Buffer   db   8 dup(0)
    11. .CODE
    12. .386
    13. Start:
    14.    mov    ax,@DATA                    
    15.    mov    ds,ax                       ;Инициализация сегмента данных
    16.    xor    ax,ax                                  
    17.    mov    es,ax                       ;ES на область данных БИОС'а
    18.    mov    eax,[es:046Ch]
    19.    mov    [Time],eax                  ;Сохраняем значение таймера
    20.    call   WaitTimer                   ;Вызов процедуры, ожидающей изменение значения таймера
    21.    mov    bx,17                       ;Замеряем начальные моменты для 17 интервалов
    22.    mov    di,offset TimeCounter
    23. @@t0:
    24.    call   WaitTimer
    25.    db     0Fh,31h                     ;RDTSC
    26.    mov   [di],eax
    27.    add    di,4
    28.    dec    bx
    29.    jnz    @@t0
    30.    mov    bx,16                       ;Вычисляем длительность 16 интервалов в тактах
    31.    mov    di,offset TimeCounter
    32.    mov    si,offset DeltaT
    33.    xor    edx,edx
    34. @@t1:
    35.    mov    eax,[di+4]
    36.    sub    eax,[di]  
    37.    mov   [si],eax
    38.    add    edx,eax                     ;Накопление суммы значений
    39.    add    di,4
    40.    add    si,4
    41.    dec    bx
    42.    jnz    @@t1                                    
    43.    shr    edx,4                       ;Вычисляем среднюю длительность интервала
    44.    mov   [AverageTime],edx    
    45.    mov    eax,[AverageTime]
    46.    mov    edx,1193180
    47.    mul    edx                         ;Умножаем среднее значение на частоту генератора системного таймера
    48.    shrd   eax,edx,16                  ;Делим результат на коэффициент пересчета системного таймера 65536
    49.    xor    edx,edx
    50.    mov    ebx,1000000      
    51.    div    ebx                         ;Вычислить частоту в МГц (разделить на 1000000)
    52.    mov    di,offset Buffer
    53.    call   Word2Str                    ;Переводим число в строку
    54.    lea    dx,Buffer
    55.    mov    ah,09h                      
    56.    int    21h                         ;Выводим частоту процика на экран
    57.    mov    ah,07h                      ;Ждём пока юзер нажмёт клавишу
    58.    int    21h  
    59.    mov    ax,4C00h                    ;Завершение программы                  
    60.    int    21h
    61. WaitTimer   proc
    62.    mov    eax,[Time]
    63. @@T:
    64.    cmp    eax,[es:046Ch]
    65.    je     @@T    
    66.    mov    eax,[es:046Ch]
    67.    mov    [Time],eax
    68.    ret
    69. WaitTimer   endp
    70. Word2Str   proc                       ;Процедура преобразования числа в строку (10)                                      
    71.    push   di
    72.    xor    cx,cx
    73.    mov    bx,0Ah
    74. DivideDec:
    75.    xor    dx,dx
    76.    div    bx                        
    77.    add    dx,30h                    
    78.    push   dx                          
    79.    inc    cx
    80.    cmp    ax,00h
    81.    jnz    DivideDec                  
    82. ReverseDec:
    83.    pop    ax                        
    84.    mov   [di],ax
    85.    inc    di
    86.    loop   ReverseDec
    87.    mov    byte ptr[di],'$'              
    88.    pop    di
    89.    ret
    90. Word2Str   endp
    91. End Start
    Пользуйтесь на здоровье..!
     
  17. Ken

    Ken New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2009
    Сообщения:
    7
    мда, V1lko, это-то ясно. Тут вопрос не только в частоте, но и в множителе. Exp10der, а ты это из pmode делал и 0-го кольца? хотя... прочесть msr и из 1 уже не получиться...
     
  18. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    А так же она дергает SMI в случае выхода за допустимые пределы питающих напряжений(авария) + остановки кулера(ов) (если Enable в BIOS)... ну и периодические таймерные SMI сюда подмешиваются, доки на южниый мост об этом нам рассказывают.
    Не был, не встречал такого и это его большой недостаток. Да даже если бы и был механизм прерываний им же еще упралять надо, реагировать на него...., а находясь в обработчике SMI отреагировать на другое преравание смысла не имеет, а если допустить, что SMI будет, скажем как в COM порту дергаться по приходу каждого байта, то это вообще бешенные зартаты и еще большее убиение тактов CPU на такую дурную почти холостую работу.
     
  19. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    Ken хы... а система в БСОД не валится если експшн из 3-ринговой проги, что ринг 0 это и коню понятно, тем более в мануале от интелла подробно описаны условия выполнения rdmsr и wrmsr, я это из самописного дрова кстати читаю :) 10h регистр (TSC) кстати нормально читается, думал может 198h рег както проинициализировать надо перед чтением...
     
  20. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Exp10der

    Когда я стал читать MSR я сразу же словил GPF и написал (видимо, это где-то документировано?) тупо:

    Код (Text):
    1. DumpMSRregisters proc near
    2.   pushad
    3.   push es
    4. ; Install GPF handler
    5.   push 0
    6.   pop  es
    7.   mov  word ptr es:[13*4],offset GPFhandler
    8.   mov  word ptr es:[13*4+2],cs
    9.   push ds
    10.   pop  es
    11.   mov  ecx,0
    12. @@DumpMSRs:
    13.   push ecx
    14.   xor  edx,edx
    15.   xor  eax,eax
    16.   rdmsr
    17.   ...
    18.   cmp  ecx,2FFh
    19.   jbe  @@DumpMSRs
    20.   pop  es
    21.   popad
    22.   retn
    23. @@NextCommand:
    24.   xor  eax,eax
    25.   ...
    26.   jmp  @@ContinueDumpMSRs
    27. DumpMSRregisters endp
    28. GPFhandler proc
    29.   add  sp,6
    30.   jmp  @@NextCommand
    31. GPFhandler endp