Старые PC --> проблема 2000.

ПРОБЛЕМА-2000: МИФЫ И РЕАЛЬНОСТЬ. СПОСОБЫ РЕШЕНИЯ.
Введение

Только начиная с 80286-модели, IBM добавил работающие от батареи CMOS-часы реального времени (CMOS RTC) и чип памяти. По смыслу это подобно электронным наручным часам с функцией даты, плюс маленькое количество универсальной памяти на том же самом кристалле. Память CMOS содержит критичную настроечную информацию, в которой нуждается PC при загрузке, до того как он сможет обратиться к жесткому диску.

При запуске система считывает значения из часов реального времени и использует их для установки начальных времени и даты в DOS. Это выполняется BIOS (базовой системой ввода-вывода), которая является совокупностью "фирменных" резидентных подпрограмм в ROM (ПЗУ). BIOS обычно является перманентной частью системы, хотя более новые системы позволяют модернизировать BIOS с помощью специальных программ.

Раздел даты кристалла часов реального времени обновляет только 2 последние цифры года, которые прокручиваются с 99 на 00 в конце столетия. Информация о столетии не является частью часов реального времени, для нее просто отведена отдельная ячейка памяти на кристалле, значение которой обычно устанавливается в 19, и должно будет установиться в 20. Часы реального времени (RTC) не обновляют это значение на существующих системах, хотя эта особенность может стать доступной в ближайшем будущем.

На большинстве BIOS, более старших, чем год или два, часы реального времени (RTC) год и столетие читают и передают в DOS как есть, то есть когда год прокручивается с 99 на 00, в DOS передается дата 1900. Более новые BIOS читают 2 цифры года, и если эти цифры - от 00 до 79, то BIOS устанавливает цифры столетия в 20; если же значение года - от 80 до 99, BIOS оставляет цифры столетия неизмененными. Правильная дата, таким образом, передается в DOS, а BIOS может также обновить значение века в памяти так, чтобы будущие значения имели правильное столетие без корректировки столетия по двум цифрам года.

Реальные проблемы
Проблема №1 -- переход столетия при выключенном питании

DOS может отслеживать даты только с 1980 до 2099, поэтому если BIOS передает ДОСу более раннюю дату, то DOS устанавливает значение по умолчанию: 1-4-1980. Этот случай произойдет у большинства пользователей, если в их компьютерах старый BIOS, и они выключили компьютер в 1999 году, а включили в 2000 году. DOS получает дату и время один раз, при начальной загрузке, так что, если никаких дополнительных мер не будет принято, все файлы, созданные в течение сеанса, будут иметь неправильную дату. Новые файлы, созданные в 2000 году, будут казаться более старыми, чем те, которые были созданы в 1999 году, так что системы резервного сохранения могут запутаться.

Если вы не сделаете ничего перед следующим сеансом, BIOS снова сообщит о дате в начале 1900-ых, и DOS снова установит ту же самую заданную по умолчанию дату 1-4-1980 при загрузке. И тогда будет невозможно отличить более старые файлы от более новых, кроме как вручную с помощью просмотра, так как они все будут иметь одну и ту же дату создания. Это может вызвать, например, потерю новых данных при попытке резервного сохранения.

В большинстве случаев решение чрезвычайно просто: все, что вы должны сделать, это установить дату вручную при первом запуске в новом столетии. Хотя DOS читает дату часов реального времени один раз (при загрузке), она должным образом устанавливает дату часов реального времени, включая столетие, всякий раз, когда вы устанавливаете дату DOS (командой DATE). (Если ваша система связана с сетью, это может быть сделано автоматически сервером при подключении к нему). После этого в RTC сохранится правильное столетие, и BIOS будет передавать правильную дату в DOS во время всех будущих загрузок.

Проблема №2 -- переход столетия во время работы

Эта проблема как бы уже неактуальна, но для полноты информации опишу и ее.

Что случится, если система будет работать в полночь, когда меняется столетие? Это просто отодвинет необходимую установку RTC. Во время работы проблем, как правило, не возникает: если в DOS была установлена правильная дата при загрузке в 1999 году, то она должным образом перейдет на 2000 год и таким образом будет иметь правильную дату для файлов и программ. Однако, DOS автоматически не обновляет RTC, поэтому при следующей загрузке BIOS будет выдавать "1900", и вы должны будете вручную установить дату, как описано выше.

