Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение 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 - тип используемых флоппи-дисков;

Младшая и старшая тетрады этого байта описывают соответственно второй и первый НГМД:

  • 0000 - дисковод не установлен;
  • 0001 - дисковод на 360К;
  • 0010 - дисковод на 1,2М;
  • 0011 - дисковод на 720К;
  • 0100 - дисковод на 1.44М.

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, которое мы рассмотрим ниже.

[Назад] [Содеожание] [Дальше]