Главная страница Visual 2000 · Общий список статей

Y2K — не спешите выбрасывать свои ПК
Проблема BIOS — существует ли она?

Андрей Колесов

© 1999, Андрей Колесов
Авторский вариант. Статья была опубликована c незначительной литературной правкой в газете "Модус" № 10/99, с. 9)

Абстрактные рассуждения о грядущих сбоях...
Что такое BIOS?
В чем проблема с часами?
Очень старый персональный компьютер
Конфликты часов продолжаются
Что же делать?


Абстрактные рассуждения о грядущих сбоях...

Абстрактные рассуждения о грядущих сбоях компьютерных систем довольно часто содержат глубокомысленную фразу о том, что "ошибки могут быть в программах и технике". Мысль, вообще, совершенно верная — ошибки могут быть везде и появляются они не только в связи с приближением 2000 года. Чем иначе объяснить существование целой индустрии ремонта техники и постоянного выпуска заплаток для ПО?

Но, шутки в сторону — какие же опасности подстерегают пользователей со стороны техники, собственно самих ПК? Вопрос этот представляет еще больший интерес в связи с тем, что производители компьютеров уже начали давление на рынок, выдвинув громкий лозунг "только модели нынешнего года отвечают требованиям 2000 года". При этом на вопрос — а отвечают ли этим требованиям модели 1999 года — обычно следует тихий ответ: "не знаем, мы их не проверяли". Или более решительный: "Видите ли, говорят, что не все старые BIOS поддерживают переход к 2000-му году. Конечно, мы готовы предложить специально разработанные нами решения этой проблемы, но это будет совсем не бесплатно."

Прежде чем разобраться с BIOS, хотелось бы обратить внимание на такой принципиальный вопрос. Пользователя интересуют не заявления производителей, а выполнение им гарантийных обязательств. В этой связи возникает вопрос: кто должен платить за устранение явного дефекта в технике, выпущенной всего четыре-пять лет назад? Обратите внимание, что поломка, связанная с износом материала, и ошибка, заложенная в алгоритм, — это две большие разницы.

Что же касается BIOS, то тут все может оказаться совсем не так страшно. Судя по всему, если у Вас и возникнут проблемы с системными часами 1 января 2000 года, то Вы их легко сможете решить без смены ПК, операционной системы и пр.

В начало статьи

Что такое BIOS?

Одной из ключевых идей архитектуры персонального компьютера (с момента его создания в 1982 году) была реализация некоторого набора системных функций с помощью программ, записанных в постоянном запоминающем устройстве (ПЗУ), которое размещается на одной из микросхем на системной плате. По старинке этот набор микрокоманд называется BIOS (Basic Input-Output System — базовая систем ввода-вывода), хотя их функции уже давно вышли за пределы функций ввода-вывода.

На производстве таких микросхем в мире специализируется несколько фирм, наиболее известные из которых — American Megatrends и Award Software. Задачей BIOS является не только автоматизация стандартного набора команд (ПЗУ дешевле и работает быстрее, чем оперативная память), но и увязка между собой отдельных электронных компонентов ПК и стыковка с ними собственно программ пользователя. Поэтому при аппаратном обновлении компьютера (например, при установке нового более мощного процессора) порой (но далеко не всегда) бывает нужно установить и новый BIOS.

Раньше для этого просто меняли микросхему (она стоила 10-15 долл.), но в последнее время в качестве ПЗУ используется флэш-память, которая позволяет вносить исправления в код программным образом. То есть c дискеты или через Web считывается программа, которая корректирует содержимое BIOS. Так что, если и раньше обновление BIOS было несложной задачей, то сегодня это делается еще проще (специалистом, конечно же).

Одной из задач BIOS является поддержка часов текущего времени/даты, диапазон работы которых в соответствии со спецификациями персональных компьютеров (определенных еще в 1982 году) равен с 01.01.1980 до 31.12.2099.

