Что с RDTSC? Объясните.

Тема в разделе "WASM.BEGINNERS", создана пользователем Lurker, 11 авг 2005.

  1. Lurker

    Lurker New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2005
    Сообщения:
    6
    Удивительная команда RDTSC.

    Команда RDTSC - Read from Time Stamp Counter.

    $0F $31 - EDX:EAX <-- TimeStampCounter.



    Начиная с пятого поколения процессоры Intel содержат 64-разрядный счётчик времени(Time Stamp Counter), принадлежащий множеству MSR-регистров, который увеличивается на единицу на каждом такте(хотя это и не гарантируется Intel, гарантируется лишь монотонное возрастание счётчика).

    Если CPL(текущий уровень привилегий) = 0, то состояние бита регистра CR4.TSD не влияет на выполнение команды. Если CPL > 0, то значение TimeStampCounter можно прочитать лишь при CR4.TSD = 0.

    Модифицировать счётчик можно только при CPL = 0.



    Влияние на флажки: нет.

    Особые случаи R-режима: нет.

    Особые случаи P-режима: #GP(0), если CR4.TSD = 1 и CPL <> 0.

    Особые случаи V-режима: #GP(0), при попытке выполнить команду.



    ===============================================================



    ВОПРОС!



    Я обнаружил, что команда RDTSC ВЫПОЛНЯЕТСЯ(?!) в V-режиме(DOS-программы, которые используют эту команду, запускались в Windows 2000 на P4 1800 и в WindowsXP на Tualatin'е).



    В Windows 95 на P54C в V-режиме команда RDTSC НЕ РАБОТАЕТ, как ей и положено.



    Как такое возможно? Кто-нибудь может дать ответ.
     
  2. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    В WinNT-серии все проги под DOS запускаются в эмуляторе, никакого V-режима нет
     
  3. Lurker

    Lurker New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2005
    Сообщения:
    6
    Спасибо за информацию(про отсутствие V-режима в NT я ничего не знал). Не подскажете, где можно получить дополнительную информацию(я новичок в программировании под WIN32). Заранее спасибо.



    P.S.

    Наверное лучше отдельным сообщением... Но всё же

    как программа может определить режим в котором она выполняется, конкретнее как отличить V-режим от P-режима?

    Я знаю про PUSHF и SMSW, но они не помогают.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Может поможет Зубков?



    ; Проверить, не находимся ли мы уже в PM.

    mov eax, cr0

    test al, 1

    jz no_V86

    ; Сообщить и выйти

    ...

    ;Может быть, это Windows 95 делает вид, что PE = 0?

    no_V86:

    mov ax, 1600h

    int 2Fh

    test al, al

    jz no_windows

    ; Сообщить и выйти

    ...

    ; Итак, мы точно находимся в реальном режиме.

    no_windows:

    ...
     
  5. Lurker

    Lurker New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2005
    Сообщения:
    6
    Я извиняюсь, но выполнение (MOV EAX, CR0) в V-режиме приведёт к GP(0). Программа умрёт ничего не поняв.

    Вместо (MOV EAX, CR0) как раз и можно использовать (SMSW AX), эта команда выполняется всегда и везде. После её выполнения младший бит AX как раз и покажет в реальном(0) или защищённом(1) режиме выполнилась команда.



    Нельзя ли отличить V-режим от P-режима, не обращаясь к операционной системе?