RTC баг на многоядерном ядре Windows XP

Тема в разделе "WASM.SOFTWARE", создана пользователем xpmod21, 30 май 2021.

Статус темы:
Закрыта.
  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Почему то я не удивлен:
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    xpmod21,

    > RTC таймера приблизительно +2 секунды за 1 минуту

    Может в начале нужно определить каким образом время бежит, у системы есть и другие таймеры(тск к примеру уже откалиброван), но как этот говнософт определяет что системное время не корректно, относительно чего!?

    Арифм. вычисления на основе каких то тиков - это бред полный. Да есчо и константами забить:
    Код (Text):
    1.  int period1 = 1, period2 = 16;
    2. sprintf( txt, "%d ms (%.1f s)", (num == 1) ? period1 : period2, duration/1000.0);
    ;)
     
    Последнее редактирование: 11 ноя 2021
  3. xpmod21

    xpmod21 Забанен

    Публикаций:
    0
    Регистрация:
    30 май 2021
    Сообщения:
    128
    Синхронизируете время по интернету или ложите рядом с ПК наручные часы или используете любой источник точного времени. Сложно не заметить уход +20 секунд за 10 минут накрутки.

    Таже самая разница видна и в утилите CPU-Z, в режиме тестирования таймеров.

    [​IMG]


    Используйте утилиту для накрутки времени. Единственное что она делает - это дергает предделитель RTC таймера. При переключении каждые 0.2 секунды происходит "накрутка" системного времени +2 секунды за каждую минуту.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    ... потому что windows xp (как и любая другая) подобным источником точного времени не является.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    xpmod21,

    Если выключить rtc, время бежит" ?
     

    Вложения:

    • rtc.7z
      Размер файла:
      965 байт
      Просмотров:
      148
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Не, ну я, конечно, очень рад, что два хрлюба наконец-то объединились для достижения высшей цели.
     
  7. xpmod21

    xpmod21 Забанен

    Публикаций:
    0
    Регистрация:
    30 май 2021
    Сообщения:
    128
    Пожалуйста, прикладывайте к архиву исходник, чтобы понимать функционал данных ехе-шников.
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    xpmod21,

    Код (Text):
    1. // KeTimeSynchronization - This variable controls whether time synchronization
    2. //      is performed using the realtime clock (TRUE) or whether it is under the
    3. //      control of a service (FALSE).
    4. //
    5.  
    6. BOOLEAN KeTimeSynchronization = TRUE;
    Код (Text):
    1.        case SystemTimeAdjustmentInformation:
    2.  
    3.             //
    4.             // If the system information buffer is not the correct length,
    5.             // then return an error.
    6.             //
    7.  
    8.             if (SystemInformationLength != sizeof( SYSTEM_SET_TIME_ADJUST_INFORMATION )) {
    9.                 return STATUS_INFO_LENGTH_MISMATCH;
    10.             }
    11.  
    12.             //
    13.             // If the current thread does not have the privilege to set the
    14.             // time adjustment variables, then return an error.
    15.             //
    16.  
    17.             if ((PreviousMode != KernelMode) &&
    18.                 (SeSinglePrivilegeCheck(SeSystemtimePrivilege, PreviousMode) == FALSE)) {
    19.                 return STATUS_PRIVILEGE_NOT_HELD;
    20.             }
    21.  
    22.             //
    23.             // Set system time adjustment parameters.
    24.             //
    25.  
    26.             TimeAdjustmentInformation =
    27.                     (PSYSTEM_SET_TIME_ADJUST_INFORMATION)SystemInformation;
    28.  
    29.             Enable = TimeAdjustmentInformation->Enable;
    30.             TimeAdjustment = TimeAdjustmentInformation->TimeAdjustment;
    31.  
    32.             if (Enable == TRUE) {
    33.                 KeTimeAdjustment = KeMaximumIncrement;
    34.             } else {
    35.                 if (TimeAdjustment == 0) {
    36.                     return STATUS_INVALID_PARAMETER_2;
    37.                 }
    38.                 KeTimeAdjustment = TimeAdjustment;
    39.             }
    40.  
    41.             KeTimeSynchronization = Enable;
    42.             break;
     
  9. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Ну задача-то любопытная сама по себе, мне даже захотелось ковырнуть, но времени нет.
    Инде, если решите и выложите подробное объяснение, с меня 50$ на пивас :drinks:
     
  10. xpmod21

    xpmod21 Забанен

    Публикаций:
    0
    Регистрация:
    30 май 2021
    Сообщения:
    128
    Запуск rtc_off.exe (и rtc_on.exe) на "накрутку" времени не влияет.

    [​IMG]
     
  11. Artem_N

    Artem_N Artem N

    Публикаций:
    0
    Регистрация:
    1 мар 2009
    Сообщения:
    74
    Инде не барыга! Но тоже готов добавить $50 за решение задачи.
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Ну да, вы ему скините по 50 баксоф на карту Беларусбанка, а его тут же аверы и менты набутылят. Вы разве забыли? В РБ к барыгам очень строго относятся. Можно только ставя людям розетки зарабатывать.
     
  13. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Да на него досье у всех спецслужб мировых. Не набутыливают только потому что Батька все надеется что Инде валюту в страну принесет.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Зачем ты ему сказал, щас у него новая параноя начнется.
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Получается вот что.

    Код (Text):
    1. typedef struct _KUSER_SHARED_DATA {
    2.  
    3.     //
    4.     // Current low 32-bit of tick count and tick count multiplier.
    5.     //
    6.     // N.B. The tick count is updated each time the clock ticks.
    7.     //
    8.  
    9.     ULONG TickCountLowDeprecated;
    10.     ULONG TickCountMultiplier;
    11.  
    12.     //
    13.     // Current 64-bit interrupt time in 100ns units.
    14.     //
    15.  
    16.     volatile KSYSTEM_TIME InterruptTime;
    17.  
    18.     //
    19.     // Current 64-bit system time in 100ns units.
    20.     //
    21.  
    22.     volatile KSYSTEM_TIME SystemTime;
    Код (Text):
    1. KeUpdateSystemTime:
    2.  
    3. ;
    4. ; Update interrupt time.
    5. ;
    6. ; N.B. The interrupt time is updated in a very strict manner so that an
    7. ;      interlock does not have to be used in an MP system to read time.
    8. ;
    9.  
    10.         mov     ecx,USER_SHARED_DATA    ; set address of user shared data
    11.         mov     edi,[ecx].UsInterruptTime+0 ; get low interrupt time
    12.         mov     esi,[ecx].UsInterruptTime+4 ; get high interrupt time
    13.         add     edi,eax                 ; add time increment
    14.         adc     esi,0                   ; propagate carry
    15.         mov     [ecx].UsInterruptTime+8,esi ; store high 2 interrupt time
    16.         mov     [ecx].UsInterruptTime+0,edi ; store low interrupt time
    17.         mov     [ecx].UsInterruptTime+4,esi ; store high 1 interrupt time
    18.  
    19.         sub     _KiTickOffset,eax       ; subtract time increment
    20.         mov     eax,_KeTickCount+0      ; get low tick count
    21.         mov     ebx,eax                 ; copy low tick count
    22.         jg      kust10                  ; if greater, not complete tick
    23.  
    24. ;
    25. ; Update system time.
    26. ;
    27. ; N.B. The system time is updated in a very strict manner so that an
    28. ;      interlock does not have to be used in an MP system to read time.
    29. ;
    30.  
    31.         mov     ebx,USER_SHARED_DATA    ; set address of user shared data
    32.         mov     ecx,[ebx].UsSystemTime+0 ; get low interrupt time
    33.         mov     edx,[ebx].UsSystemTime+4 ; get high interrupt time
    34.         add     ecx,_KeTimeAdjustment   ; add time increment
    35.         adc     edx,0                   ; propagate carry
    36.         mov     [ebx].UsSystemTime+8,edx ; store high 2 interrupt time
    37.         mov     [ebx].UsSystemTime+0,ecx ; store low interrupt time
    38.         mov     [ebx].UsSystemTime+4,edx ; store high 1 interrupt time
    39.         mov     ebx,eax                 ; restore low tick count
    RTC -> HalpClockInterrupt -> KeUpdateSystemTime(). При этом приращение SystemTime + KeTimeAdjustment: CONST.

    InterruptTime + f(HalpClockInterrupt()) ->
    reg."EnableTimerWatchdog" по дефолту не задействован.
    const HalpCurrentClockRateIn100ns
    const HalpCurrentClockRateAdjustment
    var NtSetTimerResolution -> HalpClockSetMSRate/HalpNextMSRate.. etc.

    - логика становится не линейной. Между тем timeGetTime() читает не SystemTime, а InterruptTime:

    Код (Text):
    1.     mov edx,[7FFE000C]
    2.     mov eax,[7FFE0008]
    Если смещения изменить на SystemTime(7FFE000C -> 7FFE0018 etc), то в cpuz тулзе тайминг не изменяется. Только я проверить не могу, он не плавает на вирте.
     
  16. xpmod21

    xpmod21 Забанен

    Публикаций:
    0
    Регистрация:
    30 май 2021
    Сообщения:
    128
    Кидайте что нужно проверить. Желательно проектом (с исх. кодом) для понимания происходящего. Плюс может у кого параллельно возникнет правильная мысль.

    Судя по тому, что в Вин7 данный предделитель жестко заблокирован на 1 мс. Наверное нормального решения не нашли даже Майкрософт программисты, окромя обойти проблему, жестко заблокировав работу предделителя на 1 мс.
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    xpmod21,

    Походу я понял в чём косяк.

    QPC может выбираться разный, по дефолту tsc, на котором у меня время не бежит. Включаю ACPI таймер, время бежит и кстате это второе прерывание для апдейта часиков, кроме rtc. Дефотный tsc 64 битный, но PMT - 24-х и тайминг переполнения ~4сек. При этом измеряемое timeGetTime() значения от запуска системы, при калибровке через QPC(PMT) накапливается ошибка, замер не должен длиться более нескольких секунд. Это баг в самих приложениях.

    pmt.png
     
  18. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    А с чего ты решил, что выборка значения этого таймера происходит реже 4 секунд? Просто потому что так может быть?
     
  19. xpmod21

    xpmod21 Забанен

    Публикаций:
    0
    Регистрация:
    30 май 2021
    Сообщения:
    128
    И самое главное - почему этот глюк не проявляется (ровно на том же ПК) при загрузке ХП в режиме однопроцессорного ядра?
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    0xffffff/3579545

    xpmod21,

    Потому что в качестве qpc используется 64-бит tsc. На скрине два ISR и параметры внизу написаны.
     
Статус темы:
Закрыта.