Отсчет ведется с помощью учета сигналов, поступающих из аппаратного таймера, и вопрос заключается в том, каким образом производится начальная установка даты (и времени) в момент включения компьютера. В первых моделях IBM PC, включая XT (выпускалась до 1988 года), по умолчанию устанавливалась дата 01.01.1980, которую пользователь должен был вручную корректировать при каждой загрузке компьютера.

Начиная с модели IBM PC AT (процессор i286), в середине 80-х годов в составе BIOS появился специальный блок памяти (CMOS) для хранения набора параметров, которые управляют режимами работы BIOS. Эти данные могут меняться, но при этом их надо между включениями компьютера. Коррекция данных параметров, как правило, выполняется только вручную самим пользователем (а скорее — специалистом по обслуживанию ПК), причем только в момент загрузки компьютера, до запуска операционной системы. Для этого нужно сразу после включение ПК нажать определенную клавишу (обычно это Delete — сообщение с названием клавиши появляется на экране) и вы попадете в зашитую в BIOS программу под названием типа BIOS CMOS Setup Utilily.

В составе CMOS есть встроенные электронные часы, которые работают постоянно, в том числе и при выключенном ПК. Для этого используется специальный подзаряжаемый аккумулятор, от которого питаются логические схемы часов.

Раньше аккумулятор применялся и для питания самой памяти CMOS, а его работа доставляла большую головную боль. Во-первых, аккумуляторы со временем работали хуже или просто разряжались, если ПК долго не включался (это может произойти и сейчас). Во-вторых, память иногда очищалась из-за внешне незаметных бросков питания. Так что приходилось записывать значения хранимых там параметров на бумажку и периодически восстанавливать их вручную. В последние несколько лет такая проблема стала большой экзотикой — производители научились делать качественные аккумуляторы. К тому же сегодня в качестве CMOS используется энергонезависимая флэш-память, а питание нужно только для поддержки работы логических схем, в том числе и часов.

В начало статьи

В чем проблема с часами?

Проблема заключается в наличии двух часов в системе: электронных, которые работают всегда, и системных программных часов BIOS, которые функционируют только во включенном состоянии ПК. Алгоритм их взаимодействия выглядит примерно следующим образом:

1. В момент загрузки ПК программные часы в качестве начального значения берут время электронных часов.

2. При установке пользователем даты/времени в явном виде производится соответствующая коррекция обоих часов. В остальное время часы работают совершенно независимо друг от друга.

Так вот, программные часы, с которыми имеет дело пользователь, работают правильно всегда — с 1980 по 2099. А вот электронные действительно дают определенные сбои (совершенно непонятно, с какой стати). Кроме того, возможны некоторые коллизии в работе этих двух механизмов учета времени. Но они решаются (если вообще имеют место) довольно элементарно, без особых усилий со стороны пользователя.

В начало статьи

Очень старый персональный компьютер

Честно говоря, найти ПК, в котором имеется ошибка в электронных часах, было очень непросто. Но я нашел такой: компьютер типа IBM PC AT/386SX, BIOS выпуска 1992 года компании Amеrican Megatrends версии 2.60, операционная система — MS-DOS 4.01 (1989 год). В общем, раритет.

Встроенные часы рассчитаны на работу с 1900 по 2099 года. Но в них есть дефект: при переходе от 31.12.1999 к 01.01.2000 электронные часы вместо 2000 года устанавливают 1900, затем определив эту дату, как недопустимую, сразу устанавливают 04.01.1980. Отсчет часов работает правильно.

Протестировать такую ситуацию можно следующим образом:

1. Запустите свой ПК и откройте сессию MS-DOS. Далее в командной строке DOS наберите команду DATE и введите дату 31.01.1999. Затем командой TIME введите время 23:59. Выключите ПК.

2. Через 2-3 минуты включите ПК и посмотрите дату в операционной системе (той же командой DATE). Если увидите 01.01.2000, все O'кэй. Если что-то другое, ...

