Аппаратное обеспечение персонального компьютера© Александр Фролов, Григорий ФроловТом 33, М.: Диалог-МИФИ, 1997, 304 стр. Конфигурация в памяти CMOSКак мы уже говорили, энергонезависимая память CMOS используется в современных компьютерах для хранения текущей конфигурации аппаратных средств. Эта память состоит из набора ячеек, доступ к которым для чтения и записи выполняется через порты ввода и вывода с адресами 70h и 71h. Процедура чтения ячейки памяти CMOS состоит из двух шагов. На первом шаге программа записывает в выходной порт с адресом 70h номер ячейки, из которой необходимо прочитать информацию. На втором шаге программа читает содержимое данной ячейки из входного порта с адресом 71h: int nCellContent; outp(0x70, nCell); nCellContent = inp(0x71); Запись данных в ячейку памяти CMOS выполняется аналогично, только после записи номера ячейки в порт 70h программа должна записать новое значение для этой ячейки в порт с адресом 71h: outp(0x70, nCell); outp(0x71, nNewValue); В памяти CMOS хранится текущее время и дата, сведения о конфигурации системы, результат тестирования при включении питания и другая информация, приведенная ниже:
Рассмотрим подробно назначение отдельных ячеек CMOS-памяти. 00h - 0Dh - область часов реального времениЯчейки с адресами 00h - 0Dh используются часами реального времени. Часам реального времени будет посвящена отдельная глава, поэтому сейчас мы не станем останавливаться на этих ячейках. 0Eh - байт диагностикиБайт диагностики (расположенный в памяти CMOS по адресу 0Eh) содержит результаты выполнения диагностики при включении питания компьютера. Выполнив анализ содержимого байта 0Eh, программа может выявить неисправность НМД, часов реального времени, разрядку аккумулятора и ошибки в конфигурации. Приведем формат этого байта:
0Fh - байт отключенияБайт отключения 0Fh используется процессорами 80286, 80386, 80486 и Pentium для определения способа возврата из защищенного режима в реальный после аппаратного сброса. Вы, вероятно, знаете, что эти процессоры могут работать либо в реальном режиме, который соответствует режиму работы процессора 8086, либо в защищенном. Защищенный режим работы используется такими операционными системами, как Microsoft Windows, IBM OS/2 и UNIX. В этом режиме процессор может непосредственно адресовать всю память, лежащую выше границы 1 Мбайт. Подробное рассмотрение защищенного режима работы мы привели в 6 томе «Библиотеки системного программиста», который так и называется – «Защищенный режим процессоров Intel 80286/80386/80486». Здесь же мы только кратко расскажем о переходе процессора 80286 из реального режима в защищенный и обратно для иллюстрации использования ячейки памяти CMOS с адресом 0Fh. Для перевода процессора 80286 из реального режима в защищенный можно использовать специальную команду LMSW: mov ax,1 lmsw ax Разумеется, двух строк, приведенных выше, недостаточно для правильной работы процессора в защищенном режиме. Для того, чтобы вернуть процессор 80286 из защищенного режима в реальный, необходимо выполнить аппаратный сброс (отключение) процессора. Это можно сделать следующим образом: mov ax, 0FEh ; команда отключения out 64h, ax Перед выдачей команды отключения программа должна записать в ячейку 0Fh памяти CMOS причину отключения:
Для перевода процессоров 80386, 80486 и Pentium из реального режима в защищенный и обратно можно использовать загрузку специального управляющего регистра CR0 обычной командой MOV. Однако будет работать и метод, основанный на применении команды LMSW и команды отключения. Вы можете использовать сведения о команде отключения для организации программного перезапуска системы. 10h - тип накопителей НГМДМладшая и старшая тетрады этого байта описывают, соответственно, второй и первый НГМД:
11h - зарезервировано для IBM PC/AT, тип НМД для IBM PS/2В компьютерах IBM PS/2 ячейки памяти CMOS с адресами 11h и 12h используются для хранения типа, соответственно, первого и второго НМД. 12h - тип первого и второго НМДЭтот байт разделен на две тетрады аналогично байту, описывающему НГМД. Однако в тетраде можно закодировать только 16 различных значений, а типов НМД значительно больше. Поэтому тип 15 используется специальным образом - если тип НМД в младшей тетраде (первый физический НМД) равен 15, то правильное значение типа находится в памяти CMOS по адресу 19h. Аналогично для второго физического НМД этот тип можно взять из байта по адресу 1Ah (если старшая тетрада байта с адресом 12h равна 15). Таблица стандартных типов НМД была приведена в третьей книге первого тома, в разделе, посвященном конфигурации дисковой подсистемы. Кроме того, сведения о типах дисков, задаваемых программой BIOS Setup, обычно есть в документации, поставляемой вместе с компьютером. В современных компьютерах установлены НМД с интерфейсом IDE или SCSI. В первом случае тип диска устанавливается равным 47. Это означает. Что фактические параметры диска хранятся в старших ячейках памяти CMOS, номера которых зависят от изготовителя и версии BIOS. Тип НМД с интерфейсом SCSI задается как 1 или 0. Фактические параметры НМД определяются BIOS, расположенной в контроллере SCSI. 13h - зарезервированоЭта ячейка памяти CMOS зарезервирована. 14h - конфигурация оборудованияВ этом байте находится информация о количестве установленных НГМД, о наличии арифметического сопроцессора, а также о типе видеоадаптера, подключенного к системе. Приведем формат байта конфигурации:
15h-16h - объем стандартной оперативной памятиЯчейка 15h содержит младший байт, а ячейка 16h - старший байт объема основной памяти, например: · 0100h – 256 Kбайт; · 0200h – 512 Kбайт; · 0280h – 640 Kбайт 17h-18h - объем расширенной памятиЯчейки 17h и 18h содержат, соответственно, младший и старший байты размера расширенной памяти (расположенной выше границы 1 Мбайт) в килобайтах. 19h-1Ah тип первого и второго НМДЭти ячейки содержат типы, соответственно, первого и второго НМД, если соответствующий тип имеет значение, большее 15 (см. описание ячейки 12h). 1Bh-2Dh - зарезервированоЭти ячейки памяти CMOS зарезервированы. 2Eh-2Fh - контрольная сумма ячеек 10h - 20hДля ячеек памяти CMOS с адресами от 10h до 20h при инициализации системы BIOS выполняет проверку контрольной суммы. Эта контрольная сумма хранится также в памяти CMOS в ячейках 2Eh и 2Fh (соответственно, старший и младший байты). 30h-31h - объем расширенной памятиЯчейки 30h и 31h содержат, соответственно, младший и старший байты размера расширенной памяти (расположенной выше границы 1 Мбайт) в килобайтах. Эта значение дублирует значение, записанное в ячейках с адресами 17h-18h. 32h текущее столетиеВ компьютерах IBM PC/AT этот байт содержит текущее столетие в двоично-десятичном коде, то есть 19 столетие записано как 19h. Компьютеры модели IBM PS/2 используют эту ячейку вместе с ячейкой 33h для хранения контрольной суммы ячеек с адресами от 10h до 31h. При этом старший байт контрольной суммы хранится в ячейке 32h, а младший - 33h. 33h - различная информацияВ компьютерах IBM PC/AT этот байт используется программой BIOS Setup для собственных нужд. 34h-3Fh - зарезервированоЭто поле зарезервировано, однако вы можете использовать по своему усмотрению, например, хранить здесь пароль. Другие ячейки памяти CMOSНазначение описанных выше 64 ячеек памяти CMOS документировано и одинаково для BIOS различных изготовителей и различных версий. Тем не менее, есть исключения. BIOS компьютера IBM PS/2 использует ячейку с адресом 37h для хранения номера текущего столетия. Ячейки 38h-3Fh в модели 50 компьютера IBM PS/2 используются для хранения пароля. Обращение к этим ячейкам выполняется по адресам 78h-7Fh, которые аппаратно отображаются на адреса 38h-3Fh. Кроме того, имеются ячейки памяти CMOS с номерами, большими чем 3Fh. Их назначение зависит от изготовителя BIOS, поэтому обращайтесь к ним только в том случае, если у вас есть соответствующая документация. Программа CMOSSHOWПрограмма CMOSSHOW читает в массив первые 64 ячейки памяти CMOS и отображает содержимое некоторых из них: CMOS Show (C)A. Frolov, 1997 RTC: 22 00 30 00 17 00 03 19 08 97 a6 02 00 Diagnostics byte: 08 Shutdown byte: 00 Reserved: 00 00 00 00 00 00 00 00 00 00 00 00 Extended RAM: 16384 Kbyte Отображаются ячейки часов реального времени RTC, о которых мы расскажем позже в отдельной главе, диагностический байт и байт отключения, зарезервированные байты. Кроме того, на основании информации, хранящейся в ячейках 17h и 18h программа вычисляет размер расширенной памяти, установленной в компьютере. Исходный текст программы CMOSSHOW вы найдете в листинге 1.3. Листинг 1.3. Файл cmosshow\cmosshow.c // ===================================================== // Чтение и отображение ячеек памяти CMOS // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { unsigned char cmos[64]; int i; unsigned long nExtRam; printf("\nCMOS Show (C)A. Frolov, 1997\n\n"); // Читаем 64 ячейки CMOS-памяти в массив cmos for(i=0; i<64; i++) { outp(0x70,i); cmos[i]=inp(0x71); } // Отображаем ячейки часов реального времени printf("\nRTC: "); for(i=0; i<0xd; i++) { printf("%02.2x ",(unsigned)cmos[i]); } // Отображаем состояние байта диагностики // после включения питания printf("\nDiagnostics byte: %02.2x",cmos[0xe]); // Отображаем содержимое байта отключения printf("\nShutdown byte: %02.2x\n",cmos[0xf]); // Отображаем содержимое зарезервированных ячеек printf("Reserved: "); for(i=0x34; i<0x40; i++) { printf("%02.2x ",(unsigned)cmos[i]); } // Вычисляем объем расширенной памяти и отображаем // его на консоли nExtRam = ((unsigned long)cmos[0x18] << 8) + cmos[0x17]; printf("\nExtended RAM: %ld Kbyte\n", nExtRam); getch(); return 0; } |