![]()
Заглавная страница
Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Таблицы параметров НМД и НГМД
Для работы с диском на физическом уровне необходимо знать такие его характеристики, как количество головок, секторов и др. Эти характеристики можно определить из таблиц параметров НГМД и НМД, заполняемых BIOS в процессе инициализации системы.
Анализируя содержимое CMOS-памяти в компьютерах IBM PC/AT или установку переключателей конфигурации на основной плате в компьютерах IBM PC и IBM PC/XT, BIOS в процессе инициализации создает таблицу параметров дискеты DPT (Diskette Parameter Table ), а также одну или две таблицы параметров жесткого диска HDPT (Hard Disk Parameter Table). Если имеется специальная "дисковая" система ввода/вывода, то она сама создает таблицы HDPT.
Таблица параметров дискеты DPT имеет длину 10 байт, ее адрес располагается в области данных BIOS по адресу 0000h:0078h, что соответствует вектору прерывания INT 1Eh. Таблица содержит следующие параметры: (слайд №26)
Все времена зависят от частоты тактового генератора контроллера НГМД, приведенные значения соответствуют частоте 8 МГц.
Адреса таблиц параметров жестких дисков HDPT расположены по адресам, соответствующим векторам прерываний INT 41h (для первого физического диска) и INT 46h (для второго физического диска). Эти таблицы имеют следующий формат: (слайд №27)
Наиболее полезная информация, которую можно извлечь из таблицы параметров дискеты - это код размера сектора. Если вам когда-либо придется работать с нестандартным размером сектора (отличным от 512 байт), вам не обойтись без этой таблицы.
Таблица параметров жесткого диска содержит такие важнейшие значения, как максимальное количество дорожек и максимальное количество головок. Если вам не удалось определить тип диска, то таблица HDPT - единственное надежное место, откуда можно получить информацию о количестве дорожек и головок.
H - конфигурация оборудования Для варианта №11, Лабораторной работы №2 –Определить и и выести на экран список оборудования (BIOS 11h). (слайд №28)
В этом байте находится информация о количестве установленных НГМД, о наличии арифметического сопроцессора, а также о типе видеоадаптера, подключенного к системе. Приведем формат байта конфигурации:
Кроме этого, в ячейках CMOS-памяти содержится и информация об оперативно памяти: основной и расширенной (Для варианта №2, Лабораторной работы №2 - Определить объем установленной оперативной памяти и ее тип.) (слайд №29)
Пример: (слайд №30)
// ===================================================== // Чтение и отображение ячеек памяти CMOS // ===================================================== #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { unsigned char cmos[64]; int i; unsigned long nExtRam; // Читаем 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; }
Int 14h - Управление стыком RS-232C Для варианта №13, Лабораторной работы №2 – Определить статус последовательного порта связи (BIOS 14h). (слайд №31)
Для управления последовательным интерфейсом (стыком RS-232C) имеются следующие функции:
Примечания. Номер стыка в описанных ниже функциях задается так: COM1, COM2 и т. д. При этом в PS/2 он может варьироваться от 0 до 3, в остальных ПЭВМ - от 0 до 1. Базовый адрес порта для стыка извлекается из области данных по адресу 00400h.
Рассмотрим некоторые функции данного прерывания более подробно:
INT 14h AH = 03 — Получить текущее состояние порта
INT 14h АН = 00 — Инициализация последовательного порта (слайд №32)
Более того информацию о портах можно извлечь и из области данных BIOS (Data Area BIOS).
Как говорилось ранее, после зоны векторов прерываний идет область, называемая BIOS Data Area, где размещаются данные, полученные в ходе тестирования оборудования, буфера системных устройств, например буфер клавиатуры, и различные служебные регистры. Эта область данных имеет размер не менее 256 байтов и начинается с адреса 0000:0400h или 0040:0000h. Назначение наиболее интересных для пользователя зон в области BIOS Data Area следующее: (слайд №33)
Лекция №7. Int 15h - Системные утилиты Для варианта №5, Лабораторной работы №2 – Определить модель компьютера (BIOS 15h) и версию BIOS. (слайд №34)
Это прерывание объединяет большую группу функций, не связанных с каким-либо конкретным внешним устройством, а именно:
Примечания: Функции 01h - 04h предназначены для работы с кассетным магнитофоном, которым комплектовались первые PC и PCjr и сегодня представляют чисто исторический интерес. Функция 0Fh - это специфическая функция, которая поддерживается только контроллером жестких дисков IBM ESDI Adapter/A. Функции 40h - 44h поддерживаются только в PC Convertible. Функции 86h - 89h реализованы в ПЭВМ на базе процессоров 80286 и 80386, функции 21h и C1h - C4h только в PS/2.
Определение типа компьютера и версии BIOS.
Существует две возможности определить модель компьютера и получить некоторую информацию о конфигурации:
ПЗУ BIOS содержит по адресу FFFF:FFFE байт, значение которого можно использовать для идентификации типа компьютера: (слайд №35)
Для определения модели компьютера таким способом можно использовать следующую функцию: (слайд №36)
#include <stdio.h> #include <dos.h> #include "sysp.h"
char unsigned pc_model(void) {
char unsigned _far *modptr;
modptr = FP_MAKE(0xf000,0xfffe);
return *modptr; }
Функция pc_model() возвращает байт, идентифицирующий код компьютера. В большинстве случаев достаточно проверить этот байт и сделать вывод о типе компьютера и составе его аппаратных средств.
Более подробную информацию можно получить, вызвав функцию C0h прерывания BIOS INT 15h: (слайд №37)
На входе: AH = C0h На выходе: ES:BX = адрес таблицы конфигурации, таблица находится в ПЗУ BIOS; CF = 0 при успешном вызове прерывания; CF = 1 если данная версия BIOS не поддерживает функцию C0h.
После выполнения прерывания регистры ES:BX будут указывать на таблицу в области ПЗУ BIOS. В этой таблице имеется более точная информация о типе компьютера, номер версии BIOS, сведения об аппаратных особенностях конкретной модели.
Приведем формат указанной таблицы: (слайд №38)
В следующей таблице приведены коды моделей, дополнительные коды моделей и версии BIOS для некоторых широко распространенных типов компьютеров: (слайд №39)
Следует заметить, что функция C0h прерывания INT 15h поддерживается не всеми версиями BIOS. Все что можно сделать в этом случае для идентификации BIOS - получить байт кода модели по адресу F000h:FFFEh и дату изготовления BIOS, занимающую восемь байтов начиная с адреса F000h:FFF5h. Дата хранится в формате ASCII.
Приведем текст программы, которая поможет определить версию BIOS и дату ее изготовления, а также получить всю остальную информацию из таблицы конфигурации. Программа отображает также адрес этой таблицы. (слайд №40-41)
#include <stdio.h> #include <dos.h> #include "sysp.h" void main(void); void main(void) { union REGS rg; struct SREGS srg; int i; BIOSINFO far *biosinf_ptr; // Конструируем указатель на дату изготовления BIOS. // Эта дата записана в ПЗУ по адресу F000h:FFF5h. biosinf_ptr = FP_MAKE(0xf000, 0xfff5); // Выводим дату на экран printf("\n\nДата изготовления BIOS: "); for(i=0; i<8; i++) putch(*((char far *)biosinf_ptr + i)); // Вызываем функцию C0h для получения адреса таблицы конфигурации компьютера. rg.h.ah = 0xc0; int86x(0x15, &rg, &rg, &srg); // Если данная функция не поддерживается BIOS, читаем код модели компьютера из ПЗУ // по адресу F000h:FFFEh. if(rg.x.cflag == 1) { printf("\nФункция C0h прерывания INT 15h данной версией BIOS не поддерживается\n"); // Конструируем указатель на код модели biosinf_ptr = FP_MAKE(0xf000, 0xfffe); // Выводим код модели компьютера на экран printf("\nКод модели: %02.2X", (unsigned char)(*(char far *)biosinf_ptr)); exit(-1); } // Конструируем указатель на таблицу конфигурации biosinf_ptr = FP_MAKE(srg.es, rg.x.bx); // Выводим на экран содержимое таблицы printf("\nАдрес таблицы конфигурации: %Fp" "\nРазмер таблицы в байтах: %d" "\nКод модели: %02.2X" "\nДополнительный код модели: %d" "\nВерсия BIOS: %d" "\nКонфигурация оборудования: %02.2X", biosinf_ptr, biosinf_ptr->size, biosinf_ptr->model, biosinf_ptr->submodel, biosinf_ptr->version, biosinf_ptr->hardcfg); // Определяем конфигурацию компьютера printf("\n\nКонфигурация оборудования компьютера" "\n------------------------------------"); // Запоминаем байт конфигурации i = biosinf_ptr->hardcfg; // Расшифровываем байт конфигурации if(i & 0x80) printf("\nКанал 3 контроллера DMA используется дисковой BIOS"); if(i & 0x40) printf("\nУстановлен второй контроллер прерываний 8259"); if(i & 0x20) printf("\nУстановлены часы реального времени"); if(i & 0x10) printf("\nПосле INT 9h вызывается функция 4Fh прерывания INT 15h"); if(i & 0x8) printf("\nBIOS поддерживает функцию ожидания внешнего события"); if(i & 0x4) printf("\nИспользуется расширенная область данных BIOS"); if(i & 0x2) printf("\nИспользуется шина Micro Channel"); if(!(i & 0x2)) printf("\nИспользуется шина ISA"); exit(0); }
Рассмотрим еще один пример определения типа BIOS:
// ===================================================== // Получение информации о BIOS // ===================================================== #include <stdio.h> #include <conio.h> #include <dos.h> // Структура области данных с информацией о BIOS typedef struct _BIOSINFO { int nSize; // размер структуры unsigned char bModel; // код модели компьютера unsigned char bSubModel; // дополнительный код модели unsigned char bBIOSRevision; // номер изменений версии BIOS unsigned char bHardwareCfg; // конфигурация аппаратуры int reserved1; // зарезервировано int reserved2; // зарезервировано } BIOSINFO; int main(void) { union REGS rg; struct SREGS srg; int i; BIOSINFO far *lpbi; void far* lp; unsigned char bHdwCfg; // Конструируем указатель на дату изготовления BIOS. Эта дата записана в ПЗУ по адресу // F000h:FFF5h _FP_SEG(lp) = 0xf000; _FP_OFF(lp) = 0xfff5; // Выводим дату на экран printf("\n\nBIOS data: "); for(i=0; i<8; i++) putch(*((char far *)lp + i)); // Вызываем функцию C0h для получения адреса таблицы конфигурации компьютера. rg.h.ah = 0xc0; int86x(0x15, &rg, &rg, &srg); // Если в BIOS нет данной функции, читаем код модели компьютера из ПЗУ по адресу // F000h:FFFEh if(rg.x.cflag == 1) { printf("\nFunction C0h INT 15h not supported\n"); // Конструируем указатель на код модели _FP_SEG(lp) = 0xf000; _FP_OFF(lp) = 0xfffe; // Выводим код модели компьютера на экран printf("\nModel: %02.2X", (unsigned char)(*(char far *)lp)); return(-1); } // Конструируем укзатель на таблицу информации о BIOS _FP_SEG(lpbi) = srg.es; _FP_OFF(lpbi) = rg.x.bx; // Выводим на экран содержимое таблицы printf("\nBIOSINFO address: %Fp" "\nBIOSINFO Size: %d" "\nModel: %02.2X" "\nSubModel: %d" "\nBIOS Revision: %d" "\nHardvare Cfg: %02.2X" "\nReserved1: %02.2X" "\nReserved2: %02.2X", lpbi, lpbi->nSize, lpbi->bModel, lpbi->bSubModel, lpbi->bBIOSRevision, lpbi->bHardwareCfg, lpbi->reserved1, lpbi->reserved2); // Определяем конфигурацию компьютера printf("\n\nHardware configuration" "\n----------------------"); // Запоминаем байт конфигурации bHdwCfg = lpbi->bHardwareCfg; // Расшифровываем байт конфигурации if(bHdwCfg & 0x80) printf("\nDMA Channel 3"); if(bHdwCfg & 0x40) printf("\nSecond IRQ Controller 8259"); if(bHdwCfg & 0x20) printf("\nReal Time Clock"); if(bHdwCfg & 0x10) printf("\nUsed function 4Fh INT 15h"); if(bHdwCfg & 0x8) printf("\nBIOS event wait supported"); if(bHdwCfg & 0x4) printf("\nExtended BIOS data used"); if(bHdwCfg & 0x2) printf("\nMicro Channel Bus"); if(!(bHdwCfg & 0x2)) printf("\nISA Bus installed\n"); getch(); return 0; }
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-26; Нарушение авторского права страницы infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.239.236.140 (0.064 с.) |