3. ...то введите еще раз нужную дату — 01.01.2000 с помощью команду DATE. Перезагрузите свой компьютер еще раз. Скорее всего, с этого момента все будет работать нормально в 21-м веке, в том числе и электронные часы: ошибка в них состояла только в том, что они автоматически не могли изменить 19 на 20.

ПРИМЕЧАНИЕ. Работу электронных часов вы можете также проверить непосредственно утилитой BIOS CMOS Setup при перезагрузке ПК. В этом случае Вы будете видеть на экране прямое отражение встроенных часов.

Если Вам удалось обнаружить ошибку, описанную выше в пункте 2, то советую провести еще один эксперимент.

1. Установите дату и время как 31.12.1999 и 23:59. Не выключайте компьютер и подождите несколько минут. Потом еще раз посмотрите в программе время и дату — со 100-процентной гарантией я обещаю вам, что там будет 01.01.2000. (Но если бы Вы смогли в этот момент прочитать значение электронных часов, то увидели бы там 01.01.1980).

2. Перезагрузите компьютер и посмотрите дату — увидите 01.01.1980.

Казалось бы вот она — классическая Y2K. Разработчики пытались сэкономить ресурсы и установили счетчик только для двух последних цифр года, к которым автоматически прибавляли слева 19. Но на самом деле это не так. Любому человеку, хоть немного знакомому с алгоритмом преобразования секунд в года, понятно, что экономия составит не более 1 копейки по ценам марта 1999 года. Часы были изначально рассчитаны на работу в 21 веке и это видно хотя бы потому, что в них правильно определяется день недели. Так что мы имеем дело с типичным дефектом (вот только вопрос — случайным или умышленным?).

Но проблема заключается в другом: почему такая ошибка сразу не исправляется на уровне DOS? Ведь очевидно, что если часы сообщают номер года 1980, то версия DOS, выпущенная в 1989 году, могла бы догадаться о том, чтобы по крайней мере предложить пользователю проверить дату. Могла бы, но не хочет.

В начало статьи

Конфликты часов продолжаются

Однако те, кто думают, что на этом конфликты BIOS-DOS/Windows заканчиваются, глубоко в этом заблуждаются. Сейчас мы рассмотрим другой случай, который реально никак не угрожает работе пользователя, но все же интересен с точки зрения вопроса о том, какие еще подвохи готовят нам ИТ-разработчики.

Для примера хотелось бы привести небольшое испытание, которое я провел на более современном компьютере, который был собран в 1998 году. Системный блок использует материнскую плату APOLLO VP3 с BIOS компании Award Software — Award Modular v. 4.51PG 1997 года. Операционная система — Windows 98 международная.

Как и раньше DOS, Windows 98 при включенном компьютере нормально поддерживает счетчик дат от 01.01.1980 до 31.12.2099. Но оказывается, что Award Modular BIOS поддерживает диапазон дат от 01.01.1994 до 31.12.2079. (Обратите внимание — диапазон почему-то гораздо уже, чем у старого BIOS 1992 года. Наверное, решили сэкономить на одном двоичном разряде стоимостью в 0,003 копейки).

Так что в диапазоне 1997-2079 BIOS и Windows работают согласованно, а для большинства пользователей ПК это вполне достаточно. Поэтому дальнейшие рассуждения связаны только с одним вопросом: почему Windows упорно отказывается сообщать пользователю об обнаруженных ею ошибках (ведь могут быть и другие проблемы с часами)?

Итак, при достижении максимальной даты CMOS просто перестает считать года — после 31.12.2079 следует 01.01.2079.

Чтобы разобраться с возможными проблемами, давайте рассмотрим несколько конкретных ситуаций:

1. Если установить в Windows дату 31.12.2079, то во включенном состоянии система перейдет к 01.01.2080 и продолжить нормально работать и дальше. Но часы BIOS будут показывать 01.01.2079 (о чем пользователь не будет знать). Какая же дата будет установлена после перезагрузки 1 января? Отвечаю: BIOS будет показывать 01.01.1997, а Windows — 01.01.1980.