Но некоторые DOS-программы подобно Daqarta (программа, делающая из 386/486 компьютера со звуковой картой анализатор входящего сигнала с огромной массой возможностей - о ней я еще упомяну на моей странице) отключают прерывания системного таймера на длительные периоды, предохраняя их от сталкивающихся критических задач подобно сбору данных, поступающих в реальном масштабе времени. Старые игры DOS могут также отключать таймер по причинам эффективности. Это заставляет часы DOS останавливаться, и если позже прерывания таймера разрешаются после завершения критической задачи, программа должна считать правильные время и дату с RTC через BIOS и использовать их, чтобы сбросить часы DOS. Если во время отключенных прерываний таймера произошел переход столетия, BIOS выдаст год 1900, и DOS сбросит дату на 1980 год.

Обратите внимание, что эта проблема возможна только с теми программами DOS (включая игры), которые работают в "реальном режиме". Приложения Windows всегда работают в "защищенном режиме", который не дает им отключать прерываний таймера. Конечно, у подавляющего большинства приложений нет причин отключать прерывания таймера.

Проблема №3 -- проблема Award BIOS v4.50

Некоторые версии BIOS (особенно Award v4.50, сделанный между 26 апреля 1994 года и 31 мая 1995 года) имеют намного более серьезную проблему: они не позволяют устанавливать любые даты больше 1999 или меньше 1994. Что делает это столь серьезным - то, что, если при загрузке BIOS получает год вне этого диапазона из часов реального времени, то она сбрасывает дату в часах реального времени в в значение 1994.

Так как истинная дата нарушается до загрузки DOS, то любой корректирующий драйвер (через CONFIG.SYS) прочитает дату из RTC неправильно, поэтому широко распространено мнение, что эту проблему невозможно решить с помощью программного обеспечения. Пользователям обычно советуют купить специальные модули модификации BIOS, или даже заменять целиком компьютер. НЕ СЛУШАЙТЕ такие советы! Эту проблему МОЖНО решить программным путем, как и все вышеперечисленные. Как это сделать? Листайте дальше!

Мифы
Миф №1 -- миф о проблеме високосного 2000 года

Многие Y2K-программы делают большие заявки относительно испытания различных состояний високосного года. Это - полный бред: RTC имеет совершенно хороший механизм високосного года, в котором никогда не было найдено дефектов. Так как RTC не следит за столетием, не существует никакой вероятности появления проблемы в 2000 году. Испытание обработки високосного года в новом столетии имеет не больше смысла, чем проверка перехода суток в полночь, или перехода времени между 2:25 и 2:46... Столетие не имеет никакого отношения к этому.

Паникеры (aka ламеры) и торговцы тестовыми программами выдвинули идею, что есть отличие 2000 года от других високосных лет. Но что тут отличающегося? Этот год не отличается от любого другого обычного делящегося на 4 високосного года.

Обычно каждый год, который делится на 4 - високосный год, КРОМЕ лет столетий (делящихся на 100)... Но считается високосным год, делящийся на 400, что и имеет место быть в случае с 2000 годом. Так что 2000 год - обычный високосный год.

Причина для правила возвращения каждого 400-го года к високосному соответствует первоначальной причине появления високосных лет: компенсировать факт, что фактический астрономический год не точно равен 365 дням. Правило деления на 4, которое используют в старом Юлианском календаре (приписываемом Julius Caesar), полагает, что год равен 365.25 дням, и таким образом прибавляет один дополнительный день каждые 4 года. Но в действительности истинный год немного короче, ближе к 365.2422 дням. Так если использовать только правило деления на 4, то через каждые 400 лет календарная дата будет перед солнечным годом: (365.2500 - 365.2422) * 400 = 3.12 дней.

Григорианский календарь (приписанный Римскому папе Gregory XIII), который мы используем сегодня, устраняет 3 високосных года из каждых 4 столетий, так что накопленная ошибка сокращена до 0.12 дня каждые 400 лет.

