| Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 
 1.3. КМОП-память и конфигурация компьютераНазначение некоторых ячеек КМОП-памяти мы уже рассматривали в разделе, посвященному конфигурации дисковой подсистемы. В этом разделе мы расскажем о назначении остальных ячеек. В КМОП-памяти хранится текущее время и дата, сведения о конфигурации системы, результат тестирования при включении питания и другая информация, приведенная в следующей таблице: 
Адрес ячейки    Содержимое
00h - 0Dh       Используются часами реального времени
0Eh     Байт состояния диагностики при
        включении питания
0Fh     Байт состояния отключения
10h     Тип используемого НГМД
11h     Зарезервировано
12h     Тип НМД (если тип меньше 15)
13h     Зарезервировано
14h     Конфигурация оборудования
15h - 16h       Объем основной памяти
17h - 18h       Объем расширенной (extended) памяти
19h     Тип первого НМД (если тип > 15)
1Ah     Тип второго НМД (если тип > 15)
1Bh - 20h       Зарезервировано
21h - 2Dh       Зарезервировано
2Eh - 2Fh       Контрольная сумма ячеек 10h - 20h
30h - 31h       Объем расширенной (extended) памяти
32h     Текущее столетие в двоично-десятичном
        коде (19h для 19-го столетия)
33h     Различная информация
34h - 3Fh       Зарезервировано
Рассмотрим подробно назначение отдельных ячеек КМОП-памяти. 00h - 0Dh - область часов реального времениЯчейки с адресами 00h - 0Dh используются часами реального времени. Часам реального времени будет посвящена отдельная глава, поэтому сейчас мы не станем останавливаться на этих ячейках. 0Eh - байт состояния диагностикиБайт состояния диагностики (расположенный в КМОП-памяти по адресу 0Eh) содержит результаты выполнения диагностики при включении питания компьютера. Выполнив анализ содержимого байта 0Eh, программа может выявить неисправность НМД, часов реального времени, разрядку аккумулятора и ошибки в конфигурации. Приведем формат этого байта: 
Бит     Значение
0-1     Не используется, равно 0;
2       0 - неправильная установка часов реального времени;
        1 - часы реального времени установлены правильно;
3       1 - неисправность НМД, невозможно загрузить
            операционную систему с жесткого диска;
        0 - НМД исправен;
4       1 - фактический размер оперативной памяти не
            соответствует указанному в КМОП-памяти;
        0 - размер оперативной памяти указан правильно;
5       1 - ошибка в конфигурации системы, фактическая
            конфигурация не соответствует указанной в
            байте конфигурации оборудования (адрес 14h);
        0 - конфигурация указана правильно;
6       1 - ошибка в контрольной сумме КМОП-памяти;
        0 - контрольная сумма КМОП-памяти правильная;
7       1 - разрядка аккумулятора, питающего КМОП-память и
            часы реального времени;
        0 - аккумулятор исправен и заряжен.
0Fh - байт состояния отключенияБайт состояния отключения 0Fh используется процессорами 80286, 80386 и 80486 для определения способа возврата из защищенного режима в реальный после аппаратного сброса. Вы, вероятно, знаете, что эти процессоры могут работать либо в реальном режиме, который соответствует режиму работы процессора 8086, либо в защищенном. Защищенный режим работы используется такими операционными системами, как OS/2, UNIX, XENIX, а также операционными оболочками WINDOWS/386 и WINDOWS версии 3.0. В этом режиме процессор может непосредственно адресовать всю память, лежащую выше границы 1 мегабайт. Подробное рассмотрение защищенного режима работы выходит за рамки данной книги. Расскажем кратко о переходе из реального режима в защищенный и обратно для иллюстрации использования ячейки КМОП-памяти с адресом 0Fh. Для перевода процессора 80286 из реального режима в защищенный можно использовать специальную команду LMSW: mov ax,1 lmsw ax Разумеется, двух строк, приведенных выше, недостаточно для правильной работы процессора в защищенном режиме. Для того, чтобы вернуть процессор 80286 из защищенного режима в реальный, необходимо выполнить аппаратный сброс (отключение) процессора. Это можно сделать следующим образом: mov ax, 0FEh ; команда отключения out 64h, ax Перед выдачей команды отключения программа должна записать в ячейку 0Fh КМОП-памяти причину отключения: 
Значение        Причина отключения
0       Программный сброс при нажатии
        комбинации клавиш CTRL-ALT-DEL или
        неожиданный сброс. Выполняется обычный
        перезапуск системы, но процедуры
        тестирования при включении питания не
        выполняются.
