Сайт радиолюбителей Республики Коми.

: главная: странички:

Данные микросхемы CMOS персональных компьютеров IBM PC/AT.

Персональные компьютеры IBM PC/AT имеют в своем составе микросхему энергонезависимой памяти и часов (CMOS), которая предназначена для непрерывного отсчета текущего времени и хранения установок конфигурации компьютера, пароля пользователя и другой служебной информации. Более подробное описание CMOS приведено в [1].

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

Однако с течением времени происходит старение батареи и окисление ее контактов, что может привести к полной потере информации записанной в CMOS. Несмотря на то, что данная микросхема содержит всего на всего 64 байта памяти, для доступа к этим ячейкам требуется особый подход.

Дело в том, что эта микросхема имеет медленные циклы обращения, и разработчики компьютера сделали обращение к ячейкам памяти данной микросхемы через адресный регистр. Так для того, чтобы обратиться к микросхеме по какому то адресу, необходимо вначале записать этот адрес в регистр ввода/вывода 70h, а затем прочесть или записать данные через регистр ввода/вывода 71h.

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

Справочная информация содержимого CMOS

======================================================================

00h-09h, 32h: Ячейки часов (37h для PS/2)

======================================================================

00h - секунды;

01h - секунды будильника;

02h - минуты;

03h - минуты будильника;

04h - часы;

05h - часы будильника;

06h - день недели;

07h - день месяца;

08h - месяц;

09h - год (2 младшие цифры);

32h - век-1 (2 старшие цифры года);

37h - век-1 (2 старшие цифры года) в PS/2;

======================================================================

0Ah: Статусный регистр A:

======================================================================

Бит 7 - обновление времени: 0=готов к чтению

Биты [6:4] - делитель частоты, для 32,768 кГц = 010

Биты [3:0] - выходная частота меандра 1024 Гц _10

====================================================================
h: Статусный регистр B:

=====================================================================Бит 7 - остановка часов: 0=нормальный ход.

Бит 6 - разрешение периодических прерываний: 0=запрещено.

Бит 5 - разрешение прерывания от будильника: О=запрещено.

Бит 4 - разрешение прерывания по окончании смены времени: 0=запрещено.

Бит 3 - разрешение выходного меандра (см. регистр 0Ah): 0=запрещено.

Бит 2 - BCD/BIN формат: 0јD.

Бит 1 - 12/24-часовой режим: 1$-часовой.

Бит О - зимнее/летнее время: О=переключение запрещено

====================================================================

h: Статусный регистр C:

=====================================================================Бит 7 - общий запрос прерывания.

Бит 6 - периодические прерывания.

Бит 5 - прерывание от будильника.

Бит 4 - прерывание по смене времени.

Биты [3:0] - зарезервированы

====================================================================h: Статусный регистр D:

=====================================================================Бит 7 - питание: 1=норма, О=разряд батареи.

Биты [6:0] - зарезервированы

====================================================================

h: Байт статуса диагностики

=====================================================================Бит 7 - 1= терялось питание CMOS.

Бит 6 - 1= ошибка контрольной суммы CMOS.

Бит 5 - 1= ошибка конфигурации.

Бит 4 - 1= несоответствие размера ОЗУ, определенного тестом,

записи в CMOS.

Бит 3 - 1= ошибка при инициализации жесткого диска.

Бит 2 - 1= нет формальной ошибки часов-календаря

например: 30 февраля, 25 часов.

Биты [1:0] - зарезервированы

====================================================================9h: Код остановки - используется POST для определения причины остановки:

====================================================================00=аппаратный или программный сброс;

01=paзmep памяти определен;

02=тест памяти прошел;

03=тест памяти выявил ошибку;

04=POST завершен, идет загрузка системы;

05=JMP FAR [0:0467h] с инициализацией контроллера прерываний;

06=тест защищенного режима прошел;

07=тест защищенного режима выявил ошибку;

08=ошибка при определении размера памяти;

09=перемещен блок расширенной памяти;

OA=JMP FAR [0:0467h] без инициализации контроллера прерываний;

ОВ=используется 80386

====================================================================10h: Типы НГМД:

====================================================================Биты [7:4] - дисковод А

Биты [3:0] - дисковод В

0=нет, 160 Кбайт, 2=1.2 Мбайт, 3r0 Кбайт, 4==1.44 Мбайт

====================================================================11h: Зарезервирован

====================================================================12h: Типы НЖМД:

====================================================================Биты [7:4] - привод 0;

Биты [3:0] - привод 1:

0=нет, 1-Еh=типы 1-14, Fh=тип в байте 19h

(для второго привода - в 1Ah)

====================================================================13h: Зарезервирован

====================================================================14h: Установленное оборудование:

====================================================================Биты [7:6] - количество НГМД: 00=1, 01=2.

Биты [5:4] - тип первичного видеоадаптера:

00 - EGA или VGA,

01 - CGA, 40 столбцов,

10 - CGA, 80 столбцов,

11 - MDA, 80 столбцов.

Биты [3:2] - зарезервированы.

Бит 1 - есть математический сопроцессор.

Бит О - есть НГМД

====================================================================15h-16h: Размер базовой памяти, Кб (Low/High) 0280hd0K

====================================================================17h-18h: Размер расширенной памяти, Кб (Low/High)

====================================================================19h-1Ah: Расширенный тип диска С, D (в PS/2 - зарезервированы)

====================================================================1Bh-2Dh: Зарезервированы

