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

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.

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

Определение конфигурации с помощью BIOS

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

Сведения о наличии основных устройств компьютера записывается в область данных BIOS с адресом 0000:0410 размером в двухбайтовое слово - слово конфигурации. С помощью прерывания INT 11h программа может получить в регистре AX слово конфигурации из указанной выше области данных BIOS.

Биты регистра AX

Содержимое

0

В системе установлен накопитель на магнитном диске (НМД)

1

В системе установлен арифметический сопроцессор

2 – 3 (все модели, кроме IBM PS/2)

Количество банков оперативной памяти на системной плате. Для компьютера IBM PC размер одного банка равен 16 Кбайт, для IBM PC/XT – 64 Кбайт. Для определения объема оперативной памяти в более современных компьютерах следует использовать другие средства, о которых мы расскажем позже

2 (IBM PS/2)

Компьютер IBM PS/2 оборудован мышью

3 (IBM PS/2)

Не используется в IBM PS/2

4 – 5

Начальный режим видеоадаптера:

00 – EGA или VGA

01 – цветной, 40x25

10 – цветной, 80x25

11 – монохромный, 80x25

6 – 7

Количество установленных накопителей на гибких магнитных дисках (НГМД)

8

Установлен контроллер прямого доступа к памяти DMA

9 – 11

Количество установленных асинхронных последовательных портов

12

Установлен игровой порт

13

Установлен последовательный порт (только для компьютера PCjr)

14 – 15

Количество установленных параллельных адаптеров

Наличие НМД

Сейчас уже трудно найти компьютер, в котором не было бы жесткого диска (разве лишь вам встретится бездисковая рабочая станция для локальной сети или сетевой компьютер для Internet). Тем не менее, анализируя нулевой бит слова конфигурации, полученного в регистре AX от прерывания INT 11h, вы можете определить, оборудован ли данный компьютер жестким диском. Если этот бит установлен в единицу, то оборудован, если нет – жесткий диск отсутствует.

Наличие арифметического сопроцессора

До появления процессора i486 арифметический сопроцессор, значительно ускоряющий вычисления с плавающей точкой, был необязательным устройством. На системной плате компьютера для него предусматривалось отдельное гнездо.

Процессор i486 выпускался в двух модификациях – с встроенным арифметическим сопроцессором и без сопроцессора. В современных компьютерах на базе процессора Pentium арифметический сопроцессор присутствует всегда и находится в корпусе центрального процессора.

Анализируя бит с номером 1 в значении, полученном в регистре AX от прерывания INT 11h, вы можете определить факт наличия в системе арифметического сопроцессора. Если сопроцессор установлен, программа может использовать его для выполнения вычислений. Каким именно образом - вы узнаете из главы нашей книги, посвященной этому устройству.

Начальный режим работы видеоадаптера

Биты с номерами 4 и 5 слова конфигурации содержат номер начального режима видеоадаптера. В современных компьютерах применяется, как правило, режим с номером 10b - цветной, 80 текстовых строк по 25 символов в каждой строке.

Количество установленных НГМД

Поле размером два бита с номерами 6 и 7 содержит количество накопителей НГМД, установленных в системе, минус единица. То есть, если в компьютере установлен один НГМД, в этом поле записано нулевое значение, если два – значение 1 и так далее.

Современные модели компьютеров обычно оборудуют одним накопителем НГМД, предназначенным для чтения дискет размером 3,5 дюйма. Что же касается дискет размером 5,25 дюйма, то они уже ушли в прошлое.

Наличие контроллера прямого доступа DMA

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

Количество асинхронных последовательных адаптеров

В поле, образованное битами 9, 10 и 11, хранится количество асинхронных последовательных адаптеров, установленных в системе и обнаруженных BIOS в процессе инициализации.

Игровой адаптер

Если установлен бит с номером 12, к компьютеру подключен игровой адаптер, предназанченный для джойстика.

Последовательный порт компьютера PCjr

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

Количество параллельных адаптеров

В поле, образованное битами с номерами 14 и 15, записывается количество параллельных адаптеров, обнаруженных на этапе инициализации.

Размер оперативной памяти

В компьютере имеются различные виды оперативной памяти. В первых компьютерах применялся так называемый реальный режим работы процессора, не позволявший адресовать более 1 Мбайт памяти. Начальная область адресов от 0 до 640 Кбайт использовалась для оперативной памяти, а область от 640 Кбайт до 1 Мбайт – для памяти и регистров периферийных устройств, таких как видеоадаптеры и дисковые контроллеры.

Раньше оперативная память была очень дорогая, поэтому далеко не в каждом компьютере было установлен максимально возможный объем – 1 Мбайт. Можно было встретить компьютеры с объемом оперативной памяти, например, 512 Кбайт. Программы в те времена, конечно, тоже были не очень требовательны к объему памяти.

С появлением операционных систем Microsoft Windows и IBM OS/2 требования к объему памяти, установленной в компьютере, резко возросли. Компания Intel выпустила процессор i80286, способный адресовать в защищенном режиме до 16 Мбайт физической памяти.

Теперь память с адресами в пределах первого мегабайта стала называться стандартной, а выше этого предела - расширенной (extended). Размер расширенной памяти определяется во время инициализации компьютера и записывается в память CMOS, откуда ее нетрудно извлечь.

Стандартная оперативная память

Прерывание INT 12h возвращает в регистре AX размер стандартной оперативной памяти в килобайтах. Заметим, что это значение, хранящееся в области данных BIOS с адресом 0040h:0013h, не превышает 640 Кбайт, даже если в компьютере установлено более 64 Мбайт оперативной памяти.

Расширенная оперативная память

Функция 88h прерывания INT 15h позволяет определить размер доступной расширенной памяти в килобайтах, возвращая соответствующее значение в регистре AX.

Учтите, что если в системе установлен драйвер расширенной памяти, такой как, например, HIMEM.SYS, указанная выше функция может вернуть нулевое значение. Это происходит из-за того что драйвер берет на себя функции управления расширенной памятью. Заметим также, что с помощью параметра /int15 вы можете указать драйверу HIMEM.SYS размер зарезервированной расширенной памяти, доступной через интерфейс прерывания INT 15h:


device=c:\dos\himem.sys /int15=xxxx

Программа HDWCFG

Программа HDWCFG определяет конфигурацию аппаратных средств компьютера, пользуясь для этого описанными выше функциями BIOS. Полученная конфигурация отображается на консоли, как это показано ниже:


HDWCFG (C)A. Frolov, 1997

Configuration word: C823
HDD present
NPU present
RAM banks: 0
Video Mode: 2
Nubber of FDD: 1
Nubber of COM ports: 2
Number of LPT ports: 3
RAM istalled: 640 Kbytes
Extended RAM istalled: 0

Исходный текст программы HDWCFG представлен в листинге 1.1.

Листинг 1.1. Файл hdwcfg\hdwcfg.c


// =====================================================
// Получение информации о конфигурации компьютера
// при помощи BIOS
//
// (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 <memory.h>
#include <dos.h>

// Битовые поля слова конфигурации
typedef struct _HDWCFG
{
  unsigned  HddPresent:   1; // 0
  unsigned  NpuPresent:   1; // 1
  unsigned  AmountOfRAM:  2; // 2-3
  unsigned  VideoMode:    2; // 4-5
  unsigned  NumberOfFdd:  2; // 6-7
  unsigned  DmaPresent:   1; // 8
  unsigned  NumberOfCom:  3; // 9-11
  unsigned  GamePresent:  1; // 12
  unsigned  JrComPresent: 1; // 13
  unsigned  NumberOfLpt:  2; // 14-15
} HDWCFG;     

int main(void) 
{ 
  union REGS  rg;
  HDWCFG HdwCfg; 
  unsigned uword;

  printf("\nHDWCFG (C)A. Frolov, 1997");

  // Вызываем прерывание INT 11h для получения
  // слова конфигурации компьютера
  rg.h.ah = 0x0;
  int86(0x11, &rg, &rg);
  
  // Получаем слово конфигурации и сохраняем 
  // его в структуре HdwCfg
  uword = (unsigned int)rg.x.ax;
  memcpy(&HdwCfg, &uword, 2);
  
  // Выводим на экран конфигурацию компьютера
  printf("\n\nConfiguration word: %04.4X", HdwCfg);
  
  if(HdwCfg.HddPresent)
    printf("\nHDD present");

  if(HdwCfg.NpuPresent)
    printf("\nNPU present");

  printf("\nRAM banks: %d", HdwCfg.AmountOfRAM);
  printf("\nVideo Mode: %d", HdwCfg.VideoMode);
  printf("\nNubber of FDD: %d", HdwCfg.NumberOfFdd + 1);
    
  if(HdwCfg.DmaPresent)
    printf("\nDMA present");

  printf("\nNubber of COM ports: %d", HdwCfg.NumberOfCom);
  
  if(HdwCfg.GamePresent)
    printf("\nGame adapter present");

  if(HdwCfg.JrComPresent)
    printf("\nPCjr Com present");

  printf("\nNumber of LPT ports: %d", HdwCfg.NumberOfLpt);

  // Вызываем прерывание INT 12h для определения 
  // объема основной оперативной памяти компьютера
  rg.h.ah = 0x0;
  int86(0x12, &rg, &rg);

  // Выводим объем оперативной памяти
  printf("\nRAM istalled: %d Kbytes", 
    (unsigned int)rg.x.ax);

  // Получаем объем расширенной оперативной памяти,
  // доступной через прерывание INT 15h
  rg.h.ah = 0x88;
  int86(0x15, &rg, &rg);

  // Выводим объем расширенной оперативной памяти
  printf("\nExtended RAM istalled: %ld Kbytes", 
    (unsigned int)rg.x.ax);

  getch();
  return 0;
}
[Назад] [Содеожание] [Дальше]