5

Windows использует 1 января 1601 года в качестве даты начала.

Что используют часы реального времени?

Если она использует другую дату начала, преобразует ли Windows свою метку времени (потому что она использует свою дату и время) в свою собственную? Как?

3 ответа3

6

Часы RTC экономят время в CMOS-памяти с батарейным питанием (в настоящее время это просто более интегрированный чип, имитирующий старые модели). Карта памяти CMOS довольно стандартна на ПК-совместимых компьютерах. В соответствии с этими картами памяти CMOS:

 00h Seconds       (BCD 00-59, Hex 00-3B) Note: Bit 7 is read only
 01h Second Alarm  (BCD 00-59, Hex 00-3B; "don't care" if C0-FF)
 02h Minutes       (BCD 00-59, Hex 00-3B)
 03h Minute Alarm  (BCD 00-59, Hex 00-3B; "don't care" if C0-FF))
 04h Hours         (BCD 00-23, Hex 00-17 if 24 hr mode)
                         (BCD 01-12, Hex 01-0C if 12 hr am)
                         (BCD 81-92. Hex 81-8C if 12 hr pm)
 05h Hour Alarm    (same as hours; "don't care" if C0-FF))
 06h Day of Week   (01-07 Sunday=1)
 07h Date of Month (BCD 01-31, Hex 01-1F)
 08h Month         (BCD 01-12, Hex 01-0C)
 09h Year          (BCD 00-99, Hex 00-63)

Так что это простая математическая математика для преобразования этих полей в любой формат, который вам нравится: метки времени Unix, формат даты / времени типа DOS или любой другой.

Обратите внимание, что одно поле, отсутствующее на карте выше, это часовой пояс и настройка летнего времени. Так что, если вы используете двойную загрузку, скажем, Windows и Linux, у вас могут возникнуть проблемы. В Windows по умолчанию используется местный часовой пояс, в то время как в Linux обычно предполагается, что дата / время RTC указывается в формате UTC (что, на мой взгляд, более разумно).

3

Кажется (из osdev и Linux arch/x86/kernel/rtc.c), что RTC на платформе Intel x86 хранит дату и время как отдельные значения для секунды, минуты, часа и так далее.

Чтобы получить каждое из следующих значений даты / времени из RTC, вы должны сначала убедиться, что регистр состояния A не находится в "режиме обновления" (бит 7, значение = 0x80 сбрасывается). Затем выберите связанный "регистр CMOS" обычным способом и считайте значение с порта 0x71.

Register   Contents
   0       Seconds
   2       Minutes
   4       Hours
   6       Weekday
   7       Day of Month
   8       Month
   9       Year
  0x32     Century (usually)
  0xa      Status Register A
  0xb      Status Register B

Содержимое всех этих регистров преобразуется в метку времени NT или Unix с использованием продвинутой математики (т.е. сложение и умножение). Для примера Linux смотрите kernel/time.c:mktime в исходном коде ядра.

return ((((unsigned long)(year/4 - year/100 + year/400 + 367*mon/12 + day) + year*365 - 719499)*24 + hour)*60 + min)*60 + sec;

Кроме того, статья MSKB, на которую вы ссылаетесь, несколько устарела. Начиная с XP, Windows не проверяет RTC каждый час; вместо этого он использует NTP и пишет в RTC.

0

«Метка времени» (в основном в * nix системах или на любом C-подобном языке) обычно означает количество секунд с 00:00:00 UTC 1 января 1970 г.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .