Прямое обращение к памяти и портам ввода-вывода
Теоретическая часть Операционная система управляет программами, периферийными устройствами, словом, всем. Важную роль здесь играют прерывания. Прерывание представляет собой сигнал процессору, вырабатываемый программой, каким-либо устройством или самим процессором. Этот сигнал приостанавливает выполнение программы и запускает соответствующую функцию операционной системы для выполнения необходимых системных действий. Необходимость прерываний вызвана двумя причинами – специальными запросами на выполнение системных действий, например по вводу и выводу данных, а также возникновением ошибок при выполнении программ. Прерываниям присваиваются номера, например $10. Прерывания от $1F включительно зарезервированы для BIOS, а начиная с $20 до $62 - для операций MS-DOS. Прерывания хранятся в специальной таблице прерываний. В таблице 1 приведен перечень некоторых прерываний. Таблица 1.
В Паскале есть две процедуры для прямого обращения к функциям MS-DOS и BIOS -MSDos и Intr. Прерывания зависят от состояния регистров центрального процессора и заносят в эти регистры результат своей работы. Регистр – это внутреннее запоминающее устройство процессора для временного хранения обрабатываемой или управляющей информации. В модуле System имеется специальный тип Registers, который описывается следующим образом: type Registers = record сase Integer of 0: (AX, BX, CX, BP, SI, DI, DS, ES, Flags: Word); 1: (AL, AH, BL, BH, CL, CH, DL, DH: Byte); end;
тип Registers представляет собой запись, состоящую только из вариативной части. В табл. Дан список регистров процессора 80х86. Таблица 2.
Сегментом называется область памяти размером 64 Кбайт, которая начинается по любому адресу, кратному 16. В области памяти, выделяемой программе, имеется три основных сегмента: 1. Сегмент кода содержит машинные команды, которые будут выполняться. Первая выполняемая команда находится в начале кодового сегмента и операционная система для выполнения программы передает управление по адресу данного сегмента.
2. Сегмент данных содержит данные и рабочие области, необходимые программе. 3. Сегмент стека содержит адреса для возврата в операционную систему и для возврата из программ в главную программу. Особенность регистров общего назначения заключается в том, что возможна их адресация как в целом (т.е. одним словом), так и каждой однобайтовой части (например, AL- младшая половина, а AH – старшая половина). Регистр AX является сумматором и применяется для всех операций ввода – вывода, некоторых арифметических и строковых операций. Регистр BX может использоваться для расширенной адресации и вычислений. Регистр CX необходим для управления числом повторений циклов и операций сдвига. Регистр DX применяется для некоторых операций ввода- вывода и тех арифметических операций над большими числами, которые используют два регистра DX:AX. Регистровые указатели SP и BP обеспечивают системе доступ к данным в сегменте стека, реже они используются для вычислений. Индексные регистры SI (индекс источника) и DI (индекс назначений) могут применяться для расширенной адресации и операций сложения и вычитания. Регистр командного указателя содержит смещение указателя на команду, которая должна быть выполнена. Флагом называют признак, установленный программно с целью указания особенностей выполнения стандартных операций,- это одноразрядный индикатор, отражающий выполнение или невыполнение определенного условия. Процедуры, предназначенные для работы с регистрами процессора и прерывания MSDos и Intr модуля DOS:
Procedure MSDos (var regs: Registers); Procedure Intr (number: Byte; var regs: Registers);
Процедура Intr предназначена для обращения к прерыванию с указанным номером (первый параметр). Перед выполнением прерывания процедура загружает регистры процессора значением соответствующих полей записи regs. После выполнения прерывания содержимое этих регистров вновь записывается в соответствующую переменную. Процедура MSDos эквивалентна вызову процедуры Intr для прерывания $21. Для прерывания $21 имеется несколько сотен функций MS-DOS, предназначенных для работы с файлами и дисками. Процедуры Паскаля, использующие все эти низкоуровневые операции, дают гораздо более удобные и безопасные способы их выполнения.
К работе с прерываниями следует прибегать, если в этом действительно есть необходимость. Это потенциально опасно, так как функции напрямую обращаются к операционной системе и выполняют системные операции. Неаккуратное обращение с ними может привести к потере части информации на дисках, и другим неприятным последствиям. Практическая часть 1. Ввести программу. 2. Запустить на выполнение. 3. Пояснить работу процедур модуля DOS, предназначенных для выполнения системных операций (прерываний), обращения к памяти и портам ввода- вывода. 4. Ответить на контрольные вопросы 5. Оформить отчет Задача 1 В качестве примера работы с прерываниями рассмотрим пример простой программы, в которой используется функция $2С для считывания показаний системных часов.
Program gettime;
Uses dos, crt;
Var Regs: registers;
Begin ClrScr; regs.AH:= $2C; intr ($21, regs); write (‘Системные часы показывают ’); with regs do begin write (CH, ‘ час. ’); write (CL, ‘ мин. ’); write (DH, ‘. ’); If DL < 10 then Write(0); Writeln(DL, ‘ сек. ’); End; Writeln(‘нажмите <Enter>’); Readln; End.
Задача 2 Так, прерывание с номером 18 ($12) возвращает в регистре AX объем оперативной памяти ПЭВМ. Пример программы выводящей на экран сообщение об этом объеме: Program IntrDem; Uses DOS; Var r: registers; Begin Intr($12, r); writeln('Объем памяти = ', r.АХ, ' Кбайт') END.
Задача 3 Процедура MSDOS инициирует прерывание с номером 33 ($21); обращения: MSDOS(< регистры >); Здесь < регистры > - переменная типа REGISTERS, содержащая значения регистров на входе и выходе процедуры обработки прерывания. Программное прерывание с номером 33 ($21) стоит особняком: как уже говорилось, оно дает доступ к большому количеству функций ДОС (этим прерыванием вызывается 85 функций). Рассматриваемая процедура полностью эквивалентна вызову процедуры INTR c номером прерывания 33. Программа примера выведет на экран версию операционной системы: Program MsDosDemo; Uses DOS; Var R: registers; Begin r.AH: = $30; MsDos(r); write1n ('Версия операционной системы: г.АL, '.', г.АН)
END.
Задача 4. С помощью следующих двух процедур программист может прочитать содержимое любого вектора или установить его новое значение. Процедура GETINTVECT. Возвращает вектор прерывания с указанным номером; формат обращения GETINTVECT(< N >, < вектор >> Здесь < N > - выражение типа ВYТЕ, содержащее номер прерывания; < вектор > -переменная типа РOINTER, в которой возвращается адрес точки входа в процедуру обработки прерывания. Пример: программа выводит на экран содержимое всех ненулевых векторов прерываний. Uses DOS; var i: byte; p: pointer; Begin for i:= 0 to 255 do Begin GetIntVec(i, p); if (Seg(p^) <> 0) or (Ofs(p^) <> 0) then write1n('N = ', i:3, 'Seg = ', Seg(p^):5, 'Ofs =', Ofs(p^):5); End; End.
Прямое обращение к памяти и портам ввода-вывода В Турбо-Паскале имеется пять предварительно объявленных массивов: МЕМ, МЕМW, МЕМL, РОRТ и РОRТW. Первые три обеспечивают доступ к любому участку оперативной памяти по абсолютному адресу, два другие - доступ к портам ввода-вывода. Mem[$0000:$1000]:= 0; DataMem:= MemW[Seg(p):Ofs(p)]; MemLong:= MemL[64:i*SizeOf(rea1)]; Задача 5. Как следует из технического описания операционной системы МS DOS, в ПЗУ BIOS по адресу $F000:$FFFE зашит байт-идентификатор типа компьютера. Таким образом можно определить тип компьютера, на котором запускается программа: Program DMA_Demo; Begin Write('Тип компьютера: '); Case Mem[$FOOO:$FFFE] of $FF: writeln('PC'); $FE: writeln('XT'); $FD: writeln('PCjr'); $FC: write1n('AT'); $F9: writeIn('совместимый c PC'); End End. Компонентами массива РОRТ являются байты, а массива РОRТW - слова. Индексами этих массивов должно быть выражение типа ВYТЕ, указывающее номер нужного порта. Присвоение значения элементу массива РОRТ или РОRТW приведет к записи в порт, упоминание элемента в выражении - к чтению из порта. Компоненты массивов РОRТ и РОRТW нельзя передавать в качестве параметров процедурам или функциям. Эти идентификаторы нельзя употреблять без индексных выражений. Контрольные вопросы 1. Что представляют собой прерывания? 2. Какие номера прерываний зарезервированы за BIOS. MS-DOS? 3. Какие процедуры есть в Паскале для прямого обращения к функциям MS-DOS и BIOS? 4. Особенность регистров общего назначения 5. Процедуры, предназначенные для работы с регистрами процессора и прерывания MSDos и Intr модуля DOS 6. С помощью каких процедур можно прочитать любой вектор?
7. Охарактеризовать пять предварительно объявленных массивов: МЕМ, МЕМW, МЕМL, РОRТ и РОRТW. Литература 1. Попов,И.И. Операционные системы, среды и оболочки: Учебное пособие[Тескт]/И.И.Попов, Т.Л.Партыка - М.:ФОРУМ: ИНФРА-М,2009 -400с 2. Олифер, В.Г. Сетевые операционные системы / В.Г. Олифер, А.А. Олифер – Спб.: Питер, 2006- 545с. 3. Спицына,О.И. Операционные системы и среды: лекционные материалы[Текст]/О.И.Спицына –Старый Оскол:ООО ТНТ, 2004-80с.
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|