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