O que é a data inicial para o relógio em tempo real? [fechadas]

5

O Windows usa 1º de janeiro de 1601 como data de início.

O que o relógio em tempo real usa?

Se ele usa data de início diferente, o Windows converte seu registro de data e hora (porque usa sua data e hora) em sua próprio? Como?

    
por DrStrangeLove 08.11.2011 / 16:02

3 respostas

6

O relógio RTC economiza seu tempo na memória CMOS com suporte de bateria (atualmente, é apenas um chip mais integrado que emula designs mais antigos). O mapa de memória CMOS é bastante padrão em computadores compatíveis com PC. De acordo com estes documentos do mapa de memória 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)

Portanto, é uma matemática de calendário simples para converter esses campos para qualquer formato que você desejar: timestamps do Unix, formato de data / hora do tipo DOS ou o que for.

Observe que um campo que falta no mapa acima é o fuso horário e a configuração DST. Então, se você for dual-boot no Windows e no Linux, você pode ter problemas. O Windows é padronizado para o seu fuso horário local, enquanto o Linux geralmente assume que a data / hora do RTC é UTC (o que é mais sensato na minha opinião).

    
por 08.11.2011 / 16:46
3

Parece (de osdev e Linux arch/x86/kernel/rtc.c ) que o RTC na plataforma Intel x86 mantém o datetime como valores separados para segundos, minutos, horas e assim em.

To get each of the following date/time values from the RTC, you should first verify that Status Register A is not in "update mode" (Bit 7, value = 0x80 is clear). Then select the associated "CMOS register" in the usual way, and read the value from Port 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

O conteúdo de todos esses registradores é convertido para um timestamp NT ou Unix usando matemática avançada (isto é, adição e multiplicação). Para um exemplo de Linux, consulte kernel/time.c:mktime na origem do kernel.

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

Além disso, o artigo do MSKB vinculado está um pouco desatualizado. A partir do XP, o Windows não verifica o RTC a cada hora; ele usa o NTP e grava no o RTC.

    
por 08.11.2011 / 16:46
0

a 'Timestamp' (principalmente em sistemas * nix, ou qualquer linguagem semelhante a C) geralmente significa o número de segundos desde 00:00:00 UTC em 1 de janeiro de 1970

    
por 08.11.2011 / 16:19