2. Если установить в Windows дату 17.03.2093, то после перегрузки будут такие величины: Windows — 17.03.1993, BIOS — 17.03.1997.

3. Если установить в Windows дату 17.03.2094, то после перегрузки будут такие величины: Windows — 17.03.1994, BIOS — 17.03.1994.

Из приведенного примера видно, что BIOS при попытке записать в него значение года вне пределов его работы автоматически устанавливает 1997 (по-видимому, это связано с годом выпуска BIOS). Однако самое интересное, что Windows видит подобные глюки электронных часов, но реагирует на них очень странным образом: в одном случае берет оттуда только день и месяц, устанавливая странным образом год, в другом — полную даты. Хотя было бы гораздо логичнее и проще предупредить пользователя о том, что текущая дата, меньше 25 июня 1998 года (момент выпуска Windows 98), выглядит по крайней мере подозрительно. Получается, что система, которая отслеживает режим переключения часов с летнего на зимнее время, не хочет сообщить о совершенно явном несоответствии дат.

В начало статьи

Что же делать?

Как видим, проблемы с электронными часами действительно имеются, хотя это очень странно. Представьте себе, некая фирма стала бы выпускать обычные часы, которые будут неправильно считать дни недели. Наверное, покупатели сразу же уничтожили бы ее своими исками. В компьютерной индустрии вам по этому поводу предлагают обновить технику или ПО, заплатив за модернизацию из собственного кармана. И все, похоже, соглашаются с этим.

Тем не менее, ситуация даже с древними "проблемными" BIOS/CMOS выглядит совсем не столь драматично:

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

2. Проблема со старыми "сбойными" часами обычно заключается в том, что их нужно установить вручную один раз — при первом запуске ПК в 2000 г.

3. Реализовать автоматический логический контроль за правильностью даты можно очень легко. В этом плане глубокомысленная фраза в документах Microsoft о том, что "в новых операционных системах — Windows NT 4.0, Windows 98 — встроены логические алгоритмы, распознающие 1900 в поле года как ошибку и автоматически переустанавливающие дату на 2000" выглядит как насмешка над пользователями.

Долго же раздумывал мощный коллектив разработчиков Microsoft, прежде чем вставить процедуру, которая описывается одной строкой программного кода (на Basic):

If Right$(Date$,4) = "1900" Then Date$ = Left$(Date$,6) & "2000"

Но пользователям, которые работают со "старыми" OC Microsoft (например, DOS), совсем не обязательно бежать покупать новую систему — достаточно самому записать приведенный выше код в стартовый файл Autoexec.bat.

Однако из приведенного выше примера видно, что проблемы с часами CMOS могут произойти не только при переходе от 1999 к 2000 году. Поэтому более оптимальным представляется вариант решения, который был всем известен еще во времена компьютеров AT 286 лет десять назад. (Тогда сбои часов были обычным делом из-за несовершенства аккумуляторов.)

Для этого достаточно написать утилиту, состоящую их нескольких строчек кода (например, на Basic), которые может понять даже человек, никогда не занимавшийся программированием:

If Year(Date$) = 1998 Then ' проверка текущего года
   Beep: Beep ' Гудок
   Print "Подозрительная дата!! Проверьте дату и время:"
   Shell "Date" ' проверка и коррекция даты
   Shell "Time" ' проверка и коррекция времени
End If

Программа проверяет значение года и, если он кажется подозрительным (речь-то идет о текущем времени, а на дворе уже давно 1999 год), то предлагает пользователю проверить его и при необходимости откорректировать. Обращение к такой утилите можно вставить в Autoexec.bat, тогда проверка даты будет выполняться при каждом запуске ПК.

Конечно, более оптимальным вариантом было бы сравнение текущей даты с датой, зафиксированной где-то на диске в момент выключения ПК. Но, по-видимому, такой "сложный" алгоритм Microsoft сможет реализовать не ранее второго десятилетия 21-го века.

В начало статьи