Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 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; просмотров: 637; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.227.250 (0.015 с.) |