1       Сброс после определения объема памяти.
2       Сброс после тестирования памяти.
3       Сброс после обнаружения ошибки в памяти
        (контроль четности).
4       Сброс с запросом перезагрузки.
5       После сброса перезапускается контроллер
        прерываний, затем управление передается
        по адресу, который находится в области
        данных BIOS 0000:0467h.
6,7,8   Сброс после выполнения теста работы
        процессора в защищенном режиме.
9       Сброс после выполнения пересылки блока
        памяти из основной памяти в
        расширенную.
0Ah     После сброса управление немедленно
        передается по адресу, взятому из
        области данных BIOS 0000:0467h.
Для перевода процессоров 80386 и 80486 из реального режима в защищенный и обратно можно использовать загрузку специального управляющего регистра CR0 обычной командой MOV. Однако будет работать и метод, основанный на применении команды LMSW и команды отключения. Вы можете использовать сведения о команде отключения для организации программного перезапуска системы. 10h - тип используемых флоппи-дисков;Младшая и старшая тетрады этого байта описывают соответственно второй и первый НГМД: 
 11h - зарезервировано для AT, тип НМД для PS/2В компьютерах PS/2 ячейки КМОП-памяти с адресами 11h и 12h используются для хранения типов, соответственно, первого и второго НМД. 12h - типы первого и второго НМДЭтот байт разделен на две тетрады аналогично байту, описывающему НГМД. Однако в тетраде можно закодировать только 16 различных значений, а типов НМД значительно больше. Поэтому тип 15 используется специальным образом - если тип НМД в младшей тетраде (диск C:) равен 15, то правильное значение типа находится в КМОП-памяти по адресу 19h. Аналогично для диска D: этот тип можно взять из байта по адресу 1Ah (если старшая тетрада байта с адресом 12h равна 15). Таблица используемых типов дисков была приведена в третьей книге первого тома, в разделе, посвященном конфигурации дисковой подсистемы. Кроме того, сведения о типах дисков, задаваемых программой SETUP, обычно приводятся в документации, поставляемой вместе с компьютером. 13h - зарезервированоЭта ячейка КМОП-памяти зарезервирована для дальнейшего развития системы. 14h - конфигурация оборудованияВ этом байте находится информация о количестве установленных НГМД, о наличии арифметического сопроцессора 80287 или 80387 и о типе используемого дисплейного контроллера. Приведем формат байта конфигурации: 
Бит     Значение
0       1 - в системе установлены НГМД;
        0 - НГМД не используются;
1       1 - установлен арифметический сопроцессор 80287 или
            80387;
        0 - арифметический сопроцессор не установлен;
2-3     не используются, равны 0;
4-5     тип дисплейного контроллера и его режим:
        Биты:   5    4
                        0       0       - не используется или EGA;
                        0       1       - CGA, EGA, VGA в режиме 40x25;
                        1       0       - CGA, EGA, VGA в режиме 80x25;
                        1       1       - монохромный контроллер;
6-7     количество используемых НГМД:
        Биты:   7       6
                        0       0       - установлен 1 НГМД
                        0       1       - установлен 2 НГМД
                        1       0       - установлен 3 НГМД
                        1       1       - установлен 4 НГМД