Обратите внимание, что год 2100 не делится на 400, так что он не будет високосным. Это - первый год, который RTC не сможет автоматически правильно обработать. Так как дата файла DOS не может быть больше 2107, проблему "2100" не стоит учитывать... Даже если вы - очень оптимистично настроенный хранитель компьютерного музея! :)

Миф №2 -- эффект "time dilation" Crouch-Echlin'a

Этот таинственный эффект впервые наблюдал историк Jace Crouch, а позднее подтвердил программист Mike Echlin. Они утверждают, что после 2000 года некоторые часы реального времени и/или BIOSы могут начать выдавать случайные даты во время начальной загрузки.

Хотя этот "эффект" имеет некоторую славу в Internet, независимая проверка доказала иллюзорность этой ошибки, несмотря на исчерпывающие усилия Intel. Intel ни разу не смогла повторить это явление, даже на системе, которую предоставил Echlin, и на которой, по его словам, происходила ошибка. Однако, анализ Intel в результате испытаний раскрыл некоторые проблемы в тестовом коде Ечлина. Код должным образом не отключал системные прерывания в некоторых критических точках, что, возможно, и вызвало ошибочные результаты испытаний.

Конечно, некоторые умники будут рады продать вам "решение" этой "проблемы" в виде нового компьютера, но, скорее всего, лучший способ предотвратить эффект "time dilation" Crouch-Echlin'a - выбросить тестовый код Ечлина!

Впрочем, есть еще одна возможная причина проявления подобной ошибки. Заключается она... в севшей батарейке! В той, которая на старых моделях матерей впаяна и выглядит как бочонок, или вставлена в специальное гнездо и выглядит, как двухрублевая монетка. Решение просто - замените ее.

Способы решения

Данные проблемы можно решить несколькими способами: перешить BIOS, поменять микросхему BIOS, поменять материнскую плату / компьютер, использовать специальные программы / драйверы.

Перешивка / замена BIOS, замена мат. платы (компьютера)

В этих способах решения нет ничего непонятного, поэтому описывать все это не буду. Даю лишь ссылки, где можно найти программаторы BIOS, прошивки, инструкции и т.п.: Wim's BIOS page - лучший, на мой взгляд, сайт, посвященный BIOS; iXBT: Описание настроек Setup BIOS; iXBT: Советы по настройке BIOS Setup.

Программный способ решения

Если у вас 386 или старый 486, то BIOS перешить невозможно, а тратить деньги на замену материнской платы, как правило, нет смысла. В этом случае и помогут специальные программы и драйверы, которые могут работать под DOS, Windows 3.x / 9x. Ниже - описание нескольких таких программ и драйверов с ссылками. Если захотите скачать - тыкайте в название программы в заголовке. Обратите внимание: данные драйвера решают проблему даты для BIOS и DOS, но не для программ, в которые при их разработке не была встроена поддержка 2000 года.

Y2Kure от DaQarta (26 Kb)

Одна из лучших. Грузится как драйвер из config.sys. В памяти занимает 128 - 256 байт. Решает практически все проблемы, описанные выше. При этом полностью бесплатна. Это - толковое описание на русском, а это - на английском (оригинал - отсюда).

Y2K RTC/BIOS/OS Patch от Юрия Медведева

Круче - только яйца :) Российская разработка, работает даже лучше некоторых аппаратных корректоров. К сожалению, в сети уже более недоступна. Раньше лежала здесь: http://y2k.2000.ru/. Резидентная программка, запускающаяся из autoexec.bat, в памяти занимает до 1Кб. Единственный недостаток - платная (14,5$) :( Бесплатная будет работать всего 30 дней.

Y2koff от Polaris Software (4 Kb)

Резидентная программка, запускающаяся из autoexec.bat. Может лечить BIOS, в котором дата не ставится выше 1999 года. Бесплатна. Придумана в России :) Краткое описание на русском - здесь.

CompaqY2k от Compaq (6 Kb)

Драйвер, загружается из config.sys. Решает большинство проблем. Бесплатен. Здесь - сопроводиловка на английском.


назад, в натуре назад

(c) 2001 InSkin