====================================================================2Eh-2Fh: Контрольная сумма CMOS с 10h по 20h (High/Low)

====================================================================30h-31h: Реальный размер расширенной памяти, Кб (Low/High)

====================================================================32h-33h: В PS/2 контрольная сумма CMOS с 1Oh по 31h (High/Low)

====================================================================33h: Флаги POST:

====================================================================Бит 7 - наличие 128 Кбайт ОЗУ под границей 1 Мбайт:

1 = есть доступная теневая память.

Бит 6 - SETUP флаг:

1 = первая загрузка после выполнения SETUP, обычно установлен О

====================================================================34h-3Fh: Зарезервированы для пользователя

====================================================================38h-3Fh: В PS/2 пароль, доступ по несуществующим адресам 78h-7Fh

====================================================================

Для восстановления этой информации можно воспользоваться средствами самого компьютера, с помощью внутренней программы SETUP, которая имеется практически в каждом компьютере IBM PC и вызывается при включении компьютера одновременным удержанием клавиш Ctrl+Alt+Del (как правило).

Но с помощью SETUP можно восстановить лишь заводские установки, которые переписываются из микросхемы BIOS в CMOS. Такие же специфичные установки, как тип винчестера или код привязки защищенного программного обеспечения к компьютеру не могут быть восстановлены стандартными средствами и бесследно теряются.

Рис.1.

С целью предотвращения данной ситуации, я предлагаю две простых программы написанные мною на языке "С".

  • Первая из них под названием "cmos_rd", позволяет прочесть содержимое CMOS и сохранить его в файле с именем "cmos.bin" - рис.1.
  • Вторая программа с именем "cmos_wr", записывает данные из файла "cmos.bin" в CMOS.

Таким образом, с помощью первой программы Вы можете считать информацию из CMOS и сохранить ее в виде файла на винчестере или дискете.

Затем при необходимости восстановления содержимого CMOS Вы воспользуетесь второй программой и перепишите данные из сохраненного файла в CMOS.

Ниже приведены тексты описанных программ.

/*===================================================================*/

/* Программа чтения CMOS с выводом данныї на дисплей /*

/* и записую в файл cmos.bin /*

/* Файл:cmos_rd.c */

/* Дата:11.03.1999 */

/* (C) О. Валупа */

/*===================================================================*/

#include <stdio.h>

#include <dos.h>

main()

{

FILE *file1;

unsigned char i,k;

int n=0;

int mas[64];

file1=fopen("cmos.bin","w+b");

for(k=0;k<64;k++)

{

outportb (0x70,k);

mas[k] = inportb (0x71);

}

printf ("Read CMOS\n");

for(k=0;k<8;k++)

{

for(i=0;i<8;i++)

{

printf ("%2Xh=%2x ",n,mas[n]);

putc(mas[n],file1);

n++;

}

printf ("\n");

}

}

/*===================================================================*/

/* Программа записи в CMOS данныї из файла cmos.bin */

/* Файл:cmos_wr.c */

/* Дата:11.03.1999 */

/* (C) О. Вальпа */

/*===================================================================*/

#include <stdio.h>

#include <dos.h>

main(argc,argv)

int argc;

char **argv;

{

register char **p;

FILE *file1;

unsigned char i,k;

int n=0;

int mas[64];

if(argc == 1)

{

printf("\nПрограмма записывает данные из файла cmos.bin в CMOS\n");

printf("\nПример исполузования программы: cmos_wr cmos.bin\n");

exit(0);

}

if (( file1 = fopen(argv[1],"rb") )==NULL) exit(0);

for(k=0;k<65;k++)

if((mas[k]=getc(file1))==EOF) break;

if(k != 64)

{

printf("\nНеверная длина файла cmos.bin\n");

exit(0);

}

for(k=0;k<64;k++)

{

outportb (0x70,k);

outportb (0x71, mas[k]);

}

printf ("Write CMOS\n");

for(k=0;k<8;k++)

{

for(i=0;i<8;i++)

{

printf ("%2Xh=%2x ",n,mas[n]);

putc(mas[n],file1);

n++;

}

printf ("\n");

}

}

Кроме того, программа "cmos_rd" отображает содержимое CMOS на экране дисплея и если вы захотите сохранить информацию CMOS в виде отображаемом на экране, то можно воспользоваться стандартной командой перенаправления вывода операционной системы MS DOS: "cmos_rd > cmos.dat", где cmos.dat - имя файла в который будет записана информация CMOS.

Ниже приведен дамп памяти CMOS из файла cmos.bin полученную описанными программами на моем компьютере.

Дамп памяти CMOS из файла cmos.bin

000000: 34 55 52 27 10 00 00 11 03 99 26 02 50 80 00 00 4UR'......&.P...

000010: 40 C3 F0 F0 03 80 02 00 7C 2F 00 00 C4 95 00 00 @.......|/......

000020: 00 00 00 00 00 00 EC 22 0F FF FF EB 22 3F 09 D3 ......."...."?..

000030: 00 7C 19 80 00 01 00 00 00 10 00 03 90 C1 80 50 .|.............P

Скачать программы для работы с CMOS - 19,1kb.

О. Вальпа sandh@yandex.ru

http://www.sandh.narod.ru

Литература:

1. Гук М. Аппаратные средства IBM PC. Энциклопедия. - СПб.: ПитерКом, 1998.-816с.: ил.

Rambler's Top100
Rambler's Top100 Рейтинг ресурсов УралWeb
Copyright © Russian HamRadio
Hosted by uCoz