Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Тактовая частота проца


Автор: pvn 10.12.2006, 21:17
Как можно в Ассемблере определить тактовую частоту процессора? Может кто знает с помощью какой функции и какого прерывания?

Автор: 10110111 11.12.2006, 22:14
Ну, вообще-то, по-моему, с помощью прерываний это затруднительно, но, если проц Pentium Pro (если не ошибаюсь, он) или выше, то можно с помощью rdtsc и системного таймера.
Код

    push    0
    pop    ds
    mov    eax,dword [8*4]
    mov    word [8*4],IRQ0Handler
    mov    word [8*4+2],cs
    mov    ds,word [8*4+2]
    mov    dword [OldHandler],eax
LP:
    cmp    byte [Flag],1
    jne    LP
    mov    eax,dword [Freq]
    mov    edx,dword [Freq+4]
    mov    ecx,65536
    mov    ebx,1193180
    mul    ebx
    div    ecx
;Теперь в EAX значение частоты в герцах
;Здесь какой-то код
    retn
IRQ0Handler:
    pushad
    rdtsc
    push    ds
    push    cs
    pop    ds
    cmp    byte [Flag],0ffh
    jne    NotFF
    mov    byte [Flag],0
    jmp    IntRet
NotFF:
    sub    eax,dword [Freq]
    sbb    edx,dword [Freq+4]
    mov    byte [Flag],1
    mov    ecx,[OldHandler]
    push    0
    pop    ds
    mov    dword [8*4],ecx
IntRet:
    mov    dword [cs:Freq],eax
    mov    dword [cs:Freq+4],edx
    pop    ds
    mov    al,20h
    out    20h,al
    popad
    iret


Автор: chyapay 7.1.2007, 17:45
а в защищенном режиме?? возможно ли? я имею в виду если в собственном бут-страп коде или в кернеле сделать подобную функцию и каждый раз после загрузки системы ее результат куда-то ложить чтобы потом ОС могла выдавать его прогам под их спрос. кроме того, согласитесь, и самой ОС неплохо бы знать тактовую частоту проца.

Автор: Ant 2.3.2007, 11:25
chyapay, а как же Qool'n'Que?

Автор: Mikl__ 21.5.2007, 11:31
Если интересноsmile

Автор: MAKCim 21.5.2007, 12:04
если есть поддержка ACPI, то можно узнать готовое значение частоты (поле CoreFreq объекта _PSS)

Автор: Mikl__ 22.5.2007, 03:34
MAKCim, 
Цитата

если есть поддержка ACPI, то можно узнать готовое значение частоты (поле CoreFreq объекта _PSS)

 smile 

Автор: MAKCim 22.5.2007, 12:43
Mikl__, 
Это сложно
Код

; FASM
acpi:
    mov eax, 0xDFFF8 ; сканируем адреса 0xE0000 - 0xFFFFF в поисках RSDP
    xor ebx, ebx
@@:
    add eax, 8
    test eax, 0x100000
    jnz __end ; not found
    cmp dword [eax], 0x20445352 ; младшие 32 бита сигнатуры RSDP
    jnz @B
    cmp dword [eax + 4], 0x20525450 ; старшие 32 бита сигнатуры RSDP
    jnz @B
    mov eax, dword [eax + 16] ; адрес RSDT
    add eax, 72 ; адрес таблицы адресов остальных таблиц
@@:
    mov ebx, dword [eax] ; адрес заголовка таблицы
    cmp ebx, 0x50434146 ; ищем FADT по сигнатуре заголовка
    jnz @B
    mov eax, dword [eax + 76] ; получаем адрес DSDT из таблицы FADT
    add eax, 36 ; адрес AML кода
    mov ebx, eax
__end:
    mov eax, ebx
    ret

код находит адрес AML кода и возвращает его в EAX (если ACPI не поддерживается, возвращает 0)
AML код кодирует по определенным правилам объекты и методы, среди объектов надо найти _PSS и прочитать значение CoreFreq
для интерпретации AML кода нужен AML-интерпретатор  smile 

Автор: Mikl__ 23.5.2007, 03:32
MAKCim
большое спасибо, а как получить частоту CPU из BIOS'а в Protect Mode? 

Автор: MAKCim 23.5.2007, 08:52
Цитата(Mikl__ @  23.5.2007,  03:32 Найти цитируемый пост)
большое спасибо, а как получить частоту CPU из BIOS'а в Protect Mode?  

если знаешь, где она лежит в BIOS, то просто читаешь из этой области памяти
(если включен страничный режим, дополнительно нужно отобразить 0xE0000 - 0xFFFFF на виртупльное адресное пространство)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)