15h-16h - объем основной памятиЯчейка 15h содержит младший байт, а ячейка 16h - старший байт объема основной памяти. Например: 0100h - 256K 0200h - 512K 0280h - 640K 17h-18h - объем дополнительной памятиЯчейки 17h и 18h содержат, соответственно, младший и старший байты размера дополнительной памяти (расположенной выше границы 1 М) в килобайтах. 19h-1Ah типы первого и второго НМДЭти ячейки содержат типы, соответственно, первого и второго НМД, если соответствующий тип имеет значение, большее 15 (см. описание ячейки 12h). 1Bh-2Dh - зарезервированоЭти ячейки КМОП-памяти зарезервированы для дальнейшего развития системы. 2Eh-2Fh - контрольная сумма ячеек 10h - 20h Для ячеек КМОП-памяти с адресами от 10h до 20h при инициализации системы BIOS выполняет проверку контрольной суммы. Эта контрольная сумма хранится также в КМОП-памяти в ячейках 2Eh и 2Fh (соответственно, старший и младший байты). 30h-31h - объем дополнительной памятиЯчейки 30h и 31h содержат, соответственно, младший и старший байты размера дополнительной памяти (расположенной выше границы 1 М) в килобайтах. Эта информация дублирует аналогичную информацию, расположенную в ячейках с адресами 17h-18h. 32h Текущее столетиеВ машинах IBM AT этот байт содержит текущее столетие в двоично-десятичном коде, т.е. 19 столетие записано как 19h. PS/2 использует эту ячейку вместе с ячейкой 33h для хранения контрольной суммы ячеек с адресами от 10h до 31h. При этом старший байт контрольной суммы хранится в ячейке 32h, а младший - 33h. 33h - различная информацияДля IBM AT этот байт используется программой SETUP. 34h-3Fh - зарезервированоЭто поле вы можете использовать по своему усмотрению, например, хранить здесь пароль. PS/2 использует ячейку с адресом 37h для хранения номера текущего столетия. Ячейки 38h-3Fh в модели 50 компьютера PS/2 используются для хранения пароля. Обращение к этим ячейкам выполняется по адресам 78h-7Fh, которые аппаратно отображаются на адреса 38h-3Fh. Приведем две маленькие программы, демонстрирующие приемы работы с КМОП-памятью. Первая программа записывает в ячейки 34h-3Fh строку символов, вторая отображает эту строку, а также некоторые другие ячейки. 
#include <stdio.h>
#include <stdlib.h>
main() {
// Эта строка будет записана в КМОП-память
  static char password[12] = "!Frolov A.V.";
  int i,j;
  printf("\n*Запись в CMOS* ©Фролов A. 1991\n\n");
  for(i=0x34,j=0; i<0x40; i++,j++) {
// Задаем адрес ячейки КМОП-памяти
    outp(0x70,i);
// Выполняем запись в эту ячейку
    outp(0x71,password[j]);
  }
}
Программа для чтения содержимого КМОП-памяти: 
#include <stdio.h>
#include <stdlib.h>
main() {
  unsigned char cmos[164];
  int i;
  printf("\n*Чтение из CMOS* ©Фролов A. 1991\n\n");
// Читаем все 64 ячейки КМОП-памяти в массив cmos
  for(i=0; i<64; i++) {
    outp(0x70,i);
    cmos[i]=inp(0x71);
  }
// Отображаем ячейки часов реального времени
  printf("\nЯчейки часов реального времени: ");
  for(i=0; i<0xd; i++) {
        printf("%02.2x ",(unsigned)cmos[i]);
  }
// Отображаем состояние байта диагностики
// после включения питания
  printf("\nБайт диагностики: %02.2x",cmos[0xe]);
// Отображаем содержимое байта отключения
  printf("\nБайт отключения: %02.2x\n",cmos[0xf]);
// Отображаем содержимое зарезервированных ячеек
  printf("\nPassword : ");
  for(i=0x34; i<0x40; i++) {
        printf("%02.2x ",(unsigned)cmos[i]);
  }
// Выводим это же еще раз в виде текстовой строки
  cmos[0x40]=0;
  printf(">%s<\n",&cmos[0x34]);
}
Некоторую помощь в определении конфигурации компьютера вам может оказать прерывание BIOS INT 11h, которое мы рассмотрим ниже. 
 | 


![[Назад]](../../prev.gif)
![[Содеожание]](../../sod.gif)
![[Дальше]](../../next.gif)