WWW.MASH.DOBROTA.BIZ
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - онлайн публикации
 

«СБОРНИК ЛАБОРАТОРНЫХ РАБОТ по курсу Организация ЭВМ и систем № 4633 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное ...»

№ 4633

В.Ф. ГУЗИК, В.А. КАЛЯЕВ, А.И. КОСТЮК, Е.В. ЛЯПУНЦОВА

СБОРНИК ЛАБОРАТОРНЫХ РАБОТ

по курсу

Организация ЭВМ и систем

№ 4633

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение

высшего профессионального образования

«Южный федеральный университет»

ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ В Г. ТАГАНРОГЕ

В.Ф. ГУЗИК, В.А. КАЛЯЕВ, А.И. КОСТЮК, Е.В. ЛЯПУНЦОВА

СБОРНИК ЛАБОРАТОРНЫХ РАБОТ

по курсу Организация ЭВМ и систем Учебное пособие Таганрог 2010

Рецензенты:

доктор технических наук, профессор кафедры информатики ТГПИ Н.И .

Витиска;

кандидат технических наук, доцент кафедры систем автоматизированного проектирования ТТИ ЮФУ О.Б. Лебедев .

УДК 004.42 В.Ф. Гузик, А.И. Костюк, Е.В. Ляпунцова. Сборник лабораторных работ по курсу «Базы данных»: Учебное пособие. Таганрог: Изд-во ТТИ ЮФУ, 2010 – 93 с .

Данное учебное пособие представляет собой руководство к лабораторным работам по курсу «Организация ЭВМ и систем». Целью курса является подробное знакомство студентов с особенностью организации современных микропроцессоров, ЭВМ и ПЭВМ, освоение ими аппаратных и аппаратнопрограммных решений, используемых при создании подсистем и узлов вычислительных устройств .



Предназначено для студентов всех форм обучения и слушателей СФПК направления 230100 «Информатика и вычислительная техника», пользователей и разработчиков аппаратно-программных средств .

Табл. 12. Ил. 58. Библиогр.: 10 назв .

© ТТИ ЮФУ, 2010 © В.Ф. Гузик, В.А. Каляев, 2010 © А.И. Костюк, Е.В. Ляпунцова, 2010 СОДЕРЖАНИЕ   ВВЕДЕНИЕ

1. ЛАБОРАТОРНАЯ РАБОТА №1 Программируемый таймер ВИ54 (i8254)

1.1. Назначение и внутренняя структура таймера

1.2. Структурная схема канала

1.3. Подключение таймера к системной шине.

1.4. Форматы обмена информацией между процессором и таймером

1.5. Программирование каналов

1.6. Операции записи в канал

1.7. Операции чтения из канала

1.8. Режимы работы канала

1.9. Пример автономного использования таймера

1.10. Использование таймера в IBM PC

1.11. Описание эмулятора таймера ВИ54

1.12. Порядок выполнения лабораторной работы

1.13. Варианты заданий к лабораторной работе

Контрольные вопросы

2. ЛАБОРАТОРНАЯ РАБОТА №2. Контроллер прерываний ВН59А

2.1. Обработка прерываний

2.2. Система прерываний ВМ86

2.3. Контроллер прерываний К1810ВН59А (i8259А)

2.4. Настройка контроллера

2.5. Управление контроллером

2.6. Описание эмулятора контроллера прерываний ВН59А

2.7. Порядок выполнения лабораторной работы

2.8. Варианты заданий к лабораторной работе

Контрольные вопросы

3. ЛАБОРАТОРНАЯ РАБОТА №3 Контроллер прямого доступа к памяти ВТ37............. 50 

3.1. Прямой доступ к памяти

3.2. Контроллер прямого доступа к памяти К1810ВТ37 (i8237)

3.3. Внутренние регистры ВТ37

3.4. Программирование ВТ37

3.5. Описание эмулятора ВТ37



3.6. Порядок выполнения лабораторной работы

3.7. Варианты заданий к лабораторной работе

Контрольные вопросы

4. ЛАБОРАТОРНАЯ РАБОТА №4 Страничный механизм 32-разрядных процессоров..... 64 

4.1. Методы адресации памяти

4.2. Режимы работы 32-разрядного процессора

4.3. Формат дескриптора

4.4. Сегментный механизм

4.5. Страничный механизм для обычных страниц

4.6. Формат элемента PTE (PDE)

4.7. Особенности страничного механизма в Pentium и Р6

4.8. Описание эмулятора

4.9. Порядок выполнения лабораторной работы

4.10. Варианты заданий к лабораторной работе

Контрольные вопросы

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

ВВЕДЕНИЕ

Данное учебное пособие представляет собой руководство к лабораторным работам по курсу «Организация ЭВМ и систем». Целью курса является подробное знакомство студентов с особенностью организации современных микропроцессоров, ЭВМ и ПЭВМ, освоение ими аппаратных и аппаратнопрограммных решений, используемых при создании подсистем и узлов вычислительных устройств .

В связи с бурным развитием средств вычислительной техники и, особенно в связи с ростом парка персональных ЭВМ, весьма актуальной становится задача изучения особенностей организации подсистем вычислительных устройств и принципов их функционирования. Без устойчивых знаний в этой области невозможны ни разработка новых конкурентно-способных устройств, ни качественная эксплуатация и программирование существующей аппаратуры .

В процессе изучения курса «Организация ЭВМ и систем» [1, 2] студенты должны получить углубленные знания о современных принципах организации процессоров, оперативной памяти и кэш-памяти, подсистем ввода-вывода (таких, как подсистема обработки прерываний, прямой доступ к памяти и др.) и о взаимодействии указанных подсистем между собой .

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

–  –  –

Микросхема таймера разработана специально для использования в вычислительных системах, построенных на базе микропроцессоров фирмы Intel и им подобных [3-10]. Она предназначена для получения программноуправляемых временных задержек, генерации временных функций, организации службы системного времени и других целей. Здесь можно отметить, что настроенный таймер работает независимо (асинхронно) от процессора, поэтому теоретически имеется возможность использовать данную микросхему саму по себе. Однако при отсутствии процессора возникает проблема программирования таймера, которую в этом случае придется решать аппаратным путем .





Микросхема таймера содержит три независимых канала (соответственно Канал 0, Канал 1 и Канал 2), каждый из которых в процессе инициализации может быть настроен на счет в одном из шести режимов (режим 0 – режим 5) .

Внутри канала стоит 16-разрядный счетчик, работающий на вычитание. Перед началом работы канал должен быть запрограммирован (настроен). В процессе этой настройки каналу задается режим работы и система счисления (двоичная или двоично-десятичная), в которой он будет считать. После того как канал настроен, в счетчик канала загружается исходное число, из которого в процессе работы и будет производиться вычитание. Это число обычно называют коэффициентом пересчета и обозначают Кпр. Далее канал считает импульсы, поступающие на вход CLK канала. Декремент счетчика происходит по заднему фронту сигнала на этом входе. Например, пусть в счетчик загружен Кпр = 4, тогда после первого импульса на входе CLK содержимое счетчика будет равно 3, после второго – 2 и т.д. Результат работы канала формируется на его выходе OUT и напрямую зависит от режима, на который настроен данный канал .

Структурная схема таймера приведена на рис 1.1 .

Буфер шины данных. Это 8-битный буфер, связывающий таймер с системной шиной данных с помощью двунаправленных линий с тремя состояниями. Когда двунаправленные линии буфера переведены в Z-состояние, таймер отключен от шины данных. Подключение таймера к системной шине данных происходит, когда процессор, выполняя команду in или out, выставляет на шину адреса, адрес одного из четырех адресуемых устройств таймера (соответственно канала 0, канала 1, канала 2 или регистра управляющего слова).

Например:

–  –  –

Логика чтения/записи. Эта логика принимает сигналы с системных шин адреса и управления и на их основании генерирует управляющие сигналы для других внутренних блоков таймера. Комбинация сигналов на адресных входах А1 и А0 определяет выбор одного из четырех адресуемых устройств внутри таймера (один из каналов или регистр управляющего слова). Низкий уровень сигнала на входе IOR (input/output read – читаю порт внешнего устройства) говорит о том, что процессор выполняет команду in, читая информацию из порта какого-либо внешнего устройства. Аналогично, низкий уровень сигнала на входе IOW (input/output write – пишу в порт внешнего устройства) говорит о записи в порт (выполняется команда out). При этом невозможно одновременное поступление активного IOR и активного IOW, поскольку процессор не может выполнять команды in и out одновременно. Сигналы на входах IOR и IOW воспринимаются таймером только при наличии активного (низкого) сигнала на входе CS (chip select – выбор кристалла). Активный сигнал на CS подключает линии буфера шины данных к системной шине данных и означает, что процессор обращается именно к одному из устройств внутри таймера, а не к порту какого-либо другого внешнего устройства .

Регистр управляющего слова (РУС). Этот регистр выбирается при А0 = А1 = 1, CS = 0 и IOW = 0. При такой комбинации входных сигналов байт информации снимается с системной шины данных и через буфер шины данных и внутреннюю шину таймера попадает в РУС. Далее этот байт рассматривается как управляющее (настроечное) слово одного из каналов. Оно содержит в себе информацию о режиме работы канала, системе счисления и формате передачи Кпр в этот канал (точнее о формате передачи информации между процессором и каналом). Два старших бита управляющего слова задают номер канала, которому оно предназначено. Из РУС эта информация (без двух старших бит) переписывается в регистр статуса (смотри ниже) соответствующего канала .

Важным является то, что в РУС информацию можно только записывать, считывание информации из РУС невозможно. То есть недопустима команда in al, 43h .

1.2. Структурная схема канала

Структура канала приведена на рис. 1.2 .

Счетчик (counting element). Это основной элемент канала. Как уже говорилось ранее, этот элемент представляет собой 16-разрядный счетчик, работающий на вычитание. Максимальное число, которое можно загрузить в счетчик, настроенный на двоичную систему счисления, равен 216-1 (65535). В двоично-десятичной системе счисления это максимальное число равно 9999 .

Входной буфер (count register). Когда в канал записывается новый Кпр, он вначале попадает во входной буфер и только затем переписывается в счетчик канала. Содержимое счетчика канала меняется в процессе счета, а содержимое входного буфера меняется только при загрузке в канал нового Кпр, а также при программировании или перепрограммировании канала. В последних случаях входной буфер просто обнуляется. В некоторых режимах при определенных условиях производится перезагрузка счетчика канала из входного буфера .

Выходной буфер (output latch). Используется при чтении текущего состояния счетчика.

Имеется три возможности выполнить эту задачу:

1) прямое чтение из канала;

2) чтение с помощью команды «чтение на лету»;

3) чтение с помощью команды «обратное чтение» .

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

Рис. 1.2. Структурная схема канала Регистр статуса (status register). При программировании канала в этот регистр записываются шесть младших бит управляющего слова канала (из РУС). Два оставшихся бита регистра статуса индицируют текущее состояние выхода канала (OUT) и флага загрузки счетчика (null count flag) .

Буфер статуса (status latch). Текущий статус канала можно прочитать с помощью команды «обратное чтение». Эта команда может заставить канал переписать текущий статус из регистра статуса в буфер статуса. А уже оттуда его можно в любой момент считать с помощью команды in .

CLK (clock – частота) – вход импульсов, которые считает канал. По заднему фронту импульса на этом входе (обычно при GATE = 1) текущее содержимое счетчика уменьшается на единицу .

GATE (вентиль) – управляющий вход канала. Грубо можно считать, что при GATE = 1 канал считает приходящие на CLK импульсы, а при GATE = 0 он их игнорирует. На самом деле воздействие сигнала GATE на канал несколько более сложно и зависит от режима, на который настроен канал. Более подробно воздействие GATE на текущий счет будет рассмотрено ниже .

OUT – выход канала. На этой линии канал формирует результат своей работы. Этот результат напрямую зависит от режима, на который настроен канал (см. ниже) .

–  –  –

ШУ ШД

–  –  –

Здесь IOR и IOW – системные управляющие сигналы, снимаемые с системной шины управления (ШУ). Эти сигналы задают таймеру вид операции, чтение или запись соответственно. На системную шину управления эти сигналы подаются либо со специальных логических схем (минимальный режим процессора i8086), либо с выходов системного контроллера ВГ88 (максимальный режим) .

D7-0 – 8-разрядная шина данных таймера. По этим линиям идет обмен информацией между таймером и процессором. По этим линиям на таймер поступают управляющие слова каналов и коэффициенты пересчета, по ним же считываются в процессор текущие состояния каналов и их статус. Как правило, шина данных таймера подключается к младшим линиям (D7-0) системной шины данных (ШД). Подключение шины данных таймера к ШД происходит только тогда, когда процессор обращается к одному из адресуемых устройств таймера, то есть выполняет команду in или out c соответствующим адресом. В остальное время линии шины данных таймера находятся в Z-состоянии (разрыв). Условия подключения и отключения таймера к/от ШД показаны в табл. 2 .

CS – выбор кристалла. Активный (нулевой) сигнал на этом входе означает, что процессор обращается к таймеру. В большинстве случаев активный CS подключает таймер к ШД. Обычно сигнал на вход CS поступает с одного из выходов адресного селектора (дешифратора), однако, если в системе мало портов, схему селектора можно не использовать, снимая CS с одной из адресных линий шины адреса (ША). Например, ноль на А7 подключает к ШД таймер, ноль на А6 – контроллер прерываний и т.д .

А1, А0 – комбинация сигналов на этих входах при активном CS определяет одно из четырех адресуемых устройств внутри таймера (см. табл .

1.1). Как правило, на эти входы заводятся сигналы с младших линий (А1 и А0) системной шины адреса .

–  –  –

То есть, если на линиях А7–А2 системной шины адреса стоит комбинация 010000, то селектор вырабатывает активный сигнал на вход CS таймера, подключая последний к системной шине данных. Сигналы на линиях А1–А0 системной шины адреса задают при этом внутренний порт таймера .

Далее в табл. 1.2 приводятся полные условия подключения таймера к (отключения от) ШД .

–  –  –

Звездочками в табл. 2 обозначены безразличные состояния сигналов. В п.8 таймер держит свои линии данных в Z-состоянии, поскольку чтение из РУС недопустимо. В п. 10 таймер держит свои линии данных в Z-состоянии, поскольку нет ни активного сигнала чтения (IOR), ни активного сигнала записи (IOW) .

1.4. Форматы обмена информацией между процессором и таймером

В процессе совместной работы процессор может обмениваться с таймером следующей информацией:

1. Процессор передает в РУС управляющее слово канала. Формат этого слова – 1 байт .

2. Процессор читает из буфера статуса текущий статус канала. Формат передаваемой информации – 1 байт .

3. Процессор заносит в канал Кпр. Его формат – 2 байта .

4. Процессор считывает текущее значение из счетчика канала. Формат этого значения – 2 байта .

Шина данных у таймера 8-разрядная, поэтому передавать по ней двухбайтовую информацию можно различными способами.

Для таймера предусмотрено три способа загрузки Кпр канала:

1) передается только младший байт Кпр (старший байт при этом будет равен нулю);

2) передается только старший байт Кпр (младший байт при этом будет равен нулю);

3) передаются оба байта Кпр (за две передачи, сначала младший, потом старший) .

В каком формате будет загружаться Кпр, задается каналу при его настройке (в управляющем слове). После этого заданный формат передачи должен неукоснительно соблюдаться как при загрузке Кпр, так и при чтении текущего состояния счетчика канала. Пусть наш канал настроен на передачу обоих байт и надо занести в этот канал Кпр = 12. Нам придется организовать две передачи. Сначала передать младший байт (12), а затем старший байт, хотя последний и равен нулю. Если ограничиться передачей только младшего байта, он будет записан только в буфер канала, а далее канал будет ждать передачи «обещанного» старшего байта. Только когда старший байт будет передан, Кпр будет переписан из входного буфера в счетчик канала .

Приведем пример. Пусть канал 0 настроен на передачу только младшего байта и в него надо загрузить Кпр = 3, канал 1 – только старшего байта,

Кпр = 400h и канал 2 – двух байт, Кпр = 10. Тогда:

–  –  –

; чтение текущего содержимого канала 0 (читаем только младший байт!) in al, 40h ; чтение текущего содержимого канала 1 (читаем только старший байт!) in al, 41h

–  –  –

На практике, как правило, используют формат передачи «оба байта, сначала младший, потом старший». Хотя, как видно из примера, этот формат требует для своей реализации большего числа команд, зато интуитивно он значительно понятней, чем два других .

–  –  –

После включения питания, состояние всех каналов таймера не определено, поэтому перед началом работы все используемые каналы должны быть запрограммированы. Программирование канала заключается в передаче в РУС управляющего слова этого канала и последующей загрузки в инициализированный канал коэффициента пересчета (в соответствии с заданным в управляющем слове форматом передачи). Загрузка Кпр до передачи управляющего слова невозможна .

Формат управляющего слова приведен на рис. 1.4 .

–  –  –

Здесь биты SC (select counter) определяют канал, которому предназначено данное управляющее слово, биты RW (read/write) задают формат передачи, биты M (mode) определяют режим работы канала и бит BCD (binary coded decimal) – систему счисления. Расшифровка значений этих битов дана в табл .

1.3 – 1.6. Звездочка означает безразличное значение бита .

–  –  –

Операции записи используются в процессе программирования канала, когда в канал передаются управляющее слово и коэффициент пересчета .

Процедура программирования канала – гибкая процедура.

Необходимо соблюдать только два простых правила:

1) коэффициент пересчета загружается только после загрузки управляющего слова;

2) коэффициент пересчета должен загружаться в соответствии с заданным в управляющем слове форматом передачи .

Каких-либо других ограничений для процедуры программирования канала не существует.

Например, приведенная ниже последовательность действий при настройке всех трех каналов является вполне корректной, если для всех каналов задан формат передачи «оба байта»:

–  –  –

В любой момент времени в настроенный и работающий канал можно загружать новые Кпр, правда реакция на это действие будет зависеть от режима, в котором работает канал .

–  –  –

Иногда некоторой программе требуется прочитать текущее содержимое счетчика какого-либо канала. Например, такая задача может возникнуть при программной реализации генератора случайных чисел.

Это можно сделать одним из трех способов:

• прямое чтение из канала;

• с помощью команды «чтение налету» (counter latching command);

• с помощью команды «обратное чтение» (read-back command) .

При прямом чтении из канала мы просто обращаемся к каналу одной или двумя (в зависимости от заданного каналу формата передачи информации) командами in и считываем число из счетчика в процессор. К сожалению, при этом возникает одна серьезная проблема. Таймер работает независимо от процессора и довольно велика вероятность, что обращаясь к каналу в произвольное время мы попадем на переходной процесс в счетчике. При этом считанный нами результат будет очевидно недостоверен. Поэтому этот способ требует предварительной остановки счета, например, путем снятия активного сигнала на входе GATE или прекращения подачи импульсов на CLK. В любом случае в систему придется вводить дополнительную аппаратуру, позволяющую программным путем останавливать счет, что, очевидно, является не лучшим решением .

Два других способа считывания текущего содержимого счетчика канала не требуют остановки счета. Суть их заключается в том, что для работающего канала (или нескольких каналов сразу) в РУС подается специальная команда .

По этой команде, выбранный канал (каналы) сам фиксирует текущее содержимое счетчика в выходном буфере, откуда оно может быть считано одной или двумя командами in в любое удобное время. До тех пор, пока зафиксированная в выходном буфере информация не будет считана в соответствии с заданным каналу форматом передачи, эта информация меняться в буфере не будет. Если, например, послать для одного и того же выбранного канала три команды «чтения налету» без промежуточного считывания результатов, в буфере будет стоять число, зафиксированное первой из этих команд .

Формат команды «чтение налету» приведен на рис. 1.5 .

–  –  –

Здесь, как и ранее, SC1 и SC0 задают номер канала, которому предназначена эта команда (см. табл. 3). Комбинация SC1 = SC0 = 1 означает, что эта команда не является командой «чтение налету», а является командой «обратное чтение». Значение разрядов D3-D0 безразлично.

Например, хотим прочитать текущее содержимое счетчика в канале 1, который настроен на формат передачи «оба байта»:

; передаем в РУС команду «чтение налету» для канала 1 mov al, 01000000b out 43h, al

–  –  –

Формат команды «обратное чтение» приведен на рис. 1.6. Эта команда более гибкая, чем команда «чтение на лету», поскольку позволяет фиксировать текущие значения счетчиков сразу во всех трех (или меньше) каналах и (или) текущий статус выбранных каналов .

–  –  –

Здесь биты CNT2 – CNT0 (counter) задают каналы, для которых будут фиксироваться счетчик и (или) статус. Если бит CNTi =1 канал выбран для фиксации. Если бит STATUS =0, для выбранных каналов фиксируется текущий статус. Аналогично, если COUNT=0, для выбранных каналов фиксируется текущее значение счетчика. Например, хотим прочитать значение счетчиков в каналах 0 и 2. Для обоих каналов задан формат передачи «оба байта» .

;передаем команду «обратное чтение»

mov al, 11011010b out 43h, al

–  –  –

Если для канала зафиксированы одновременно статус и значение счетчика, то первым из канала считывается статус (за одну передачу, так как формат статуса – 1 байт), а затем значение счетчика (за одну или две передачи) .

Например, канал 1 настроен на формат передачи «оба байта» и мы хотим получить его статус и текущее значение счетчика .

–  –  –

Здесь разряды D5-D0 совпадают с аналогичными разрядами управляющего слова канала (разд. 1.5). То есть, биты RW показывают формат передачи, биты М – режим, а бит BCD – систему счисления, на которые настроен данный канал .


Бит OUT показывает текущее состояние выхода канала OUT (ноль или единица). Бит NULL COUNT показывает, был ли последний загруженный в канал Кпр переписан из входного буфера в счетчик. Если NULL COUNT = 0, значит новый Кпр уже находится в счетчике и счетчик с ним уже работает. Запись в РУС нового управляющего слова для канала i устанавливает флаг NULL COUNT в единицу. Аналогичное действие осуществляет запись нового Кпр во входной буфер канала. И только загрузка Кпр из входного буфера в счетчик канала устанавливает флаг NULL COUNT в ноль .

На практике операции чтения из канала используются редко .

1.8. Режимы работы канала

РЕЖИМ 0 (interrupt on terminal count – программируемая задержка) .

После загрузки в канал управляющего слова на выходе OUT устанавливается ноль. Счет начинается после загрузки Кпр в счетчик канала при наличии GATE = 1. В момент, когда счетчик обнуляется, на OUT появляется единица .

Эта единица будет стоять на OUT до загрузки в канал нового Кпр (или до перенастройки канала). Если во время счета снять единицу с входа GATE, то счет останавливается. Когда на GATE вновь появляется единица, счет возобновляется с того места, на котором он был прерван (если в момент снятия GATE в счетчике было 7, то при подаче GATE счет начнется с 7-и). На рис 1.8 .

приведена упрощенная временная диаграмма работы канала в режиме 0 (GATE = 1 подразумевается) .

Рис. 1.8. Работа канала в режиме 0 Режим 1 (hardware retriggerable one-short – ждущий мультивибратор) .

После загрузки управляющего слова на выходе OUT устанавливается единица .

Кпр записывается во входной буфер. Перезапись Кпр из входного буфера в счетчик происходит только по переднему фронту сигнала на входе GATE канала. То есть в этом режиме счет запускается (и перезапускается) аппаратно передним фронтом на GATE. Когда Кпр загружается в счетчик (запускается счет) на выходе OUT устанавливается ноль. В момент, когда счетчик обнуляется, на OUT снова появляется единица, которая стоит там до нового переднего фронта GATE. Последний снова перезагрузит Кпр из входного буфера в счетчик канала и счет начнется сначала. Если во время счета снять сигнал GATE, то счет не останавливается, а продолжается, однако новая подача GATE вызовет перезагрузку счетчика канала и счет начнется сначала .

Упрощенная диаграмма работы канала в режиме 1 приведена на рис 1.9 (передний фронт GATE подразумевается) .

Рис. 1.9. Работа канала в режиме 1

Режим 2 (rate generator – делитель частоты). В этом режиме канал делит входную частоту, поступающую на вход CLK, на заданный Кпр .

Например, на CLK подаются импульсы с частотой 100 Гц и в канал загружен Кпр = 5, тогда на выходе OUT будут формироваться импульсы с частотой 20 Гц. Когда в канал загружается управляющее слово, на выходе OUT устанавливается единица. Загружаемый Кпр попадает через входной буфер в счетчик и запускает счет (если GATE = 1). Когда счетчик досчитывает до единицы, на OUT появляется ноль. Когда счетчик досчитывает до нуля, на OUT снова устанавливается единица, а счетчик автоматически перезагружается исходным Кпр из буфера и счет начинается сначала. И так далее. Снятия сигнала GATE останавливает счет. Передний фронт GATE запускает счет сначала, поскольку при этом счетчик перезагружается исходным Кпр из буфера. При загрузке в канал нового Кпр, счетчик вначале досчитает до нуля и только затем начнет работать с новым Кпр. Упрощенная диаграмма работы канала в режиме 2 приведена на рис. 1.10 (GATE = 1 подразумевается) .

Рис. 1.10. Работа канала в режиме 2

РЕЖИМ 3 (square wave mode – генератор меандра). То же, что и режим 2 с единственным отличием. Обозначим период импульсов на входе CLK – Tclk, период положительного импульса (единицы) на выходе OUT – Tout+ и период отрицательного импульса (нуля) на выходе OUT – Tout-.

Тогда для режима 2 имеем:

–  –  –

Например, если Кпр = 8, то Tout+ = 4Tclk и Tout- = 4Tclk. Если же Кпр = 11, то Tout+ = 6Tclk и Tout- = 5Tclk .

Упрощенная временная диаграмма для режима 3 приведена на рис. 1.11 .

–  –  –

Режим 4 (software triggered strobe – программно запускаемый строб) .

После загрузки управляющего слова на выходе OUT устанавливается единица .

Загрузка Кпр запускает счет (если GATE = 1). Когда счетчик досчитывает до нуля, на OUT появляется ноль и, через один импульс на входе CLK, вновь единица. Чтобы запустить счет снова, надо программно загрузить в канал новый Кпр. Сигнал GATE влияет на счет также как в режиме 0. То есть снятие GATE останавливает счет, а подача GATE запускает продолжение счета .

Упрощенная диаграмма для режима 4 приведена на рис. 1.12 .

Рис. 1.12. Работа канала в режиме 4

Режим 5 (hardware triggered strobe – аппаратно запускаемый строб) .

Отличается от режима 4 только по воздействию сигнала GATE. Здесь это воздействие такое же, как в режиме 1. То есть, передний фронт на GATE запускает или перезапускает счет, загружая в счетчик Кпр из входного буфера .

Упрощенная диаграмма не отличается от диаграммы для режима 4 (см. рис .

1.12) .

Влияние сигнала GATE на счет в различных режимах показано в табл .

1.7 .

–  –  –

Режимы 2 и 3 – периодические, поскольку счетчик автоматически перегружается заданным Кпр и начинает счет сначала. Именно эти режимы чаще всего и используются на практике, в частности, в IBM PC. Режимы 0,1,4 и 5 требуют для перезапуска определенных действий со стороны программиста или аппаратуры системы. Эти режимы предназначены для специализированных управляющих систем .

Интересным является тот факт, что ни в каком режиме счетчик, досчитав до ноля, не останавливается, а продолжает считать дальше (65535, 65534…в двоичной или 9999,9998… в двоично-десятичной системе счисления). Отсюда вывод, загрузив в канал Кпр = 0 мы получим максимальный коэффициент пересчета (65536 или 10000) .

1.9. Пример автономного использования таймера

Пусть, например, при наличии в системе fопорной = 1 МГц нам надо получить fвыходную = 1 Гц. То есть нам надо разделить fопорную на 106. Поскольку один канал такой коэффициент пересчета обеспечить не может, придется использовать два канала, например, каналы 0 и 1. Схема их соединения приведена на рис. 1.14 .

ВИ 54

–  –  –

Оба канала настраиваются на работу в режиме 3, на десятичный счет и в каждый из них загружается коэффициент пересчета, равный 103. Произведение этих двух коэффициентов и дает в результате 106. Далее приводится программа настройки и загрузки каналов. При этом считаем, что каналы и РУС имеют системные адреса, соответствующие IBM ПЭВМ .

–  –  –

В этой программе желательно обратить внимание на следующий момент, который вызывает затруднение у большого числа студентов. Почему, задавая в программе десятичное число 10 мы пишем 10h? Дело заключается в следующем. В двоично-десятичной системе счисления число 10 (см. прил. А) выглядит как 10000000. Здесь старшие четыре двоичных цифры (1000) кодируют десятичную цифру 1, а младшие четыре (0000) – десятичную цифру

0. Если мы в программе напишем число 10, транслятор поймет это число как десятичное и переведет его в двоичный эквивалент 00001010, что очевидно не соответствует нужному нам двоично-десятичному числу. А вот число 10h транслятор поймет как шестнадцатеричное и переведет его как 10000000, что нам и требуется .

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

Обмен информацией между процессором и таймером ведется только через регистр al. Но этот регистр 8-разрядный, то есть нужный нам Кпр = 1000 в него просто не поместится.

Проблема решается тривиальным образом:

–  –  –

Схема использования таймера в IBM – подобных ПЭВМ приведена на рис. 1.13 .

Канал 0 отведен для службы системного времени. На выходе этого канала формируются импульсы с частотой примерно равной 18,2 Гц. Эти импульсы подаются на вход IR0 контроллера прерываний ВН59 и представляют собой запросы на прерывание от таймера .

Канал 1 используется для регенерации динамической памяти. Сигнал с выхода этого канала подается на вход DREQ0 контроллера прямого доступа к памяти ВТ37 и является запросом на прямой доступ к памяти .

Канал 2 предназначен для выработки звуковых сигналов. Его выход заведен на встроенный динамик. Работа канала 2 заключается в том, что он делит опорную частоту (fоп =1,19... МГц.) на коэффициент пересчета Кпр, который заранее загружается в канал. Получаемая fвых=fоп/Кпр подается на динамик. Надо учитывать, что работой канала 2 и подачей fвых на динамик управляют два младших бита порта 61h. Если бит 0 порта 61h равен единице, то работа канала 2 (счет) разрешается. Если бит 1 порта 61h равен единице, то разрешается подача fвых на динамик. Таким образом, звук будет воспроизводиться, только если оба этих бита установлены в единицу .

Для настройки канала 2 надо выполнить две команды:

–  –  –

1. Организовать «пустой» цикл, то есть заставить процессор заниматься бесполезной, но достаточно долгой работой. Это можно реализовать, например так:

mov bx, 400

m1:

mov cx, 0ffffh

m2:

loop m2 dec bx jnz m1 Это вложенный пустой цикл, который будет повторяться 400*65535 раз .

Способ очень простой, но имеет существенный недостаток. На разных процессорах, работающих на разной частоте, задержка будет разной. Если задержка окажется слишком мала, придется увеличивать число 400 и перетранслировать программу .

2. Работа с системными часами компьютера. Прерывание 1ah (функция 0) возвращает в регистровой паре cx:dx текущее число тиков таймера (канала 0!) .

Запоминаем число, полученное в dx, в любом другом свободном регистре, допустим в bx. Прибавляем к bx число Х. И далее с помощью того же прерывания 1ah постоянно считываем системное время, до тех пор, пока число, вернувшееся в dx, не окажется больше значения в bx. Учитывая, что канал 0 таймера тикает примерно 20 раз в секунду (точно 18,2), получаем задержку Х/20 секунд .

mov ah, 0 int 1ah mov bx, dx add bx, 40

mwait:

mov ah, 0 int 1ah cmp dx, bx jb mwait Далее приводится полный текст программы

–  –  –

При этом учитываются следующие соотношения:

частота ноты "до" 1-й октавы (fдо) = 32.625 Гц;

частота ноты "до" 2-й октавы = 2*fдо;

частота ноты "до" 3-й октавы = 4*fдо;

и так далее;

частота "до-диез" = а*fдо;

частота "ре" = а*fдо-диез;

и т.д., где а =1,06 (приблизительно) .

Если нам необходимо сыграть на компьютере мелодию, то проще подсчитать коэффициенты всех нот заранее или взять их готовыми (см .

прил. В), так как человечеству эти коэффициенты давно известны. Таким образом, для мелодии желательно подготовить следующие данные:

а) коэффициент пересчета и время звучания для каждой ноты;

б) длительности всех пауз между нотами .

После того как все эти числа известны, надо последовательно выполнять следующие действия:

1. Настроить канал 2 .

2. Разрешить звучание, установив в единицу оба младших бита порта 61h .

3. За две передачи в канал 2 загрузить Кпр для текущей ноты .

4. Ввести задержку, равную длительности ноты .

5. Запретить звучание .

6. Выдержать паузу требуемой длительности и перейти к пункту 2 .

Стандартно подобная программа пишется примерно следующим образом .

Создается массив нот (коэффициентов пересчета), который заканчивается «не нотой», например, нулем. Эта «не нота» задает конец массива (мелодии). Если надо, создаются массивы длительностей нот и пауз между нотами. Программа считывает из массива нот очередной элемент, проигрывает его, считывает очередной элемент и так до тех пор, пока будет считана «не нота». После этого программа заканчивает свою работу. Не забудьте при выходе из программы запретить звучание, иначе компьютер возможно, хотя и маловероятно, будет продолжать играть последнюю ноту. Достоинство такой программы состоит в том, что для изменения мелодии достаточно изменить числа в массивах .

Примечание: для создания звуковых эффектов при проигрывании какойлибо ноты можно с определенной частотой сбрасывать/устанавливать бит 1 в порту 61h .

1.11. Описание эмулятора таймера ВИ54

При изучении таймера ВИ54 в курсе «Организация ЭВМ и систем»

предполагается выполнение двух лабораторных работ. Первая проводится на программном эмуляторе и позволяет студенту подробно ознакомится с внутренней структурой таймера, процессом его настройки и работой в различных режимах. Вторая предполагает написание ассемблерной программы, воспроизводящей на встроенном динамике ПЭВМ какую-либо простую мелодию .

Внешний вид окна эмулятора приведен на рис. 1.15. Это окно появляется на экране после запуска программы emu1.exe .

Работа с эмулятором осуществляется следующим образом:

1. Установить правильные значения сигналов CS, RD, WR, A1 и А0 .

2. Набрать в окне D7…D0 настоечное слово канала .

3. Нажать кнопку ПРОВЕРКА, если слово достоверно, то на экране появится кнопка ЗАГРУЗКА .

4. Нажать кнопку ЗАГРУЗКА. После этого настроечное слово попадает в регистр статуса выбранного канала .

5. Установить правильные значения сигналов CS, RD, WR, A1 и А0 .

6. Набрать в окне D7…D0 коэффициент пересчета канала (или младший байт этого коэффициента при передаче «оба байта») .

7. Нажать кнопку ПРОВЕРКА, если Кпр достоверен, на экране появится кнопка ЗАГРУЗКА .

8. Нажать кнопку ЗАГРУЗКА. После этого Кпр (или его младший байт) попадает во входной буфер .

9. При формате передачи «оба байта» повторить пп. 6–8 для старшего байта Кпр .

10. Установить нужный уровень сигнала на входе GATE для выбранного канала .

11. Нажать кнопку CLK. После этого на каналы начинают поступать тактирующие импульсы, и настроенный канал начинает считать .

Длительность тактирующих импульсов можно менять вручную, изменяя число в окне, слева от кнопки CLK. Результат работы канала отображается на его выходе OUT .

Рис. 1.15. Внешний вид эмулятора

1.12. Порядок выполнения лабораторной работы

1. В соответствии с вариантом подготовить дома ассемблерные программы настройки каналов таймера. Изучить теоретический материал .

2. Получить допуск к выполнению лабораторной работы у преподавателя .

3. Выполнить лабораторную работу на эмуляторе int82554 .

4. Оформить отчет о выполнении лабораторной работы .

5. Защитить лабораторную работу .

–  –  –

1. В соответствии с вариантом (см. табл. 1.8) настроить каналы таймера на заданный режим работы и систему счисления. Загрузить в каналы заданные коэффициенты пересчета и проверить работу каналов в пошаговом режиме .

2. Написать ассемблерную программу настройки каналов .

–  –  –

Контрольные вопросы к лабораторной работе Таймер ВИ54

1. Сколько независимых каналов содержит в себе микросхема таймера?

2. Какие действия выполняет настроенный работающий канал?

3. Какие действия должен выполнить программист для настройки канала?

4. Что понимается под коэффициентом пересчета канала?

5. Какой максимальный коэффициент пересчета можно загрузить в канал, настроенный на работу в двоичной системе счисления?

6. Какой максимальный коэффициент пересчета можно загрузить в канал, настроенный на работу в двоично-десятичной системе счисления?

7. Какие существуют форматы обмена информацией между процессором и выбранным каналом таймера?

8. Какими ассемблерными командами можно обратиться к таймеру?

9. Какие системные адреса присвоены портам таймера в IBMподобных ПЭВМ?

10. Какими способами можно прочитать текущее содержимое счетчика канала?

11. Каким способом можно прочитать текущий статус выбранного канала?

12. На работу в скольких различных режимах может быть настроен канал?

13. Какие из возможных режимов работы канала являются периодическими?

14. Чем отличается работа канала в режиме 2 от его работы в режиме 3?

15. Какие из возможных режимов используются в IBM-подобных ПЭВМ?

16. Какие функции выполняет управляющий вход канала GATE?

17. Какой канал таймера в IBM-подобных ПЭВМ управляет работой встроенного динамика?

18. Младшие биты какого порта в IBM-подобных ПЭВМ разрешают/запрещают звучание встроенного динамика?

19. На каком канале таймера в IBM-подобных ПЭВМ организуется служба системного времени?

20. Сколько микросхем таймера ВИ54 используется в IBM-подобных ПЭВМ?

21. Каково назначение входов А1 и А0 таймера ВИ54?

22. Каково назначение входов IOR и IOW таймера ВИ54?

23. По какому фронту сигнала на входе CLK происходит декремент счетчика канала?

–  –  –

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

При переводе числа из десятичной системы счисления в двоичнодесятичную, каждая десятичная цифра кодируется тетрадой (четверкой) двоичных цифр, в соответствии с табл. 1.9. Обратный перевод осуществляется аналогично, в соответствии с этой же таблицей .

–  –  –

Под прерыванием понимается некоторое событие, заставляющее МП прервать выполнение текущей программы (фоновая программа) и перейти к подпрограмме обработки (обработчик) этого события. После того, как обработчик завершает свою работу, МП возвращается к прерванной программе, в ту точку, где она была прервана .

Все прерывания в системе можно разделить на внутренние и внешние .

Внешние прерывания вызываются событиями, внешними по отношению к МП, а внутренние – событиями, происходящими внутри МП .

Конечно, обработка прерываний в МП различных типов имеет свои особенности, однако общая схема действий для любых МП остается одной и той же .

При обработке внутреннего прерывания МП «известна» его причина, а, следовательно, известен источник запроса.

Поэтому, укрупнено, при внутреннем прерывании МП выполняет следующие действия:

• запоминает в стеке адрес возврата в прерываемую программу;

• определяет начальный адрес обработчика для известного источника запроса и передает управление этому обработчику;

• когда обработчик завершает свою работу, достает из стека адрес возврата, возвращая тем самым управление прерванной программе .

Внешние прерывания отличаются от внутренних тем, что МП неизвестен источник запроса, поскольку все внешние запросы заводятся на единственный вход процессора INTR. Следовательно, для внешнего прерывания в приведенную выше схему действий добавляется еще один этап: прежде чем определить начальный адрес обработчика, МП должен определить источник запроса .

Существуют два метода определения внешнего источника запроса:

• метод опроса;

• векторные прерывания .

Метод опроса. Этот метод можно реализовать, например, следующим образом. В систему вводится специальный порт (или несколько портов, при большом числе внешних источников прерываний). Все внешние запросы заводятся на входы этого порта, причем для каждого запроса отводится один бит порта. Одновременно все запросы через схему ИЛИ заводятся на вход INTR МП. На рис. 2.1 приводится подобная схема для восьми внешних источников прерываний (IR7 – IR0) .

Восприняв запрос на входе INTR, МП выполняет следующий фрагмент программы:

–  –  –

Рис. 2.1. Реализация метода опроса Возможна ситуация, когда МП получает сразу несколько запросов на прерывание от разных внешних источников. Чтобы МП мог в такой ситуации функционировать, всем источникам запросов присваиваются приоритеты. При одновременном поступлении нескольких запросов, обслужен будет запрос с наивысшим приоритетом. Для нашего примера старший приоритет будет у IR7, а младший – у IR0. Для того чтобы изменить приоритеты в нашем примере на противоположные, достаточно использовать команду сдвига вправо .

Достоинством метода опроса являются небольшие аппаратурные затраты, а недостатком – медленная реакция МП на запросы с низким приоритетом .

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

Когда МП выставляет сигнал подтверждения прерывания, контроллер прерываний выдает МП вектор данного прерывания или информацию, позволяющую определить этот вектор .

2.2. Система прерываний ВМ86

В МП ВМ86 каждому источнику запроса на прерывание ставится в соответствие так называемый тип (номер) прерывания. Тип имеет формат 1 байт. То есть всего возможно 256 различных источников запросов. Для того чтобы МП по известному типу мог определить начальный адрес обработчика, в ОП создается таблица векторов прерываний. Каждый вектор представляет собой пару «сегмент:смещение» и однозначно задает начальный адрес обработчика прерывания данного типа. В ОП вектор занимает 4 байта. Таблица прерываний ВМ86 всегда располагается в младшем килобайте ОП. Ее формат приведен на рис. 2.2 .

Здесь displ и disph – соответственно младший и старший байт смещения, а segl и segh – младший и старший байт сегмента. Из рис. 2.2 видно, что для определения адреса вектора достаточно взять тип и умножить его на 4. Именно так и вычисляет адрес вектора МП. Так как таблица прерываний располагается по младшим адресам ОП, никакие сегментные регистры в формировании адреса вектора участия не принимают .

–  –  –

.

.

Рис. 2.2.

Формат таблицы прерываний При восприятии любого прерывания ВМ86 выполняет следующую последовательность действий:

• запоминает в стеке содержимое регистра флагов f и адрес возврата (содержимое регистров cs и ip);

• по известному типу находит в таблице соответствующий вектор и загружает disp в ip, а seg – в cs, тем самым, передавая управление обработчику .

Помимо рассмотренных выше двух пунктов, МП также сбрасывает в ноль флаги if и tf, маскируя внешние прерывания и запрещая пошаговое выполнение обработчика .

Возврат из обработчика в фоновую программу осуществляется по команде iret, которую ставит в обработчике программист. Данная команда последовательно выталкивает из стека три слова. Первое попадает в ip, второе в cs и третье – в регистр флагов f. Таким образом, управление передается фоновой программе в ту точку, на которую указывает адрес возврата .

–  –  –

Основная задача контроллера – сообщить процессору какое внешнее устройство его запросило .

Подключение ВН59 к системной шине показано на рис. 2.3 .

–  –  –

Контроллер имеет восемь входов запросов на прерывание (IR7 – IR0) .

Восприняв запрос на одном из этих входов ВН59, формирует сигнал на выходе INT. Этот сигнал подается на вход INTR ВМ86. Если внешние прерывания не замаскированы (флаг if установлен в единицу), МП подтверждает прерывание, выставляя два сигнала на выходе INTA. Эти сигналы поступают на одноименный вход контроллера, и по второму из них ВН59 выставляет на ШД тип прерывания. Этот тип он формирует следующим образом: старшие пять разрядов задает программист при настройке контроллера, а на место младших трех разрядов ВН59 подставляет двоичный номер линии, по которой пришел запрос .

Внутренняя структура ВН59 представлена на рис. 2.4 .

Рис. 2.4. Внутренняя структура ВН59

Буфер данных используется для связи контроллера с шиной данных процессора (ШД). Контроллер подключается к ШД, когда на его вход CS приходит активный (нулевой) сигнал и при подтверждении прерывания (сигнал INTA). Система распаивается таким образом, чтобы активный CS приходил, когда процессор обращается к одному из двух внутренних портов контроллера командой in или out .

Схема чтения/записи управляет чтением/записью внутренних регистров контроллера. Активный сигнал IOR (вырабатывается при выполнении процессором команды in) задает операцию чтения, активный IOW (команда out) – операцию записи .

Каскадный буфер содержит схему распознавания каскадного соединения нескольких контроллеров, которая будет рассматриваться в дальнейшем .

IRR – 8-разрядный регистр запросов прерываний. В нем запоминаются все запросы, приходящие на входы IR7 – IR0. Когда прерывание подтверждается процессором (приходит сигнал INTA), соответствующий разряд IRR сбрасывается. Текущее содержимое IRR можно прочитать с помощью команды OCW3 (см. ниже) .

ISR – 8-разрядный регистр обслуживаемых запросов. Соответствующий бит в этом регистре устанавливается, когда прерывание подтверждается процессором (приходит сигнал INTA). Сбрасывается этот бит, в зависимости от настройки контроллера, либо специальной командой EOI, которую формирует программист, как правило, в конце обработчика, либо автоматически (AEOI) .

Установленный разряд ISR блокирует (маскирует) восприятие контроллером запросов, имеющих тот же или более низкий по отношению к установленному разряду приоритет (пришедший запрос запоминается в IRR, но запрос INT на процессор не вырабатывается). Устранить блокирующее влияние разрядов ISR можно либо путем их сброса (EIO), либо путем специального маскирования .

Текущее содержимое IRR можно прочитать с помощью команды OCW3 (см .

ниже) .

IMR – 8-разрядный регистр масок, содержит маски, позволяющие заблокировать прохождение поступившего запроса в процессор. IMRi = 0 разрешает запрос на ножке IRi, IMRi = 1 – запрещает .

Несмотря на то, что внутренняя архитектура ВН59 включает в себя довольно много различных регистров, с точки зрения программиста, контроллер содержит всего два адресуемых устройства, выбор между которыми определяет сигнал на линии А0 .

В системе могут использоваться несколько ВН59, соединенных каскадно .

При этом один контроллер является ведущим (MASTER), а все остальные ведомыми (SLAVE). Выходы INT ведомых контроллеров заводятся на входы IRi ведущего контроллера. Таким образом, максимальное число контроллеров в системе равно девяти, а максимально возможное число источников внешних прерываний – равно 64. Например, в IBM-подобных ПЭВМ используются два контроллера прерываний. Ведущему присвоены системные адреса 20h (A0 = 0) и 21h (A0 = 1), ведомому – а0h и а1h. Таким образом, организуется 15 входов запросов на прерывание. Схема подключения контроллеров в IBM проведена на рис. 2.5 .

–  –  –

Перед началом работы все контроллеры должны быть настроены. Для этого на каждый ВН59 надо последовательно подать три или четыре команды инициализации (ICW1 – ICW4). Три команды подаются, если в системе один контроллер прерываний, четыре – если несколько. Если в системе несколько контроллеров, вначале настраивается MASTER, а затем SLAVE. Рассмотрим далее форматы настроечных команд .

ICW1 передается при А0=0 и имеет формат, приведенный на рис. 2.6 .

–  –  –

При LTIM = 1 запросы на IR7-0 воспринимаются по уровню сигнала, при LTIM = 0 – по фронту сигнала .

Если SINGL = 0 – в системе несколько контроллеров и, следовательно, будет команда инициализации ICW3. При SINGL = 1 – в системе один контроллер и ICW3 передаваться не будет .

При IC4 = 1 будет команда ICW4, при IC4 = 0 ICW4 не будет .

Например, в системе один контроллер прерываний.

Тогда типичная последовательность команд, задающая контроллеру ICW1, выглядит так:

–  –  –

ICW2 передается при А0=1 и имеет формат, приведенный на рис. 2.7 .

Здесь Т7–Т3 – старшие пять разрядов типа прерывания, а звездочки означают безразличное состояние бита .

–  –  –

По сути дела, передавая контроллеру ICW2, мы задаем тип ножке IR0, причем этот тип всегда кратен восьми (0 или 8 или 16 …). Типы всех остальных ножек контроллер формирует автоматически, прибавляя к типу IR0 по единице .

То есть, если у IR0 тип 8, то у IR1 тип 9, у IR2 тип 10 и так далее .

Например, хотим задать IR0 тип 16 (00010000 = 00010***):

mov al, 16 out 21, al ICW3 передается при А0 = 1. Формат ICW3 различается для ведущего и ведомых контроллеров. Для ведущего: если в i-м разряде ICW3 стоит единица, значит к линии IRi подключен ведомый контроллер. Для ведомого ICW3 имеет формат, приведенный на рис. 2.8 .

–  –  –

ID2–0 задают номер ножки ведущего, к которой подключен данный ведомый контроллер .

Например, в системе три контроллера: Master, Slave1 и Slave2. Slave1 подключен к ножке IR4, а Slave2 – IR1 Masters.

Тогда:

–  –  –

AEOI = 1 – автоматическое окончание прерываний (не нужна команда EOI) .

AEOI = 0 – обычное окончание прерываний (нужна команда EOI) .

SFNM = 0 – обычный полновложенный режим .

SFNM = 1 – специальный полновложенный режим .

Например, типичная передача ICW4:

mov al, 00000001b out 21h, al При необходимости внести изменения в настройки контроллера, необходимо выдать на него заново всю последовательность команд инициализации, начиная с ICW1 и заканчивая ICW4 .

В заключение этого раздела приведем программу, которую выполняет

BIOS при инициализации контроллеров прерываний IBM PC:

–  –  –

После того как ВН59 настроен, все остальные настроечные слова он воспринимает как команды управления. Всего имеется три таких команды .

Обычно их обозначают OCW1, OCW2 и OCW3 .

OCW1 передается при А0 = 1. Если в i-м разряде OCW1 стоит единица, вход IRi контроллера маскируется и запросы на этом входе ВН59 восприниматься не будут до тех пор, пока программист его не размаскирует .

Например, хотим блокировать клавиатуру и подсчет системного времени в IBM PC. Запрос на прерывание от клавиатуры заведен на вход IR1, а запрос от таймера (системное время) – на вход IR0 Masters.

Тогда для блокирования:

mov al, 00000011b out 21h, al

Для разблокирования:

–  –  –

Во избежание конфликтов всем входам IR контроллера присваиваются приоритеты. Если программист не задает приоритеты линий IR, по умолчанию линии IR0 присваивается старший, а линии IR7 – младший приоритет. Команда OCW2 (передается при А0 = 0) позволяет гибко манипулировать приоритетами линий IR. Формат OCW2 приведен на рис. 2.10 .

–  –  –

EOI – обычное окончание прерывания. SL – разрешение/запрещение разрядов L2-0. R – ротация (вращение) приоритетов. L2-0 – номер ножки IRi .

Далее рассмотрим возможные варианты команды OCW .

Обычная команда EOI. Имеет формат Если не задано автоматическое окончание прерываний (бит AEOI в ICW4 не равен единице), контроллер, восприняв запрос на ножке IRi и получив подтверждение этого прерывания от процессора (сигнал INTA), устанавливает бит ISRi в своем регистре ISR. Пока этот бит установлен, он блокирует восприятие запросов, на ножке IRi и всех менее приоритетных ножках (поставлена «штора»). Сделано это для того, чтобы менее приоритетные запросы не прерывали обработку более приоритетных. Пусть, например, IR0 имеет старший приоритет, а IR7 – младший и воспринят запрос на ножке IR2 .

Бит ISR2 будет установлен, а процессор начнет выполнять обработчик для запроса по IR2. Пусть, до завершения этого обработчика, пришло еще два запроса, сначала по IR6, затем по IR1. Запрос по IR6 воспринят не будет (менее приоритетный), а по IR1 будет. Процессор прервет выполнение обработчика для IR2 и перейдет на обработчик IR1, а контроллер установит еще один бит – ISR1 .

Собственно говоря, установленный бит ISRi означает, что запрос по ножке IRi в данный момент обслуживается. По окончании этого обслуживания соответствующий бит ISR необходимо сбросить и сделать это должен программист, выдав (как правило, в конце обработчика) на контроллер команду EOI.

Например, в конце обработчика запроса от клавиатуры должны стоять команды:

mov al, 20h out 20h, al Если такие команды в обработчике отсутствуют, после первого же нажатия клавиши клавиатуры у нас «не будет», а заодно «не будет» и многих менее приоритетных устройств, таких как COM порты и другие .

Действие команды EOI заключается в том, что она сбрасывает самый приоритетный из установленных битов ISR. Если контроллер был настроен на автоматический конец прерываний, биты ISR при восприятии запросов не устанавливаются («штора» не ставится) и команда EIO не нужна. Но режим автоматического конца прерываний – довольно опасный режим, поскольку может сопровождаться неприятными эффектами, например, переполнением стека. Поэтому на практике почти всегда используется обычный конец прерывания .

Специальная команда EOI. Формат команды 01100L2L1L0 .

Разряды L2–0 задают номер бита ISR, который должен быть сброшен .

Некоторые манипуляции с приоритетами, например использование рассматриваемого ниже режима спецмаскирования, могут порождать ситуации, когда менее приоритетный обработчик завершается раньше более приоритетного. Использование в такой ситуации обычной команды EOI приведет к сбросу «не того» ISR. Поэтому приходится указывать контроллеру конкретный ISR, который надо сбросить.

Например, в конце обработчика запроса по IR3:

mov al, 01100011b out 20h, al Ротация приоритетов по обычной команде EOI. Формат команды 10100000 .

Сбрасывает наиболее приоритетный ISRi после чего входу IRi автоматически присваивается самый низкий приоритет, а приоритеты остальных входов IR проворачиваются по кольцу. Например, старший приоритет у IR0, младший – у IR7. Обработчик для IR6 завершается.

При этом выполняются команды:

mov al, 10100000b out 20h, al После их выполнения ISR6 будет сброшен, старший приоритет будет у IR7, младший у IR6. Ротация приоритетов применяется для «равномерного»

обслуживания запросов. При отсутствии ротации запросы с низким приоритетом обслуживаются медленнее, чем запросы с высоким приоритетом .

Автоматическая ротация приоритетов. Используется только в режиме автоматического конца прерывания. Формат команды 10000000 .

После получения контроллером такой команды, по подтверждению процессором любого запроса, приоритеты входов IR автоматически проворачиваются по кольцу влево на одну позицию. Например, было: IR0 – старший, IR7 – младший. После первого запроса: IR7 – старший, IR6 – младший. После второго запроса: IR6 – старший, IR5 – младший. И так далее .

Отменить автоматическую ротацию можно послав в контроллер OSW2 формата 00000000 .

Команда установки приоритета. Формат команды 11000L2L1L0 .

Присваивает ножке IRi, номер которой задан разрядами L2–0, низший приоритет. Приоритеты остальных ножек проворачиваются по кольцу .

Например, команды mov al, 11000100b out 20h, al присваивают IR4 младший приоритет, старший будет у IR5 .

Ротация по специальной команде EOI. Формат команды 11100L2L1L0 .

Объединяет функции двух команд: установки приоритетов и специальной команды EOI. Присваивает ножке IRi, номер которой задан разрядами L2-0, низший приоритет. Приоритеты остальных ножек проворачиваются по кольцу .

Сбрасывает в ISR бит, заданный разрядами L2–0 .

Отметим, что в IBM PC активно используется обычная команда EOI, остальные варианты OCW2 используются крайне редко .

Команда OCW3 (передается при А0 = 0) используется, например тогда, когда обработчику для принятия какого-либо решения требуется прочитать содержимое одного из внутренних регистров контроллера. Формат OCW3 приведен на рис. 2.11 .

–  –  –

ESMM и SMM работают в паре. Комбинация ESMM = 1, SMM = 1 переводит контроллер в режим специального маскирования. Комбинация ESMM = 1, SMM = 0 сбрасывает режим специального маскирования. При ESMM = 0 бит SMM игнорируется. Режим спемаскирования применяется, если необходимо разрешить запросам с низким приоритетом прерывать выполнение обработчиков высокоприоритетных прерываний. По сути дела, при спецмаскировании отменяется действие «шторы», хотя биты ISR могут быть установлены .

RR и RIS также работают в паре. При RR = 1, RIS = 0 разрешается чтение регистра IRR. При RR = 1, RIS = 1 разрешается чтение регистра ISR. Чтение осуществляется по следующей схеме. Сначала в контроллер посылается соответствующая команда OCW3 (константа 0ah для чтения IRR и 0bh для чтения RIS). Затем выполняется команда in. Например, хотим прочитать RIS

Master и IRR Slave:

–  –  –

После того, как соответствующая команда на контроллер подана, читать содержимое выбранного регистра можно неоднократно, используя только команду in. При инициализации контроллера по умолчанию выбирается IRR, то есть исходно к IRR можно обращаться просто командой in, без передачи OCW3. При RR = 0 бит RIS игнорируется .

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

Например, хотим прочитать IMR Master:

in al, 21h

При P = 1 устанавливается режим опроса. В этом режиме предполагается, что процессор не воспринимает запросы на прерывание, то есть вход INTR процессора замаскирован. В то же время текущую программу «интересует»

имеются ли запросы от внешних устройств и какие. Если подать на контроллер OCW3 c P = 1, то по следующей команде in (конечно с правильным адресом) в al попадет байт, формат которого показан на рис. 2.12 .

–  –  –

При I = 1 есть запросы, при I = 0 – нет. При наличии запросов биты W2-0 задают номер ножки IRi для самого приоритетного из них.

Приведем пример реализации режима опроса для Master:

mov al, 100b out 20h, al nop in al, 20h При Р = 1 чтение из IRR и ISR невозможно .

Режим, в котором установленный в регистре ISR бит ISRi блокирует восприятие запросов на входах IRi и менее приоритетных («штора»), называется режимом полного вложения. Именно он, как правило, и используется на практике. Но при каскадном соединении контроллеров у этого режима имеется недостаток. Пусть на вход Slave с самым низким приоритетом пришел запрос. Slave передаст его на ножку IRi Master, к которой Slave подключен. Master установит у себя в регистре ISR бит ISRi, заблокировав тем самым запросы от Slave. Теперь, до тех пор пока бит ISRi не будет сброшен, Master не будет воспринимать никакие запросы от Slave, даже если они более приоритетные. Для решения этой проблемы можно использовать режим специального полного вложения. Этот режим задается контроллеру при настройке в команде инициализации ICW4 (см. рис. 9). Его отличие заключается в том, что бит ISRi блокирует восприятие запросов только на менее приоритетных ножках IR, а ножка IRi остается незамаскированной. Однако режим специального вложения достаточно опасен, поскольку в нем возможна ситуация «сверхвложения» – частые многократные запросы на одной и той же ножке могут привести к переполнению стека .

2.6. Описание эмулятора контроллера прерываний ВН59А

Внешний вид окна эмулятора приведен на рис. 2.13. Это окно появляется на экране при запуске программы bh59.exe.

Работа с эмулятором осуществляется в следующей последовательности:

1. Открыть пункт меню «Программирование КП» .

2. Выбрать пункт «Команды настройки» .

3. Установить нужные значения сигналов CS, WR, RD и А0 .

4. В появившемся окне набрать команду ICW1 .

5. Нажать кнопку «Занести» .

6. Повторить этапы 3 – 5 для команд ICW2 и ICW4. После этого контроллер настроен .

7. Нажать кнопку «Старт» .

8. Нажать кнопку «Работа» .

9. Установить нужные запросы на входах IRQ7-0 .

10. Нажать кнопку «Работа» .

11. Выбрать пункт «Команды управления в меню «Программирование КП» и выполнив этапы 3 – 5 для команды OCW2, снять «штору» .

12. При необходимости изменить приоритеты входов или замаскировать некоторые входы, выбрать пункт «Команды управления» в меню «Программирование КП» и выполнить этапы 3 – 5 для команд OCW2 и (или) OCW1 .

–  –  –

2.7. Порядок выполнения лабораторной работы

1. В соответствии с вариантом подготовить дома ассемблерные программы настройки контроллера прерываний. Изучить теоретический материал .

2. Получить допуск к выполнению лабораторной работы у преподавателя .

3. Выполнить лабораторную работу на эмуляторе bp59.exe .

4. Оформить отчет о выполнении лабораторной работы .

5. Защитить лабораторную работу .

2.8. Варианты заданий к лабораторной работе

1. В соответствии с вариантом (см. табл. 2.1) настроить КП на заданные типы прерываний. Учесть при этом, что в системе один КП .

2. Поработать, снимая «штору» .

3. Замаскировать заданные входы IRi .

4. Размаскировать все входы .

5. Изменить приоритеты входов, установив старший приоритет входу IRj .

6. Перенастроить КП на автоконец прерываний .

7. Задать циклическое изменение приоритетов .

8. Для приведенных выше пунктов написать ассемблерную программу .

–  –  –

1. Какую функцию выполняет в вычислительной системе контроллер прерываний?

2. Каким образом объединяются между собой несколько контроллеров прерываний ВН59?

3. Какое максимальное число ВН59 может быть поставлено в вычислительной системе?

4. Какое число входов запросов на прерывание могут обеспечить три контроллера ВН59?

5. Сколько команд инициализации необходимо использовать для настройки ВН59?

6. Что задает контроллеру ВН59 команда инициализации ICW2?

7. Чем автоматический конец прерываний отличается от обычного конца прерываний?

8. Каково назначение внутреннего регистра контроллера ISR?

9. Каково назначение внутреннего регистра контроллера IRR?

10. Каково назначение внутреннего регистра контроллера IMR?

11. Какое действие выполняет обычная команда EOI?

12. При восприятии запроса контроллер ставит «штору». Что под этим понимается?

13. Зачем используется ротация приоритетов?

14. Как можно прочитать текущее содержимое внутреннего регистра контроллера ISR?

15. Как можно прочитать текущее содержимое внутреннего регистра контроллера IRR?

16. Как можно прочитать текущее содержимое внутреннего регистра контроллера IMR?

17. Как можно на ВН59 организовать режим опроса .

18. Какой режим отменяет действие «шторы»?

19. Каким способом осуществляется сброс «шторы»?

20. Чем режим специального полного вложения отличается от режима полного вложения?

–  –  –

Обычно передача байта, например из ВУ в ОП, производится по следующей схеме .

За один цикл шины информация считывается из порта ВУ и запоминается во внутреннем регистре процессора, затем, также за один цикл шины, эта информация передается из процессора в ОП. Таким образом, данная схема требует двух циклов шины на передачу одного байта. Однако скорость обмена можно увеличить, если передавать байт из порта ВУ в ОП напрямую, минуя процессор. Обмен при этом требует только одного цикла шины. Такой режим обмена называется прямым доступом к памяти (ПДП). Или direct memory access (DMA) .

На время ПДП процессор отключается от системной шины, поэтому в систему вводится специальная схема контроллера ПДП (КПДП), которая и управляет обменом .

Пусть, например, надо передать байт информации из ОП в порт ВУ .

Предварительно КПДП должен быть задан адрес ячейки ОП, откуда будет передаваться информация и направление передачи. Когда ВУ потребуется прочитать данный байт, оно формирует запрос на ПДП, поступающий на контроллер. Последний формирует активный сигнал на вход HOLD МП .

Получив этот сигнал, МП прекращает выполнение программы, отключается от шин и вырабатывает сигнал подтверждения захвата HLDA. С этого момента управление системной шиной берет на себя КПДП. Для нашего примера КПДП выполняет следующие действия: вырабатывает сигнал подтверждения ПДП, подключающий порт ВУ к ШД, выставляет на ША адрес ячейки ОП, вырабатывает сигналы MR и IOW, задающие вид операции соответственно для ОП и ВУ. После передачи байта КПДП снимает активный сигнал с входа HOLD МП, возвращая последнему управление системной шиной .

Передача байта из ВУ в ОП производится аналогично, меняются только сигналы, задающие вид операции для ОП и ВУ .

При ПДП возможна передача целого блока информации. В этом случае КПДП предварительно задается направление передачи, начальный адрес блока в ОП и размер блока. После передачи очередного байта сигнал HOLD не снимается, содержимое счетчика байт уменьшается на единицу, а адрес ячейки ОП либо уменьшается, либо увеличивается (в зависимости от настройки КПДП) на единицу. Процесс обмена продолжается, пока счетчик байт не обнуляется .

3.2. Контроллер прямого доступа к памяти К1810ВТ37 (i8237)

Данная микросхема включает в себя четыре независимых канала ПДП:

соответственно канал 0, канал1, канал 2 и канал 3. Каждый канал может находиться в двух основных режимах: режиме программирования и режиме ПДП. В процессе программирования канал может быть настроен на работу в следующих режимах:

1. Режим одиночной передачи. В этом режиме канал осуществляет передачу байта информации между ОП и портом ВУ, после чего КПДП возвращает шину МП. В этом режиме можно задавать блок информации, но передаваться он будет побайтно .

2. Режим блоковой передачи. В этом режиме канал производит передачу блока информации. КПДП не возвращает шину МП до тех пор, пока не будет передан весь блок .

3. Режим передачи по требованию. По смыслу это та же блоковая передача, однако после передачи каждого байта КПДП проверяет вход запроса на ПДП (DREQ) канала. Если на нем стоит активный сигнал, значит ВУ готово к дальнейшему обмену и передача продолжается. Если на DREQ стоит пассивный сигнал, значит ВУ к дальнейшему обмену не готово, передача прекращается (до нового запроса от этого ВУ) и шина возвращается МП .

4. Каскадный режим. В системе может стоять несколько КПДП, но при этом они соединяются каскадно (один ведущий, остальные ведомые). Сигнал с выхода HRQ ведомого заводится не на вход HOLD МП, а на вход DREQ одного из каналов ведущего. Если какой-либо канал КПДП настроен на каскадный режим, значит к входу DREQ этого канала подключен ведомый контроллер .

Существует специфический вид передачи, который называется «памятьпамять». Как следует из названия, обмен здесь идет не между ОП и ВУ, а между двумя областями ОП. Для такой передачи используются два фиксированных канала: канал 0 и канал 1. В канале 0 задается начальный адрес области ОП, откуда будет передаваться информация. В канале 1 – начальный адрес области ОП, куда будет передаваться информация, и размер передаваемого блока. Запрос на передачу «память – память» подается на канал

0. Получив этот запрос, КПДП за один цикл шины считывает из ОП байт, адрес которого он берет из канала 0, и помещает его в свой внутренний регистр временного хранения. Затем КПДП формирует второй цикл шины, в котором этот байт записывается в ОП, по адресу, взятому из канала 1. После этого производится автодекремент счетчика байт и автоинкремент (или автодекремент) адресов в каналах 0 и 1. И так далее .

При передаче «память – память» можно использовать режим автофиксации, при котором в процессе передачи адрес в канале 0 не меняется .

То есть этот режим позволяет заполнять заданную область памяти константой .

Режим «память – память» используется, например, для регенерации динамического ОЗУ .

Обычно по окончании передачи блока канал надо перепрограммировать .

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

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

На рис. 3.1 приведено обозначение ВТ37 на функциональных схемах .

Рассмотрим вкратце назначение входов/выходов ВТ37 .

CLK (clock) – вход синхроимпульсов, синхросерия подается с генератора ГФ84, КПДП использует эту синхросерию, находясь в режиме ПДП, для формирования циклов шины .

CS (chip select) – выбор кристалла, нужен в режиме программирования, активный сигнал на этом входе означает что процессор обращается к одному из внутренних регистров КПДП. В режиме ПДП вход CS блокируется .

RESET – сброс. По этому сигналу все каналы переводятся в режим программирования. Все каналы при этом маскируются, то есть запрещается восприятие запросов от ВУ по линиям DREQ 3-0. Поэтому после программирования канала последний надо демаскировать .

READY – готовность. Аналогичен одноименному входу ВМ86 .

Используется в режиме ПДП. С помощью этого входа синхронизируется работа КПДП и медленнодействующих ОП и (или) ВУ .

HLDA (hold request) – подтверждение захвата. Сигнал на этот вход заводится с одноименного выхода МП. Когда на HLDA приходит активный сигнал, КПДП берет управление системной шиной на себя .

IOR и IOW (input/output read и input/output write)– в режиме программирования это входы. Сигналы на них задают КПДП вид операции, с которой обращается к нему МП. В режиме ПДП это выходы. На них КПДП выставляет сигналы, задающие вид операции порту ВУ .

DREQ 3-0 (DMA request) – входы запросов на ПДП для каналов 3-0 .

Активный уровень этих сигналов задается при программировании .

А3-0 и А7-4 – на этих линиях в режиме ПДП контроллер формирует младший байт адреса ОП. Адрес на этих линиях стоит до конца цикла шины и его не надо запоминать во внешнем регистре. В остальное время линии А3-0 являются входами. Комбинация сигналов на этих входах задает внутренний регистр КПДП. То есть внутри КПДП имеется шестнадцать адресуемых устройств .

D 7-0 – линии адрес/данные. В режиме ПДП в такте Т1 контроллер выставляет на эти линии старший байт адреса ОП. В такте Т2 адрес с этих линий снимается, поэтому его надо фиксировать во внешнем регистре. В остальное время эти линии представляют собой двунаправленную шину данных .

Из вышеизложенного следует, что ВТ37 вырабатывает 16-разрядный адрес и может адресовать только 64 Кбайт памяти. Для того чтобы КПДП мог адресовать 1 Мбайт, в систему вводят страничные регистры (по одному на каждый используемый канал). В эти регистры программист заранее загружает старшие разряды адреса ОП. Чтобы обратиться к другой области памяти, надо сменить содержимое страничного регистра .

Рис. 3.1. Функциональное обозначение ВТ37

ADSTB (address strobe) – сигнал, сопровождающий выдачу адреса .

Используется для фиксации старшего байта адреса, формируемого на линиях D7-0 во внешнем регистре .

AEN (address enable) – активный сигнал на этот выход выставляется в режиме ПДП. Обычно этот сигнал используется для блокирования доступа к шине со стороны других устройств системы .

EOP (end of process) – конец операции. Активный сигнал на этом выходе устанавливается, когда счетчик байт канала переходит через ноль. Этот сигнал может оповещать ВУ об окончании передачи. Линия EOP может использоваться и как вход. Если в режиме ПДП внешним образом сформировать на этой линии активный (нулевой) сигнал, передача прекращается .

HRQ (hold request) – запрос на захват. Подается на вход HOLD МП, отключая последний от системной шины .

MR и MW (memory read и memory write) – сигналы на этих выходах в режиме ПДП задают вид операции для ОП .

DACK 3-0 (DMA acknowledge) – подтверждение ПДП для каналов 3-0 .

Используются для подключения портов ВУ к шине данных. Активный уровень сигнала на этих выходах задается при программировании контроллера .

В IBM PC/XT стоит один КПДП ВТ37. Его регистрам присвоены системные адреса 00h – 0fh.

Страничные регистры (порты) в ХТ имеют системные адреса:

81h для канала 2;

82h для канала 3;

83h для канала 1;

87h для канала 0 .

Начиная с PC/AT, в системе стоят два ВТ37, соединенных каскадно .

Схема их соединения приведена на рис. 3.2 .

–  –  –

Регистр текущего адреса (CAR). Каждый канал имеет шестнадцатиразрядный регистр текущего адреса. Этот регистр хранит шестнадцать младших разрядов адреса ОП (старшие разряды адреса ОП берутся из соответствующего страничного регистра). Адрес в CAR автоматически уменьшается или увеличивается после передачи очередного байта. Процессору CAR доступен как по записи (команда out), так и по чтению (команда in) .

Регистр текущего счетчика байт (CCR). Каждый канал имеет шестнадцатиразрядный регистр текущего счетчика байт. Этот регистр определяет число передач, которые осталось выполнить до завершения полной передачи заданного блока. После передачи очередного байта значение счетчика автоматически уменьшается на единицу. Заданный блок считается переданным, когда CCR переходит через ноль (содержимое CCR становится равным ffffh), при этом возникает сигнал окончания счета ТС (выдается на ножку EOP) .

Процессору CСR доступен как по записи (команда out), так и по чтению (команда in) .

Базовые регистры адреса и счетчика (BAR и BCR). Каждый канал имеет такие шестнадцатиразрядные регистры. В них хранятся начальные значения (заданные каналу при программировании) адреса ОП и размера передаваемого блока. При разрешенной автоинициализации эти значения используются для восстановления значений в CAR и CCR. Базовые регистры по чтению недоступны .

Регистр режима (MOD). Каждый канал имеет шестиразрядный регистр режима. В нем фиксируются заданные при программировании канала настройки. В частности, режим передачи (одиночная, по требованию …), направление передачи (ВУ ОП или ОП ВУ) и так далее. Чтение из этих регистров недопустимо .

Регистр команд (CR). В этом восьмиразрядном регистре (он в контроллере один!) фиксируется настроечная информация, общая для всех каналов. В частности, есть режим «память-память» или нет, каковы активные уровни сигналов на входах/выходах DREQ и DACK каналов и другая. Чтение из этого регистра недопустимо .

Регистр запроса (REQ). Это четырехразрядный регистр и он в контроллере один. Каждый разряд регистра соответствует запросу на ПДП для определенного канала. Эти запросы формируются не аппаратно (на входах DREQ), а программно, путем передачи в контроллер слова определенного формата по определенному адресу (смотри программирование контроллера) .

Это слово устанавливает в REQ бит запроса для указанного в слове канала. Бит запроса сбрасывается, либо аналогично, путем передачи слова определенного формата по тому же адресу, либо автоматически, когда соответствующий канал завершает передачу заданного блока и генерирует ТС. Сигнал RESET сбрасывает все биты (все запросы) в этом регистре. REQ по чтению недоступен .

Регистр маски (MASK). Этот регистр в котроллере один, но каждый канал имеет в этом регистре «свой» разряд. Если соответствующий разряд установлен, канал не воспринимает запросы на своем входе DREQ. Бит маски для канала может быть установлен и сброшен программно, путем передачи в контроллер слова определенного формата по определенному адресу (смотри программирование контроллера). Существует специальная команда, маскирующая/демаскирующая сразу все четыре канала, причем в любых комбинациях (одни каналы маскируются, другие одновременно демаскируются). Регистр маски по чтению недоступен .

Регистр состояния (STAT). Содержимое этого регистра может быть считано процессором. Регистр содержит информацию о состоянии каналов в данный момент времени. Эта информация показывает, какие каналы завершили передачу заданного блока и сгенерировали ТС (TCi = 1 – i-й канал завершил передачу) и какие каналы имеют еще неудовлетворенные запросы (REQi = 1 – i-й канал имеет неудовлетворенный запрос на ПДП). Формат STAT приведен на рис. 3.3 .

–  –  –

Временный регистр (TR). Используется для временного хранения данных в режиме «память-память». В этом режиме данные в первом цикле шины считываются из ОП, попадают в контроллер и запоминаются в TR. Во втором цикле шины данные из TR переписываются в ОП, как правило, по другому адресу .

3.4. Программирование ВТ37

Для определенности далее будем считать, что внутренним регистрам контроллера присвоены системные адреса 0h – 0fh, как в IBM PC/XT .

Часть внутренних регистров ВТ37 имеют формат восемь бит, другая часть – 16 бит. Для того чтобы по восьмиразрядной шине данных D7-0 загрузить 16-разрядный регистр, требуется две передачи. Перед началом загрузки (или считывания) 16-битного регистра ВТ37 необходимо программным образом установить в ноль триггер «старший/младший», находящийся внутри ВТ37 .

Системные адреса 0h, 2h, 4h и 6h выделены 16-разрядным регистрам адреса, соответственно канала 0, канала 1 и т. д. Передаваемая (за две передачи!) по этим адресам информация попадает в регистры CAR и BAR соответствующих каналов. Чтение по этим адресам возвращает (за две передачи!) текущее содержимое CAR соответствующих каналов .

Системные адреса 1h, 3h, 5h и 7h присвоены счетчиком байт соответствующих каналов. По этим адресам загружаются размеры передаваемых блоков (число байт в блоке минус 1). Передаваемая (за две передачи!) по этим адресам информация попадает в регистры CCR и BCR соответствующих каналов. Чтение по этим адресам возвращает (за две передачи!) текущее содержимое CCR соответствующих каналов .

Например, хотим настроить канал 2 на передачу 10-ти байт, начиная с адреса памяти 1224h:

; сбрасываем триггер «старший/младший» путем передачи любого байта ; по адресу 0ch .

out 0ch, al

–  –  –

Все остальные регистры КПДП имеют формат 8 бит .

По адресу 8h в регистр команд CR загружается командное слово контроллера. Оно относится сразу ко всем каналам и имеет формат, показанный (в несколько упрощенном виде!) на рис. 3.4 .

–  –  –

Чтение по адресу 8h (команда in al, 8) возвращает текущее состояние регистра STAT (см. рис. 3) .

По адресу 9h располагается регистр запросов REQ. При обращении к этому регистру в него передается настроечное слово, содержащее информацию о номере канала и заданную для этого канала операцию: установить запрос на ПДП или сбросить запрос на ПДП. Формат данного настроечного слова приведен на рис. 3.5 .

–  –  –

Звездочка означает безразличное состояние бита .

N1, N2 – задают номер канала (00 – канал 0,…, 11 – канал 3) .

REQ = 1 – установить запрос на ПДП .

= 0 – сбросить запрос .

Например, хотим программно сформировать запрос на канал 1:

–  –  –

По адресу 0ah осуществляется маскирование/ демаскирование отдельных каналов контроллера (см. регистр MASK). Формат передаваемого по этому адресу слова приведен на рис. 3.6 .

–  –  –

Рис. 3.6. Формат настроечного слова, маскирующего заданный канал М = 1 – маскировать канал, заданный битами N1, N0 .

= 0 – демаскировать .

Например, хотим маскировать, а потом демаскировать канал 2:

–  –  –

По адресу 0bh производится настройка каналов на режимы работы .

Настройка по этому адресу производится для каждого используемого канала .

Настроечное слово загружается в регистр режима канала MOD и имеет формат, показанный на рис. 3.7 .

–  –  –

R1, R0 задают режим передачи канала. 00 – передача по требованию, 01 – одиночная, 10 – блоковая и 11 – каскадный режим .

INC = 0 – инкремент адресов ОП (после передачи очередного байта содержимое CAR увеличивается на единицу) .

= 1 – декремент адресов ОП .

INIT = 1 – есть автоинициализация .

= 0 – нет автоинициализации .

DIR1, DIR0 = 00 – режим проверки. В этом режиме контроллер генерирует адреса ОП, но управляющие сигналы MR и IOW (или MW и IOR) остаются пассивными .

= 01 передача ВУ ОП (активны MW и IOR) = 10 передача ОП ВУ (активны MR и IOW) = 11 – запрещенная комбинация .

При использовании режима «память-память» канал 0 настраивается на передачу ОП ВУ, а канал 1 – на передачу ВУ ОП. Оба этих канала настраиваются на блоковую передачу .

N1, N0 – как и ранее, задают номер канала, которому предназначено данное настроечное слово .

Например, хотим настроить канал 3 на блоковую передачу из ВУ в ОП:

mov al, 10000111b out 0bh, al

Загрузка любого байта по адресу 0ch, сбрасывает триггер «старший/младший». То есть здесь безразлично, что передается, важен сам факт загрузки информации по этому адресу .

Загрузка любого байта по адресу 0dh, вызывает программный сброс контроллера (аналогично действию сигнала RESET). При выполнении команды чтения in al, 0dh в процессор будет считано текущее содержимое временного регистра TR. В этом регистре остается последний переданный байт, после передачи «память-память» .

Передача любого байта по адресу 0eh демаскирует все каналы контроллера .

Загрузка информации по адресу 0fh позволяет управлять маскированием/демаскированием всех каналов одновременно. Формат настроечного слова для загрузки по этому адресу приведен на рис. 3.8 .

D7 D6 D5 D4 D3 D2 D1 D0 * * * * M3 М2 M1 M0 Рис. 3.8. Формат настроечного слова, управляющего масками каналов

–  –  –

В заключение раздела приведем пример программы, настраивающей канал 1 на передачу 1024 байт, начиная с адреса ОП 28800h, в режиме передачи по требованию из ОП в ВУ. Так как заданный адрес больше 64К, необходимо старшие адреса этого адреса (2-ку) занести в соответствующий страничный регистр .

–  –  –

Эмулятор состоит из пяти окон:

•окно программы;

•окно контроллера ПДП;

•два окна оперативной памяти: Память 1 и Память 2;

•окно внешнего устройства .

Переключаться между этими окнами можно по клавише F6 .

В окне программы набирается программа настройки канала (каналов) .

При ее наборе надо соблюдать ряд простых правил:

1. Команда набирается вплотную к левому краю окна .

2. Адреса портов задаются только в шестнадцатеричной системе счисления (с буквой h!) .

3. Двоичные числа недопустимы .

После того как программа набрана, она должна быть оттранслирована путем нажатия клавиши F9. Если при трансляции возникают ошибки, эмулятор об этом сообщит и позиционирует курсор в непосредственной близости от первой ошибки. Если ошибок нет, в регистрах канала (окно контроллера) появится передаваемая программой информация .

Далее надо перейти в окно контроллера и выполнить заданную передачу в пошаговом режиме (клавиша F8), следя за изменениями входных/выходных сигналов контроллера и информации в его регистрах. Для большей наглядности рекомендуется предварительно занести передаваемые данные в нужное окно памяти или окно ВУ. Надо учесть, что передача «память-память» будет осуществляться только при наличии запроса в регистре запроса (РЗ) канала 0 .

Этот запрос можно сформировать программно, а можно, что проще, вручную, нажав Alt-R и занеся в РЗ единицу. Для всех других режимов это делать необязательно .

3.6. Порядок выполнения лабораторной работы

1. В соответствии с вариантом подготовить дома ассемблерные программы настройки контроллера прерываний. Изучить теоретический материал .

2. Получить допуск к выполнению лабораторной работы у преподавателя .

3. Выполнить лабораторную работу на эмуляторе dma.exe, снимая пошаговые диаграммы для каждого заданного варианта настройки каналов .

4. Оформить отчет о выполнении лабораторной работы .

5. Защитить лабораторную работу .

–  –  –

1. Что понимается под прямым доступом к памяти?

2. В каких режимах может находиться контроллер прямого доступа к памяти?

3. На какие режимы передачи может быть настроен канал контроллера прямого доступа к памяти?

4. Чем режим блоковой передачи отличается от режима одиночной передачи?

5. В чем специфика режима «память-память»?

6. Сколько каналов контроллера задействуется под реализацию режима «память-память»?

7. Что понимается под автофиксацией при реализации режима «памятьпамять»?

8. Что задает каналу его настройка на каскадный режим?

9. Почему линии IOR и IOW контроллера двунаправленные, а MR и MW однонаправленные?

10. Когда линии А3-0 контроллера являются входами и что задает информация на этих входах?

11. Сколько разрядов адреса ОП вырабатывает контроллер, находясь в режиме ПДП и как можно обеспечить адресацию других областей ОП?

12. Зачем каждому каналу в вычислительной системе ставят в соответствие страничные регистры?

13. Чем регистр текущего адреса CAR отличается от регистра базового адреса BAR?

14. Какими способами можно замаскировать и демаскировать восприятие запроса на входе DREQ канала?

15. С какой целью программа сбрасывает триггер «старший/младший» и каким образом это делается?

16. Какие функции возлагаются на входящий в состав контроллера временный регистр TR?

17. Какая информация должна быть передана в контроллер при программировании канала?

18. Каким образом можно запрограммировать контроллер на режим «память-память»?

19. С помощью какой команды осуществляется программный сброс контроллера?

20. В каком регистре каналу задается направление передачи информации?

21. С помощью какой команды можно прочитать содержимое регистра состояния STAT?

22. Когда считается, что канал передал весь заданный блок информации?

4. ЛАБОРАТОРНАЯ РАБОТА №4 Страничный механизм 32-разрядных процессоров

4.1. Методы адресации памяти

В первых микропроцессорах (например, в i580) использовалась абсолютная адресация памяти. То есть, если программист писал в команде адрес 100, это был адрес 100-й ячейки памяти и никакой другой. На первый взгляд это было естественно и удобно. На практике же такая адресация приводила к огромной проблеме .

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

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

Для решения этой проблемы, начиная с i8086, была введена сегментация памяти. При этом считается, что программа занимает некий сегмент (сегменты) памяти, начальный адрес которого (которых) процессору известен. В этом случае в программе используются не абсолютные адреса памяти, а относительные, представляющие собой смещение адреса относительно начала сегмента. В какое бы место памяти не загружалась наша программа, записанные в ней относительные адреса, очевидно, не меняются. Меняется только начальный адрес сегмента. Вычисляя адрес памяти, процессор просто берет начальный адрес сегмента, прибавляет к нему заданный в команде относительный адрес и получает абсолютный адрес памяти .

Начальные адреса текущих сегментов задаются процессору в специальных сегментных регистрах. В процессоре i8086 было введено четыре таких регистра: CS, SS, DS и ES. Иначе говоря, этот процессор одновременно работал с четырьмя сегментами оперативной памяти. В сегменте, начальный адрес которого задается в CS, располагается текущая программа, SS задает начало сегмента стека, DS определяет сегмент данных для текущей программы, ES – дополнительный сегмент данных .

Вычисляя адрес следующей команды программы, процессор всегда берет начальный адрес из CS и прибавляет к нему относительный адрес (смещение), взятый из регистра-указателя команд IP. При стековой операции адрес задает пара SS (начальный адрес) и SP (регистр-указатель стека). При обращении к описанным в программе переменным используется DS (начальный адрес) и относительный адрес, взятый из выполняемой команды. Регистр ES используется (как правило), если по ходу выполнения программы возникает необходимость обратиться к памяти, находящейся за пределами задаваемого DS текущего сегмента данных .

Операционная система определяет адрес свободной оперативной памяти, выделяет в этой области три сегмента (для программы, для стека и для данных), загружает начальные адреса этих сегментов в соответствующие сегментные регистры процессора, а в сами сегменты записывает программу и ее исходные данные. Далее автоматически начинает работать запущенная программа .

Все четыре сегмента процессора i8086 имеют фиксированный размер 64

Кбайта и не имеют никаких атрибутов. Это, с одной стороны, хорошо:

• для полного описания сегмента достаточно задать его начальный адрес;

• пользователю доступна любая ячейка оперативной памяти (никакой защиты не предусмотрено) и он волен делать все что хочет .

С другой стороны – это плохо:

• нет никакой защиты, значит пользователь, случайно или сознательно, может что-нибудь испортить, например, операционную систему или, что еще хуже, информацию другого пользователя;

• современные программы и особенно данные для этих программ занимают в памяти куда больше 64 Кбайт, что создает существенные неудобства, поскольку программу и ее данные приходится распределять по нескольким сегментам и обеспечивать своевременное переключение с одного сегмента на другой .

Последнюю проблему легко решить в лоб, увеличив размер сегмента. Но, во-первых, все равно найдутся программы, для которых этого размера окажется недостаточно, во-вторых, выделение больших сегментов для маленьких программ может приводить к непроизводительному расходу памяти. Именно поэтому, начиная с процессора i286, был введен переменный размер сегмента .

В современных 32-разрядных процессорах сегмент может занимать в памяти от 1 байта до 4 Гбайт и, кроме того, имеет ряд атрибутов: «уровень привилегий», «разрешен для записи или нет» и другие .

Работа сегментного механизма теперь происходит примерно следующим образом. При запуске задачи (программы) на выполнение операционная система создает все необходимые сегменты и для каждого из них создает специальный описатель (дескриптор). Дескриптор занимает 8 байт и содержит все необходимые сведения о сегменте (начальный адрес, размер, атрибуты). Все созданные дескрипторы операционная система заносит в находящиеся в оперативной памяти дескрипторные таблицы. Одновременно в памяти находятся две такие таблицы: глобальная и локальная. Их начальные адреса задаются процессору в специальных внутренних регистрах. В глобальной таблице располагаются дескрипторы сегментов, которые могут понадобиться в любой момент, например, дескрипторы сегментов самой операционной системы. Локальная – это личная таблица текущей задачи, то есть при смене задачи обычно меняется и локальная таблица. В саму запускаемую задачу операционная система возвращает в качестве параметров селекторы созданных дескрипторов. Селектор, по сути, номер дескриптора в таблице. Если задаче надо обратиться к новому сегменту, она предоставляет процессору соответствующий селектор. По нему процессор находит в таблице дескриптор, производит ряд проверок и, если все проверки были удачны, загружает найденный дескриптор в нужный сегментный регистр .

Вполне возможна ситуация, когда все сегменты задачи не помещаются в реально существующей в системе оперативной памяти. В этом случае часть сегментов приходится хранить на диске. Находится сегмент в памяти или нет, показывает специальный бит присутствия в дескрипторе этого сегмента. Если задача обращается к новому сегменту, а его в памяти нет, операционная система должна подкачать этот сегмент с диска, предварительно сбросив из памяти на диск какой-то (какие-то) другой сегмент. Считается, что от пользователя этот процесс скрыт и у него должно создаваться впечатление, что в его распоряжении находится оперативная память солидного объема (объем самой оперативной памяти + объем дисков). Это так называемая виртуальная память. Хотя, конечно, процесс подкачки занимает заметное время и пользователь его «видит» .

Оказалось, что, с точки зрения системного программиста, сегментный механизм 32-разрядных процессоров имеет существенный недостаток. Так как сегменты разноразмерные и могут быть очень большими, возникают сложности при организации подкачки с диска. Действительно, попробуйте подкачать сегмент объемом 4 Гбайта в память объемом 256 Мбайт! Конечно, удобней обмениваться фиксированными порциями информации не слишком большого объема. Именно исходя из этих соображений, начиная с процессора i386, был введен страничный механизм адресации памяти .

Страничный механизм предполагает, что вся память разбита на непересекающиеся страницы, которые, в отличие от сегментов, имеют небольшой фиксированный объем, например 4 Кбайта. Для описания всех имеющихся в системе страниц в памяти создаются таблицы страниц. Каждый элемент такой таблицы задает начальный адрес и атрибуты какой-либо страницы .

Страничный механизм в 32-разрядных процессорах представляет собой необязательную надстройку над сегментным механизмом. Необязательную потому, что страничный механизм может включать и выключать системный программист. Процесс формирования адреса при включенном страничном механизме протекает следующим образом. В начале работает сегментный механизм, вырабатывая так называемый линейный адрес. Затем страничный механизм преобразует (принято говорить – транслирует) этот линейный адрес в физический адрес памяти. Отметим, что полученный таким образом физический адрес, как правило, совсем не похож на исходный линейный .

Процесс запуска программы на выполнение упрощенно протекает по следующей схеме. Операционная система создает необходимые программе сегменты и их дескрипторы. Затем операционная система, путем заполнения соответствующих элементов таблиц страниц, распределяет эти сегменты по страницам памяти. При этом сегмент может занимать в памяти от одной (маленький сегмент) до 220 страниц (сегмент объемом 4 Гбайта) и необязательно подряд идущих. Например, начало сегмента, занимающего 3 страницы, может находиться в 10-й странице, продолжение в 311-й, а конец в 4-й .

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

Действительно, чтобы обратиться к ячейке внутри страницы, надо знать начальный адрес этой страницы. Чтобы найти этот адрес, надо обратиться в таблицу, а последняя находится в памяти. Реально получается, что для вычисления любого адреса памяти приходится дважды обращаться к этой самой памяти. Поэтому в состав современных процессоров входит специальная кэш-память страниц (в американской терминологии – буфер TLB). В нем хранится несколько десятков начальных адресов для страниц, с которыми работали в последнюю очередь. Процент кэш-попаданий в этот буфер весьма велик (95%), поэтому на практике громоздкий страничный механизм включается очень редко, только если в буфере нет нужного начального адреса .

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

4.2. Режимы работы 32-разрядного процессора

Реальный режим. С точки зрения пользователя МП в этом режиме представляет собой аналог МП i8086, только более быстрый и с расширенной системой команд.

Механизм формирования физического адреса в реальном режиме аналогичен подобному механизму МП i8086:

Аф = (sr)16 + Аэф .

Так как сегментные регистры (sr) и Аэф – 16-разрядные, формируемый таким образом Аф будет 20-разрядным. Следовательно, в реальном режиме МП адресует 1 Мбайт оперативной памяти (младший мегабайт 4-гигабайтного пространства памяти). Сегменты, как и в i8086, имеют фиксированный размер 64 Кбайта .

Режим виртуального i8086 (V86). Этот режим предназначен для того, чтобы в защищенном режиме у нас была возможность выполнять программы, написанные для i8086 (DOS задачи). Работа процессора в этом режиме похожа на работу i8086, но сам режим V86 является подмножеством защищенного режима .

Защищенный режим. В этом режиме раскрываются все возможности МП. В этом режиме используются все 32 адресных линии и, следовательно, может адресоваться память объемом до 4 Гбайт. Сегменты в защищенном режиме имеют переменный объем (от 1 байта до 4 Гбайт). Одновременно МП может работать с 214 таких сегментов. Очевидно, что все эти сегменты могут не поместиться в реально существующей оперативной памяти (ОП), поэтому часть из них (а скорее всего большинство) находится на диске. Когда процессор обращается к сегменту, которого нет в ОП, происходит прерывание .

Обработчик этого прерывания должен подкачать с диска в ОП нужный сегмент, после чего происходит рестарт «виноватой» команды. От пользователя этот процесс скрыт и у него создается впечатление, что в его распоряжении находится виртуальная память объемом 64 Тбайта (214 сегментов по 4 Гбайта каждый, то есть 246 байт) .

В защищенном режиме МП аппаратным образом поддерживает многозадачность. То есть в системе одновременно может находиться множество задач, а МП обеспечивает быстрое переключение между этими задачами.

Наличие многозадачности приводит к ряду проблем, основные из которых две:

• как переключаться с задачи на задачу;

• как защитить задачи друг от друга .

Для решения первой проблемы для каждой задачи в системе создается так называемый «сегмент состояния задачи» (TSS – task state segment). Размер этого сегмента должен быть не менее 104-х байт. Когда МП переключается с задачи А на задачу В, он автоматически запоминает контекст задачи А (содержимое почти всех своих внутренних регистров) в TSS задачи А, а затем также автоматически загружает в свои регистры контекст задачи В (из TSS задачи В). Тем самым обеспечивается переключение на задачу В и в то же время возможность возврата и продолжения выполнения задачи А. Вообще под задачей понимается любой программный код, для которого в системе создан свой TSS. Создание TSS – это функция операционной системы .

Для решения проблемы защиты задач друг от друга всем создаваемым в системе сегментам присваивается уровень привилегий. Всего возможно четыре уровня привилегий: 0,1,2 и 3, причем 0-й уровень самый старший. Уровень 3 (самый низкий) присваивается обычно сегментам пользователя, уровень 0 – сегментам ОС, а уровни 1 и 2 предназначены для расширения ОС и на практике зачастую не используются .

Когда программа с уровнем привилегий А обращается к сегменту с уровнем привилегий В, процессор проверяет условие А = В. Если это условие выполняется, доступ к сегменту будет предоставлен, если же условие не выполняется, будет прерывание (нарушены права доступа к сегменту) .

Механизм формирования физического адреса в защищенном режиме радикально отличается от механизма i8086. Для каждого создаваемого в системе сегмента создается (как правило ОС) специальная структура, называемая дескриптором этого сегмента. Дескриптор занимает в памяти 8 байт и содержит все необходимые сведения о сегменте: начальный адрес сегмента, размер сегмента, уровень привилегий, атрибуты сегмента и.т.д. МП вычисляет физический адрес по формуле

Аф = начальный адрес сегмента + Аэф .

При этом, в отличие от i8086, начальный адрес сегмента не вычисляется, а берется готовым из дескриптора .

Все созданные в системы дескрипторы сводятся в дескрипторные таблицы. Любая задача может одновременно работать с двумя такими таблицами. Одна из них называется глобальной (GDT (global descriptor table)), а другая – локальной (LDT (local descriptor table)). В GDT собраны дескрипторы сегментов, разделяемых всеми задачами в системе, а в LDT располагаются дескрипторы сегментов, с которыми работает только данная задача. GDT в системе одна и всегда должна находиться в ОП, а LDT может быть столько же, сколько и задач (для любой задачи LDT может быть создана, а может и не создаваться), и располагаться эти таблицы могут как в ОП, так и на диске .

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

Практически селектор представляет собой номер дескриптора в таблице .

Начальные адреса таблиц процессору известны, они хранятся в специальных внутренних регистрах МП (gdtr и ldtr), а смещение берется из сегментного регистра. При этом любой сегментный регистр в МП имеет формат, приведенный на рис. 4.1 .

–  –  –

Рис. 4.2. Формат видимой части сегментного регистра Здесь старшие 13 разрядов (биты 15-3) занимает селектор, определяющий местоположение дескриптора в одной из двух дескрипторных таблиц (в какой именно задает бит TI (table indicator)). Биты 1 и 0 задают запрашиваемый уровень привилегий (RPL (requested privilege level)). Нетрудно видеть, что максимальное число дескрипторов в любой дескрипторной таблице 213 (поскольку селектор 13-разрядный), а максимальный размер таблицы равен 8213 = 64 К. А так как одновременно процессору доступны две такие таблицы то, как уже отмечалось выше, МП одновременно доступны 214 сегментов .

При обращению к новому сегменту в видимую часть сегментного регистра загружается новый селектор. По этому селектору в дескрипторной таблице МП находит дескриптор нового сегмента. Проверяются права доступа (и не только они) и, если они не нарушены, найденный дескриптор копируется (кэшируется) в теневую часть сегментного регистра (с тем чтобы в дальнейшем он был у МП «под рукой» и не требовалось каждый раз обращаться за ним в память). Например. Выполняется команда jmp 0008 : 00000002h. При этом 00000002h – это смещение в новом кодовом сегменте и эта величина будет загружена (если не нарушены права доступа и другие условия) в регистр eip .

Величина 0008h представляет собой селектор, ссылающийся на 1-й дескриптор в GDT (TI = 0, RPL = 0) .

Очевидно, что таким способом (из-за проверки прав доступа) нельзя обратиться к более привилегированному сегменту, поскольку при этом будет прерывание (нарушены права доступа). В то же время должна быть возможность обращения к привилегированным сегментам, хотя бы потому, что в противном случае задачам пользователя вообще будут недоступны средства ОС. Для предоставления такой возможности в системе создаются специальные структуры, называемые шлюзами (gate). В данной лабораторной работе шлюзы не рассматриваются .

–  –  –

Поле BASE задает 32-разрядный начальный адрес сегмента .

Поле LIMIT задает размер сегмента. Этот размер может измеряться в байтах или страницах. Если размер сегмента задается в байтах, размер сегмента может меняться от 1 байта до 1 Мбайта. Если размер задается в страницах, он может меняться от 4 Кбайт до 4 Гбайт с шагом 4 Кбайт (от одной страницы до 220 страниц). Если размер сегмента стека задается в байтах, то этот размер лежит в более ограниченных пределах: от 1 байта до 64 Кбайт. Размеры сегментов TSS и таблиц LDT задаются только в байтах .

В каких единицах измеряется размер сегмента, задает бит гранулярности G (granularity). Если G = 0, размер измеряется в байтах, при G = 1 – в страницах .

Бит P (present) – бит «присутствия». Если Р = 1, сегмент присутствует в ОП, а при Р = 0 – отсутствует, то есть находится на диске. При Р = 0 поля BASE и LIMIT не имеют вышеописанного смысла .

Бит U (user) – бит «пользователя». МП с этим битом не работает и системный программист может его использовать для набора статистических сведений о сегментах .

Бит D (default operation size) – бит «размерности операндов». Это более сложный для описания бит. Возьмем для примера три команды: mov al, bl ;

mov ax, bx и mov eax, ebx. Первая из этих трех команд имеет код операции (КОП) 88h, а вот у двух последующих команд КОП одинаковый, он равен 89h .

То есть по коду операции возможно отличить «восьмиразрядные» команды от «не восьмиразрядных», а вот «шестнадцатиразрядные» команды от «тридцатидвухразрядных» по КОП отличить невозможно (разумеется, речь здесь идет об «аналогичных» командах). Для того чтобы МП мог отличить эти команды друг от друга, перед одной из них транслятор поставит «префикс размера операнда» (66h). Перед какой из двух этих команд транслятор поставит префикс, зависит от того, как пользователь описал свою программу. У него для этого есть ассемблерные директивы use16 и use32. А вот МП проинтерпретирует эти команды в зависимости от бита D, который он возьмет в теневой части регистра cs. При D = 0 МП интерпретирует код 89h как команду mov ax, bx, а код 6689h – как команду mov eax, ebx. При D = 1 интерпретация таких кодов будет прямо противоположной. Кроме префикса размера операнда есть еще «префикс размера адреса» (67h). Его тоже ставит транслятор, например перед одной из двух команд: mov al, [bx+2] и mov al, [ebx+2] .

Интерпретация таких команд процессором аналогичным образом зависит от значения бита D в регистре cs. Отметим, что перед командой могут стоять оба префикса одновременно. Эта несколько запутанная ситуация с префиксами и битом D связана с желанием уменьшить расход памяти и повысить быстродействие МП .

Если было бы однозначно задано что префиксы, допустим, ставятся перед всеми «тридцатидвухразрядными» командами, а все «шестнадцатиразрядные»

команды идут без префиксов, казалось было бы проще. Однако если большинство команд программы «тридцатидвухразрядные», такая программа будет в этом случае (за счет префиксов !) занимать значительно больше памяти и медленнее выполняться. Вот бит D и предоставляет нам возможность как бы сообщать МП каких команд в нашей программе будет меньше 16 или 32 разрядных. Перед теми, которых меньше и будут стоять префиксы. Как уже говорилось выше, в основном для интерпретации префиксов привлекается бит D из регистра cs. Биты D в регистрах ds, es, fs и gs по-видимому ни на что не влияют. Бит D в регистре ss определяет размер указателя стека (D = 0 – sp, D = 1 – esp). В дескрипторах, копируемых в сегментный регистр стека ss биты D и G должны быть согласованы (равны между собой), кроме того бит D в подобных дескрипторах принято называть битом В (big – «бит большого сегмента»). Отметим также, что в дескрипторах «системных» сегментов биты D и G смысла не имеют .

Бит S (system) – бит «системного сегмента». При S = 0 дескриптор описывает системный сегмент. В зависимости от значения бита S процессор интерпретирует поле TYPE. При S = 1 (не системный сегмент) поле TYPE может иметь один из двух форматов .

Первый формат приведен на рис. 4.4 .

1 C R A

Рис. 4.4. Первый формат поля TYPE Здесь 1 в старшем разряде поля TYPE означает, что это сегмент кода. Бит А (accessed) – бит обращения. МП устанавливает этот бит при обращении к сегменту. Сбрасывать этот бит процессор сам не умеет, это делает системный программист. Бит R (read enable) – бит разрешения считывания. При R = 0 запрещается считывание информации из этого сегмента (программу можно выполнять, но нельзя копировать). И наконец, бит C (conforming) - бит «согласованного» сегмента. Согласованные сегменты кода обладают дополнительными свойствами и их удобно использовать для хранения системных библиотечных программ .

Второй формат поля TYPE при S = 1 приведен на рис. 4.5 .

0 E W A Рис. 4.5. Второй формат поля TYPE

–  –  –

Рис. 4.6. Интерпретация поля LIMIT Как видно из рис. 4.6, при Е = 0 МП считает, что сегмент располагается в границах base - base+limit и, следовательно, если Аэфbase+limit, мы выходим за заданные границы сегмента. При Е = 1 сегмент для МП располагается в границах base+limit – 64K (4Г) и выход за границы сегмента будет при Аэфbase+limit. Связано такое положение с тем, что если нам не хватает заданного размера сегмента, то сегменты данных удобней расширять в сторону старших адресов ОП (вверх), а сегменты стека, поскольку стек растет в сторону младших адресов, – вниз. Отметим, что в сегментный регистр стека ss можно загружать дескрипторы сегментов и с Е = 0, и с Е = 1. Но при этом сегмент стека должен быть в любом случае разрешен для записи (W=1) и биты G и D должны быть согласованны. Например, мы хотим организовать стек в области

ОП, от второго до третьего Мбайта. Можно пойти двумя путями:

• Задаем Е = 0, G = D = 1, base задаем 2 Мбайта, limit – 1 Мбайт и указатель стека (esp) устанавливаем на 1 Мбайт .

• Задаем Е = 1, G = D = 1, base задаем равным нулю (можно и не нулю, но обязательно меньше или равно 2 Мбайта), limit - 2 Мбайта (конечно, если base взяли равным нулю) и esp указывает на 3 Мбайта (опять таки если base взяли равным нулю). При этом esp «обрезает» сегмент со стороны старших адресов ОП .

В заключение этого раздела приведем форматы поля TYPE для системных сегментов (S=0):

• 0000 –запрещенная комбинация;

• 0001 – свободный TSS МП 286;

• 0010 – таблица LDT;

• 0011 – занятый TSS МП 286;

• 0100 – шлюз вызова МП 286;

• 0101 – шлюз задачи (одинаков для МП 286 и для 32-разрядных процессоров);

• 0110 – шлюз прерывания МП 286;

• 0111 – шлюз ловушки МП 286;

• 1000 – запрещенная комбинация;

• 1001 – свободный TSS 32-разрядного процессора;

• 1010 – зарезервировано фирмой;

• 1011 – занятый TSS 32-разрядного процессора;

• 1100 – шлюз вызова 32-разрядного процессора;

• 1101 – зарезервировано фирмой;

• 1110 – шлюз прерываний 32-разрядного процессора;

• 1111 – шлюз ловушки 32-разрядного процессора .

4.4. Сегментный механизм

В защищенном режиме существуют три различных механизма формирования физического адреса:

• сегментный механизм;

• страничный механизм;

• механизм виртуального 86-го процессора (V86 ) .

Механизм V86 представляет из себя специфическую форму сегментного механизма. В любой момент времени в защищенном режиме работает либо сегментный механизм, либо механизм V86. Страничный механизм (в отличие от сегментного) может включать и отключать системный программист .

Страничный механизм не может работать сам по себе, так как исходной информацией для него является адрес, вырабатываемый сегментным механизмом (или механизмом V86). То есть страничный механизм всегда работает после сегментного .

Рассмотрим еще раз формат сегментного регистра (рис. 4.7) .

селектор TI RPL копия дескриптора видимая часть теневая часть

Рис. 4.7. Формат сегментного регистра

Тринадцать старших разрядов видимой части занимает селектор, адресующий дескриптор в одной из двух дескрипторных таблиц. В какой именно таблице находится этот дескриптор определяет бит TI. Если он равен 0, адресуется GDT, при TI=1 адресуется LDT. В теневой части МП хранит копию этого дескриптора .

Поле RPL задает «запрашиваемый уровень привилегий».

Существуют три структуры, связанные с понятием уровня привилегий:

• DPL. Это два бита в дескрипторе, задающие уровень привилегий сегмента;

• CPL. Это два младших бита видимой части сегментного регистра cs, то есть это текущий уровень привилегий, на котором выполняется текущая программа (задача);

• RPL. Это два младших бита слова (селектора), загружаемого в видимую часть любого сегментного регистра при смене сегмента .

При смене сегмента данных МП проверяет права доступа к новому сегменту, реализуя проверку неравенства:

DPL = max { CPL, RPL } .

Если это условие не выполняется, доступ к новому сегменту данных предоставлен не будет, а будет прерывание.

При смене сегмента кода проводится более жесткая проверка:

DPL = max { CPL, RPL } .

Из всего сказанного выше можно сделать следующие выводы. Мы можем перейти к новому сегменту данных, уровень привилегий которого равен нашему CPL или ниже его (по смыслу ниже, а по величине больше!) путем непосредственного обращения к дескриптору этого сегмента. Перейти же к более привилегированному (чем текущий CPL) сегменту данных не удастся, поскольку шлюзов для сегментов данных не существует. Для сегментов кода ситуация иная. Мы можем перейти к сегменту кода с таким же уровнем привилегий (совпадающим с нашим CPL), обратившись к его дескриптору, или перейти к более привилегированному сегменту кода через шлюз. Но мы не можем перейти к менее привилегированному сегменту кода. Кроме того, существует правило, согласно которому текущий DPL стека должен равняться CPL. То есть уровень привилегий стека должен быть таким же, как уровень привилегий текущей программы (сегменты данных могут быть менее привилегированными). За соблюдением этого правила следит сам МП, автоматически меняя стек при изменении уровня CPL на более высокий .

Поле RPL иногда используется для понижения текущего уровня привилегий. Если мы хотим, чтобы RPL ни на что не влияло, надо брать RPL = 0. Например, RPL может использоваться в следующей ситуации. Пусть у нас имеется привилегированная подпрограмма (нулевого уровня), к которой мы можем обратиться с пользовательского (третьего) уровня через известный нам шлюз. Пусть эта подпрограмма записывает информацию в заказанную нами область памяти. Параметром, передаваемым в эту подпрограмму, является селектор дескриптора сегмента данных, в который мы запрашиваем запись .

Поскольку этот селектор формируем мы сами перед обращением к подпрограмме, у нас может возникнуть соблазн «обмануть» систему. Для этого мы записываем в этот селектор RPL = 0 и «просим» подпрограмму записать информацию в какой-нибудь системный сегмент (сегмент данных нулевого уровня). Если не предпринимать никаких мер, эта попытка будет успешной, так как подпрограмма имеет CPL = 0 и наше RPL = 0. Процессор отследить такие ситуации не может, они для него слишком сложные. Однако эту ситуацию может отследить сама подпрограмма. Для этого, получив селектор, она определяет CPL задачи, которая ее вызвала. Сделать это ей нетрудно, поскольку в ее стеке лежит адрес возврата в исходную программу. Определив, что вызов был с третьего уровня, подпрограмма меняет RPL в переданном ей селекторе с нуля на тройку, понижая тем самым собственный уровень привилегий. В результате мы не сможем обратиться к заказанному сегменту данных, если его уровень привилегий выше трех .

Далее рассмотрим работу сегментного механизма при обращении в текущем сегменте, допустим на примере выполнения команды mov [bx+2], al .

• МП вычисляет Аэф. Для нашей команды Аэф = (bx)+2 .

• МП проверяет, не выводит ли полученный Аэф за заданные границы сегмента. Размер сегмента МП (для рассматриваемой команды) возьмет из теневой части сегментного регистра ds .

• МП проверяет соответствие выполняемой команды заданным атрибутам сегмента. Атрибуты он также возьмет из теневой части ds .

Для рассматриваемой команды будет произведена проверка «разрешен ли сегмент для записи» .

• Если обе проверки прошли успешно, МП формирует физический адрес по формуле Аф = начальный адрес сегмента + Аэф. Начальный адрес сегмента он также возьмет из теневой части ds .

• Если какая-то из проверок была неудачной, МП генерирует соответствующее прерывание .

Рассмотрим далее работу сегментного механизма при смене сегмента .

Чтобы перейти к новому сегменту (сменить сегмент), надо загрузить новый селектор в видимую часть соответствующего сегментного регистра. Для регистра cs здесь можно использовать команды jmp far, call far и другие, а для остальных сегментных регистров – mov sr, r 16 ; pop sr и ряд других .

МП берет загружаемый селектор и по биту TI определяет, на какую дескрипторную таблицу он ссылается. Затем МП проверяет не выводит ли этот селектор за заданные (в gdtr или ldtr) размеры таблицы. Если не выводит, МП обращается в таблицу и находит там адресуемый дескриптор. Производится ряд проверок (в частности, проверяются права доступа) и, если все они прошли удачно, в теневую часть сегментного регистра (в который команда загружает селектор !) копируется найденный дескриптор, а в видимую часть этого регистра из команды загружается селектор .

Рассмотрим примерную последовательность действий МП при выполнении команды pop ds. Эта команда выталкивает из стека в видимую часть ds новый селектор и, следовательно, должна (если все проверки пройдут успешно) привести к смене сегмента данных. Однако сначала МП еще должен найти в стеке этот селектор. Поэтому вначале выполнения этой команды идет обращение в текущем сегменте стека .

• МП вычисляет Аэф = (sp) .

• Проверяет, не выводит ли этот адрес за заданные границы стека .

Размер стека он берет из теневой части ss .

• Если проверка прошла удачно, МП берет из теневой части ss начальный адрес сегмента стека и формирует Аф = начальный адрес + Аэф. По этому адресу из ОП считывается слово, представляющее из себя (по смыслу команды) новый селектор. Только с этого момента действительно начинается смена сегмента .

• По биту TI определяется дескрипторная таблица .

• Проверяется, не выводит ли селектор за заданные размеры таблицы (размер таблицы берется либо из gdtr, либо из теневой части ldtr) .

• В таблице отыскивается адресуемый дескриптор .

• Проверяется, находится ли сегмент в ОП (по информации в дескрипторе) .

• Проверяются права доступа .

• Проверяется, отмечен ли адресуемый дескриптор как дескриптор сегмента данных (поскольку в команде указан ds !) или как сегмент кода, разрешенный для чтения .

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

Далее приведем требования к сегментам, загружаемым в различные сегментные регистры процессора:

• В cs можно загружать только дескрипторы сегментов кода. Отметим здесь, что запись в кодовый сегмент всегда запрещена .

• В ds, es, fs и gs можно загружать дескрипторы сегментов данных и дескрипторы сегментов кода, но последние должны обязательно быть разрешены для чтения .

• Наиболее жесткими являются требования для регистра ss. В этот регистр можно загружать только дескрипторы сегментов данных, обязательно разрешенные для записи, у которых dpl = cpl и биты G и D в дескрипторе (смотри формат дескриптора ) равны между собой. При любом нарушении вышеперечисленных условий будет прерывание .

Сегментный механизм в защищенном режиме выключить нельзя, но его можно подавить. Для этого надо обеспечить загрузку в теневые части всех сегментных регистров дескрипторов, описывающих один и тот же сегмент .

Обычно берется сегмент с начальным адресом 00000000h, имеющий размер 4 Гбайта и уровень привилегий 0 или 3. После этого содержимое сегментных регистров не меняется. Таким образом, мы все время работаем в одном сегменте, в котором у нас располагаются и программа, и стек, и данные. К тому же, так как начальный адрес этого сегмента равен нулю, адрес, поставленный программистом в команде, будет сразу физическим адресом и при этом адресуемый объем памяти равен 4 Гбайта! Это, очевидно, весьма удобно. Такая безсегментная память называется линейной (или плоской – flat) памятью. Однако такой способ организации памяти имеет и существенные недостатки: теряются механизм защиты и многозадачность. Страничный механизм при такой организации использовать можно. При этом появляется механизм защиты на уровне страниц. В минимальном случае при организации линейной памяти достаточно иметь GDT, содержащую два дескриптора (один кода, а другой данных) .

4.5. Страничный механизм для обычных страниц

Этот механизм, в отличие от сегментного, мы можем включать и выключать по своему желанию. Правда эта задача относится к прерогативе системного программиста, а не пользователя. Для того чтобы включить страничный механизм, достаточно установить в единицу бит PG в регистре cr0 .

Это старший (31-й) бит этого регистра. Сделать это можно командой mov cr0, r

32. При попытке включить страничный механизм в реальном режиме будет прерывание .

В отличие от сегментов, страницы имеют фиксированный размер 4 Кбайта и располагаются в строго определенных местах ОП. Нулевая страница располагается в адресах 00000000h – 00000fffh, первая – в адресах 00001000h – 00001fffh и т. д. Пересекаться страницы не могут. Отметим, что в Pentium используются страницы размером 4 Кбайта и 4 Мбайта, а в Р6 – 4 Кбайта, 4 Мбайта и 2 Мбайта. В дальнейшем будем называть страницы объемом 4 Кбайта обычными, а 4 Мбайта и 2 Мбайта – большими. В данном разделе речь пойдет только об обычных страницах .

12 младших разрядов начального адреса любой обычной страницы всегда равны нулю. Поэтому любой объект в памяти, имеющий подобный начальный адрес, называется выровненным по границе страницы .

Нетрудно видеть, что всего в ОП может быть создано 220 страниц (4 Гбайта делить на 4 Кбайта). Все страницы объединяются в блоки. В один блок может входить до 210 страниц, при этом совсем необязательно подряд идущих .

Иначе говоря, в блок могут входить 100-я страница, 5-я страница, 346-я страница и т. д. Для каждого блока создается так называемая таблица страниц .

Каждый элемент этой таблицы описывает одну из входящих в блок страниц .

Элемент таблицы страниц занимает в памяти 4 байта и называется элементом PTE (page table entry). Элемент PTE содержит начальный адрес (вернее 20 старших разрядов этого адреса, поскольку 12 младших все равно равны нулю) и атрибуты страницы, которую это элемент описывает. Нетрудно видеть, что одна таблица страниц занимает в памяти ровно одну страницу (210 4 байта = 4 Кбайта). Соответственно, любая таблица страниц выровнена по границе страницы, то есть 12 младших разрядов ее начального адреса равны нулю. Так же легко видеть, что блоков, а следовательно, и таблиц страниц может быть создано до 210 .

Для всех таблиц страниц в памяти создается каталог таблиц. Он также занимает в памяти ровно одну страницу и выровнен по ее границе. Элементы каталога (они называются PDE (page directory entry)) аналогичны элементам PTE, только описывают они не страницы, а таблицы страниц. Начальный адрес (вернее его 20 старших разрядов) каталога задаются МП в регистре cr3. При включенном страничном механизме каталог всегда должен находиться в ОП, а таблицы и страницы могут находиться как в памяти, так и на диске. Если идет обращение к странице (или таблице), которая находится на диске, происходит прерывание. Обработчик этого прерывания должен подкачать страницу с диска, после чего производится рестарт команды .

При включенном страничном механизме адрес, вырабатываемый сегментным механизмом (раньше мы его все время называли физическим), еще не является физическим адресом. Этот адрес принято называть линейным ( Ал) .

Линейный адрес условно разбивается на три части (поля). Поле DIR задает смещение в каталоге, поле PAGE – смещение в таблице, а поле OFFSET – смещение в самой странице. На рис. 4.8 приводится графическая интерпретация работы страничного механизма .

Итак, вначале у нас работает сегментный механизм, который формирует линейный адрес Ал. Затем начинает работать страничный механизм. МП берет из регистра CR3 20 старших разрядов начального адреса каталога, «пристыковывает» к ним 10 разрядов из поля DIR линейного адреса и в младшие разряды добавляет два нуля. Тем самым МП формирует адрес элемента PDE. Элемент PDE занимает в памяти 4 байта и всегда выровнен по границе двойного слова, именно поэтому два младших разряда его адреса берутся равными нулю. Из найденного в памяти элемента PDE процессор извлекает начальный адрес таблицы страниц (вернее 20 старших разрядов этого адреса) и переходит к следующему этапу .

Рис 4..8. Работа страничного механизма

Собственно этот этап очень похож на предыдущий. К 20 старшим разрядам начального адреса страницы, взятым из PDE, МП «пристыковывает»

10-разрядное смещение из поля PAGE линейного адреса Ал и в младшие разряды дописывает два нуля. Таким образом МП формирует адрес элемента PTE, из которого он извлекает начальный адрес страницы (вернее опять таки 20 старших разрядов этого адреса). Затем МП переходит к последнему этапу формирования физического адреса .

На этом этапе к 20 старшим разрядам начального адреса страницы, взятым из PTE, «пристыковывается» 12-разрядное внутристраничное смещение из поля OFFSET линейного адреса Ал. В результате получается «долгожданный» физический адрес Аф .

Как видно, страничный механизм весьма громоздкий и требует только для формирования физического адреса двух обращений в память. Если этот механизм будет всегда работать, ожидать от МП высокого быстродействия не приходится. Поэтому для повышения быстродействия в состав МП введена кэш-память страниц (буфер TLB (translation lookaside buffer – «буфер предыстории трансляции»)). В этом буфере хранятся начальные адреса 32-х страниц, к которым были последние обращения процессора. После того как сегментный механизм выработал Ал, МП прежде всего ищет начальный адрес нужной страницы в буфере TLB и только если его там не окажется (а это бывает крайне редко, так как процент кэш-попаданий в буфер составляет 95%), включается рассмотренный выше страничный механизм .

Страничный механизм предоставляет программисту (системному) следующие возможности:

• дает возможность упростить алгоритмы подкачки информации с диска, поскольку обмен информацией с диском ведется страницами, имеющими одинаковый небольшой размер;

• устраняет возможность возникновения фрагментации памяти (при обмене с диском разноразмерными сегментами в памяти неизбежно возникают «дыры»);

• позволяет «транслировать» вырабатываемые процессором линейные адреса в другие области ОП .

Когда программист пишет команду, адресующую ОП, он задает в этой команде адрес. Сегментный механизм преобразует этот адрес в Ал, а страничный механизм преобразует Ал в Аф. При этом, как правило, Аф совсем «не похож» на Ал. Поэтому и говорят, что процессор транслирует Ал в другое место ОП. Например, пусть сегментный механизм выработал Ал = 00000008h, а в элементе PTE, к которому мы обратимся по ходу работы страничного механизма (кстати, из Ал видно, что этот PTE будет 0-м элементом соответствующей таблицы страниц), в поле «начальный адрес страницы»

задано 777ffh. Тогда Аф будет равен 777ff008h. Не трудно создать страницу, для которой линейные адреса будут совпадать с физическими. Для этого надо записать соответствующую информацию в соответствующие элементы PDE и PTE. Такие страницы называются страницами с прямым отображением в память. Возможность трансляции адресов является важным свойством страничного механизма и широко используется на практике. Приведем наиболее простой пример. Если какую-то страницу мы из ОП сбросили на диск, а потом вернули обратно в память, эта страница, скорее всего, окажется совсем в другом месте ОП. Ничего страшного, достаточно изменить информацию в соответствующем PTE и вырабатываемые при обращении к этой странице адреса будут транслироваться в новое место ОП .

4.6. Формат элемента PTE (PDE)

–  –  –

Для обычных страниц поле «начальный адрес» в PTE задает начальный адрес страницы, а такое же поле в PDE – начальный адрес таблицы страниц .

Для больших страниц начальный адрес страницы задается в PDE, а таблицы страниц и соответственно PTE для таких страниц отсутствуют .

AVL (available – «свободный») – три бита системного программиста. МП с этими битами не работает и их может использовать по своему усмотрению системный программист. Обычно в этих битах накапливают некоторую статистику (число обращений к данной странице и т.д.). В дальнейшем эту статистику можно использовать при решении вопроса о том, какую страницу лучше сбросить на диск .

G (global) – глобальная страница. Бит появился в Р6. Если страница отмечена как глобальная, при очистке буфера TLB начальный адрес такой страницы из буфера не удаляется. Так как очистка TLB обычно происходит при смене задач, глобальная страница как бы передается из задачи в задачу. Для обычных страниц бит G определен в PTE, а для больших – в PDE. Процессор обращает внимание на бит G, только если бит PGE в регистре cr4 установлен в единицу .

PS (page size) – размер страницы. Для любых страниц этот бит определен в PDE. При PS = 0 это обычная страница, при PS = 1 – большая страница. Бит PS появился в Pentium. Процессор обращает на него внимание, если один из битов PSE или PAE в регистре cr4 установлен в единицу .

D (dirty) – «грязный бит». МП автоматически устанавливает этот бит в единицу, если в данную страницу была запись. Сбрасывать этот бит МП не умеет, и если это нужно сделать, это задача системного программиста. Бит D проверяют, когда страница сбрасывается на диск. При этом если в страницу не было записи, ее не надо физически переписывать на диск (она там уже есть, причем точно такая же), а достаточно отметить ее как отсутствующую в ОП .

Если же запись в страницу была, ее надо переписать на диск физически. Для больших страниц бит D определен в PDE, для обычных – в PTE .

A (accessed) – бит обращения. Этот бит также устанавливает сам МП (сбрасывает системный программист), если к странице было обращение. Этот бит можно привлекать при решении вопроса о том, какую страницу лучше отправить на диск .

Биты PCD (page-level cache disable) и PWT (page-level write through) задают стратегию кэширования данной страницы (таблицы) .

Если PCD = 1 – страница запрещена к кэшированию. При PWT =0 используется так называемая «обратная запись», а при PWT = 1 – «сквозная запись». Эти биты появились в МП 486 .

U/S (user/supervisor) – «пользователь/супервизор». Если U/S =1, с данной страницей можно работать на любом уровне привилегий, в том числе и на 3-м (пользовательском). При U/S = 0 страница доступна только с уровней 0,1 и 2 (уровни ОС) .

R/W (read/write) – «чтение/запись». Если R/W =1 – для страницы разрешены и чтение и запись. Если R/W = 0 – запись в страницу запрещена. Бит R/W имеет смысл только на уровне пользователя. На уровнях ОС страница всегда доступна для записи (это не совсем точно, начиная с МП 486 имеется возможность запретить ОС запись в страницу). Таким образом, биты U/S и R/W совместно организуют защиту на уровне страниц .

P (present) – бит присутствия. Если Р = 1, страница присутствует в ОП, при Р = 0 – отсутствует (находится на диске). В последнем случае вся остальная информация в PTE не имеет приведенного выше смысла. Обычно, если Р = 0, в остальные разряды РТЕ системный программист записывает информацию о том, где на диске искать эту страницу. Процессор этот бит только проверяет .

Изменять значение этого бита – прерогатива ОС .

4.7. Особенности страничного механизма в Pentium и Р6

В Pentium реализовано два варианта страничного механизма .

1. При PSE = 0 все страницы в системе 4-килобайтные и механизм работы с ними ничем не отличается от рассмотренного выше .

2. При PSE = 1 одновременно могут использоваться 4-килобайтные и 4-мегабайтные страницы .

Обращение к 4-мегабайтным страницам пояснено на рис. 4.10. Как видно из этого рисунка, содержимое регистра cr3 задает (как и ранее) начальный адрес каталога, поле DIR адресует элемент PDE в каталоге. Если в этом элементе PDE бит PS = 1, из PDE берется начальный адрес страницы, а поле OFFSET задает смещение в этой странице .

DIR OFFSET Ал

–  –  –

В Р6 реализовано три варианта страничного механизма:

1. PAE = PSE = 0 – только 4-килобайтные страницы .

2. PAE = 0, PSE = 1 – и 4-килобайтные, и 4-мегабайтные одновременно

3. PAE = 1, PSE = безразлично – и 4-килобайтные, и 2-мегабайтные одновременно .

Первые два варианта ничем не отличаются от рассмотренных выше .

Далее рассмотрим третий вариант .

Бит PAE – «расширение физического адреса». Если этот бит установлен в единицу, к процессору добавляются четыре адресные линии А35-32 и он начинает адресовать 64 Гбайта оперативной памяти. При этом сегментный механизм продолжает вырабатывать 32-разрядный адрес, то есть реально процессор адресует все те же 4 Гбайта ОП. Однако страничный механизм дает возможность транслировать эти 4 Гбайта в любое место 64 Гбайтного пространства .

Поскольку формат физического адреса увеличивается до 36 бит, четырех байт, отводимых под элементы PTE и PDE, оказывается недостаточно, поэтому эти элементы становятся восьмибайтными (см. рис. 4.11). Так как размер каталога и таблиц страниц при этом не меняется (остается равным 4 Кбайта), количество элементов (соответственно, PDE и PTE) в каждой из этих структур уменьшается в два раза. Иначе говоря, получается, что процессор может адресовать только 218 страниц. Для того чтобы он мог адресовать, как и положено, 220 страниц, в систему вводится не 1, а 4 каталога. Для их адресации вводится еще одна структура, называемая таблицей указателей на каталог, включающая в себя 4 8-байтных указателя DPE (directory pointer entry). Формат DPE представлен на рис 4.12. Регистр cr3 теперь задает начальный адрес таблицы указателей, при этом этот адрес занимает разряды 31-5 данного регистра. Отсюда можно сделать вывод, что таблица указателей на каталог всегда занимает в памяти 32 байта (4 элемента по 8 байт каждый) и всегда должна быть выровнена по 32-байтной границе (5 младших разрядов начального адреса таблицы указателей равны нулю .

резерв н. адрес AVL G PS D A PCD PWT U/S R/W P

–  –  –

Рис. 4.12. Формат DPE Рис. 4.13 и 4.14 поясняют работу страничного механизма при РАЕ = 1, соответственно, для 4-килобайтных и 2-мегабайтных страниц. Как видно из рисунков, разряды 31-30 линейного адреса теперь задают один из четырех элементов DPE в таблице указателей на каталог .

–  –  –

Рис. 4.14. Работа страничного механизма для 2-мегабайтных страниц Работа с 4-килобайтными и 2-мегабайтными страницами требует, как видно из рис. 4.13 и 4.14, трехуровневой структуры таблиц и расширения форматов PTE и PDE до 8 байтов. Эти отличия от исходного алгоритма работы страничного механизма на практике приводят к трудностям в реализации операционных систем .

Для того чтобы исключить этот недостаток и в то же время сохранить возможность адресации 64 Гб памяти, начиная со старших моделей Р6 введен еще один вариант страничного механизма, который фирма назвала PSE-36 .

Этот вариант позволяяет использовать 36-разрядную адресную шину и адресовать 64 Гб памяти. В то же время, в этом варианте используется двухуровневая структура таблиц, а элементы этих таблиц имеют формат 4 байта .

Для того чтобы установить, поддерживает ли данный процессор механизм PSE-36, надо выполнить команду cpuid при eax=1. Если после выполнения этой команды в бите 17 регистра edx вернулась единица, значит рассматриваемый механизм поддерживается .

Необходимо отметить, что механизм PSE-36 отменяет вариант, когда 4-килобайтные и 4-мегабайтные страницы адресуют 4 Гб памяти (вариант 2 для Р6, смотри выше в этом же разделе), вернее этот вариант просто вырождается в частный случай PSE-36 .

В механизме PSE-36 используются 4-килобайтные и 4-мегабайтные страницы, при этом 4-килобайтные страницы позволяют обратиться только к 4гигабайтному адресному пространству, а 4-мегабайтные страницы – к 64гигабайтному адресному пространству. В табл. 4.1 приведены варианты страничной трансляции для процессоров, поддерживающих PSE-36 .

Звездочками в таблице обозначены безразличные состояния бит .

–  –  –

Вариант PSE-36 выделен в табл. 4.1 жирной строкой. Далее рассмотрим этот вариант. Для адресации 64 Гб памяти адрес должен быть 36-разрядным .

Двадцать два младших разряда начального адреса любой 4-мегабайтной страницы всегда равны нулю. Следовательно, в поле начального адреса страницы в элементе PDE (при PS=1) должны быть записаны 14 старших разрядов этого адреса. В то же время это поле начального адреса имеет формат 20 бит (биты 31-12), так как именно столько разрядов необходимо для задания адреса 4-килобайтной страницы. Таким образом, для 4-мегабайтных страниц биты 21-12 поля начального адреса являются резервными. Именно этот факт и использован в PSE-36, поскольку появляется возможность (за счет резервных бит) не увеличивать формат элемента PDE, что в свою очередь определяет двухуровневую структуру таблиц. Старшие разряды адреса (А35-32) располагаются в резервных битах 16-13 поля начального адреса.

То есть для 4-мегабайтных страниц есть два формата поля начального адреса в PDE:

1. PSE-36 не поддерживается. Разряды 31-22 – начальный адрес (А31-22), разряды 21-12 – резерв .

2. PSE-36 поддерживается. Разряды 31-22 – адрес (А31-22), разряды 21-17 – резерв, разряды 16-13 – адрес (А35-32) и бит 12 используется для специальных целей, связанных со стратегией кэширования (можно считать его резервным) .

Таким образом, за исключением использования бит 16-13 PDE, работа механизма PSE-36 совпадает с работой механизма, показанного на рис. 4.1. Эти механизмы будут полностью идентичны, если при использовании PSE-36 в биты 16-13 PDE записать нули. Страницы размером 4 Кб невозможно использовать аналогичным образом, поскольку у них нет в поле начального адреса резервных битов и, следовательно, негде располагать разряды А35-32 .

–  –  –

Сразу после запуска эмулятора из показанных на рис. 4.15 кнопок линейки инструментов активна только одна кнопка «NEW». Для начала работы с эмулятором надо ее нажать. Появится окно, приведенное на рис. 4.16. В окне «Имя файла» набираем любое имя, например «1», и нажимаем кнопку «Открыть». После этого активируются остальные кнопки линейки инструментов .

Нажимаем кнопку «COMPILER». Открывается окно, приведенное на рис. 4.17. В этом окне набираем нашу программу (в соответствии с заданием) .

После того как программа набрана, ее можно попробовать выполнить в автоматическом (кнопка «RUN») или пошаговом (кнопка «STEP») режиме .

При возникновении ошибок (а они наверняка возникнут, так как нами пока не заполнялись дескрипторные таблицы и таблицы страниц) эмулятор выдаст сообщение о конкретной ошибке, возникшей на данном шаге. Пример сообщения об ошибке показан на рис. 4.18 .

Рис. 4.16. Окно нового проекта Рис. 4.17. Окно компилятора Рис. 4.18. Пример сообщения об ошибке Для того чтобы правильно заполнить необходимый дескриптор в таблице GDT или LDT, необходимо нажать кнопку «CPU» (см. рис. 4.16). При этом появляется окно, приведенное на рис. 4.19 .

–  –  –

Правая половина окна включает дескрипторы таблиц GDT и LDT, а также элементы PDE и PTE соответственно каталога и таблиц страниц. Доступ к любому дескриптору, PDE или PTE для правильной установки соответствующих бит осуществляется двойным щелчком мышки (см. примеры на рис. 4.20 – 4.21) .

–  –  –

Левая половина окна CPU (рис. 4.19) позволяет в процессе выполнения программ следить за изменениями в регистрах процессора и в памяти .

Флажок «Страничное преобразование» (левый верхний угол окна CPU) включает/выключает страничный механизм .

–  –  –

1. В соответствии с заданием подготовить дома форматы необходимых дескрипторов, элементов PDE и PTE. Изучить теоретический материал .

2. Получить допуск к выполнению лабораторной работы у преподавателя .

3. Выполнить лабораторную работу на эмуляторе i486emul.exe .

4. Оформить отчет о выполнении лабораторной работы .

5. Защитить лабораторную работу .

–  –  –

Здесь и далее конкретное «число» подставляет в программу студент, выполняющий лабораторную работу. Выбранное значение «числа» будет оказывать влияние на дальнейший ход выполнения работы .

Выполнив эту программу, заполнить заданную область памяти (см. табл .

4.2) .

ЗАДАНИЕ 1.2 Включив страничный механизм заставить эту же программу заполнять другую область памяти (см .

табл. 4.2) .

–  –  –

mov dword ptr[esi],число mov eax, cs:[edi] и при необходимости другие команды, которые надо поставить в программу самостоятельно, переписать "число" через память в eax .

–  –  –

1. Что такое дескриптор?

2. Какая информация содержится в дескрипторе?

3. Каков объем дескриптора?

4. Чем глобальная дескрипторная таблица отличается от локальной?

5. Что понимается под селектором дескриптора?

6. Что определяет бит TI в видимой части сегментного регистра?

7. Какая информация хранится в теневой части сегментного регистра?

8. Как задается текущий уровень привилегий?

9. Как включить страничный механизм?

10. Чем обычные страницы отличаются от больших?

11. Зачем при включенном страничном механизме создаются таблицы страниц и каталог таблиц?

12. Какая информация задается процессору в регистре cr3?

13. Что понимается под линейным адресом?

14. Что задают поля DIR, PAGE и OFFSET линейного адреса?

15. Зачем в состав процессора введен буфер TLB?

16. Что определяет бит Р в элементе PDE?

17. Какие возможности дает страничный механизм системному программисту?

18. Почему в линейном адресе для больших страниц отсутствует поле PAGE?

19. Что надо сделать чтобы процессор класса Р6 стал адресовать 64 Гбайта оперативной памяти?

20. Какие возможности предоставляет страничный механизм PSE-36?

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. В.Ф. Гузик, В.А. Каляев, А.И. Костюк. Организация ЭВМ на микропроцессорах Intel. – Таганрог: Изд-во ТРТУ, 2002. – 134c .

2. В.Ф. Гузик, В.А. Каляев, А.И. Костюк, Е.В. Ляпунцова, С.М .

Гушанский, А.О. Пьявченко. Основы программирования на языке АССЕМБЛЕР: Учебное пособие. – Таганрог: Изд-во ТРТУ, 2003. – 92 с .

3. Григорьев В. Л. Микропроцессор i486. Архитектура и программирование (в 2-х томах). – М.: ГРАНАЛ, 1993. – 747 с .

4. Intel Architecture Software Developer’s Manual. Intel Corporation, 2001, – 1500 c .

5. Гук М. Процессоры Intel от 8086 до Pentium II. – СПб.: Питер Паблишинг, 1997. – 221 с .

6. Гук М. Процессоры Pentium II, Pentium Pro и просто Pentium. – СПб.:

Питер Паблишинг, 1999. – 282 с .

7. Ю-Чжен Лю, Гибсон Г. Микропроцессоры семейства 8086/8088. – М:

Радио и связь, 1987. – 512 с .

8. Алексенко А. Г. и др. Проектирование радиоэлектронной аппаратуры на микропроцессорах. – М: Радио и связь, 1984. – 270 с .

9. Intel hardware manual. Programmable interval timer. 1993. – 21 с .

10. Под общей редакцией М.Л. Мархасина: Руководство по архитектуре IBM PC AT. – Минск: ООО Консул, 1993. – 949 с.




Похожие работы:

«Стиральная машина вятка катюша 722р инструкция Download: Стиральная машина вятка катюша 722р инструкция Автор: Инструкция по эксплуатации стиральной машины "Вятка-автомат-16" Машина стиральная автоматическая бытовая типа СМА модели "ВЯТКА-АВТОМ...»

«модель 461/462/463 Инструкция по эксплуатации ручного опрыскивателя Внимание! Внимательно прочтите эту инструкцию по эксплуатации перед тем, как приступить к работе . Соблюдайте указания по безопа...»

«67 Исследование путей адаптации растений к гипобарической гипоксии ФИЗИОЛОГИЯ РАСТЕНИЙ УДК 581.12:581.1.03; 633.15:632.111.6 Т.П. Астафурова, С.А . Войцековская, Г.С. Верхотурова ИССЛЕДОВАНИЕ ПУТЕЙ АДАПТАЦИИ РАСТЕ...»

«УДК 004.9 ОСОБЕННОСТИ АВТОМАТИЗАЦИИ ТЕПЛОВЫХ ПУНКТОВ Фирман О. И., научный руководитель канд. техн. наук Колокольникова А. И . Кузбасский государственный технический университет им. Т. Ф. Горбачева Энергосбережение реализация организационных, правовых, технических, технологических, экономических и иных мер, направленных на уменьшение объем...»

«Пак Е.М.ОБЩЕСТВО И РЕФОРМЫ Использование манипулятивных методов в текстах интернет-изданий DOI 10.22394/1726-1139-2018-1-78-83 Пак Екатерина Максимовна Российская академия народного хозяйства и государственной службы при Президенте РФ Северо-Западный институт управления (Санкт-Петербург, Российская Фе...»

«СЕКЦИЯ "ЭЛЕКТОЭНЕРГЕТИКА" ПОДСЕКЦИЯ "ЭЛЕКТРОТЕХНИКА И ЭЛЕКТРОНИКА, ЭНЕГОЭФФЕКТИВНЫЕ ТЕХНОЛОГИИ"ТЕОРЕТИЧЕСКИЕ ПРИНЦИПЫ СОЗДАНИЯ ВИРТУАЛЬНЫХ ИСТОЧНИКОВ ПИТАНИЯ ДЛЯ ФИЗИЧЕСКОГО ЭКСПЕРИМЕНТА Суворова Н.В. студент, Коротких А.В., Дорожкин М.В., Суворов А.В., Коротких В.М. к.т.н., доцент Алтайский государственный те...»

«Миниатюрный пневмоостров Miniventilterminal Краткое описание Snabbhandledning Миниатюрный пневмоостров типа MH1-. для монтажа на печатной плате Miniventilterminal typ MH1-. fr PCB-montering – Русский – Svenska 1205b Русский...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ТЕХНИЧЕСКОМУ РЕГУЛИРОВАНИЮ И МЕТРОЛОГИИ НАЦИОНАЛЬНЫЙ ГОСТ Р ЕН 1160-201_ СТАНДАРТ (проект, первая редакция) РОССИЙСКОЙ ФЕДЕРАЦИИ СЖИЖЕННЫЙ ПРИРОДНЫЙ ГАЗ Общая характеристика EN 1160:1996 Installations and equipment for liquefied natural gas – General characteristics of liquefied...»

«К. В. Моисеенко, А. Г. Гудов УрФУ им. первого Президента России Б. Н. Ельцина, г. Екатеринбург a.g.gudov@urfu.ru ИССЛЕДОВАНИЕ ПРИЧИН СНИЖЕНИЯ РАЗЛИВАЕМОСТИ СТАЛИ В ЭСПЦ ОАО "МЕТАЛЛУРГИЧЕСКИЙ ЗАВОД ИМЕНИ...»

«Рожин Андрей Владимирович СОВЕРШЕНСТВОВАНИЕ ПРОЦЕССОВ ЛЕГИРОВАНИЯ И МОДИФИЦИРОВАНИЯ АЛЮМИНИЕВЫХ СПЛАВОВ НА ОСНОВЕ СИСТЕМ Al-Cu-Mg И Al-Zn-Mg-Cu Специальность 05.16.04 – "Литейное производство" Автореферат диссертации на соискание ученой степени кандидата технических наук Екатеринбург – 2013 Работа выполнена на кафедре "Ф...»

«Инструкция по работе с IP-камерами ВЕРСИЯ 1.8 INFINITY через web-интерфейс ПАРАМЕТРЫ ПО УМОЛЧАНИЮ: IP-адрес: 192.168.0.200 Маска подсети: 255.255.255.0 Сетевой шлюз: 192.168.0.1 Имя пользователя: admin Пароль: admin |2 РУКОВОДСТВО ПО РАБОТЕ С КАМЕРАМИ ЧЕРЕ...»

«ЗАКРЫТОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ТА Л Н А Х С К И Й М Е Х А Н И Ч Е С К И Й З А В О Д УСТРОЙСТВО И РАБОТА УСТРОЙСТВО КЛАПАНОВ ДОЗИРОВОЧНЫХ АГРЕГАТОВ типов НД, НДГ В качестве нагнетательного и всасывающего клапанов в гид...»

«ГОСТ Р 1 2.4.192-99 ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ Система стандартов безопасности труда СРЕДСТВА ИНДИВИДУАЛЬНОЙ ЗАЩ ИТЫ ОРГАНОВ ДЫХАНИЯ. ПОЛУМАСКИ Ф ИЛЬТРУ Ю Щ И Е С КЛА...»

«ИСТОЧНИК ВТОРИЧНОГО ЭЛЕКТРОПИТАНИЯ РЕЗЕРВИРОВАННЫЙ ББП-60 PRO Light Технический паспорт Источник вторичного электропитания резервированный "ББП-60 PRO Light" (далее – ББП) предназначен для обеспечения...»

«KHAKHDKHZKHZD KHR A KHK KHYKHY(SR) KHYJ KHB KHAQJF-Y QJF-YJ KHAKHZKHZDKHD KHKKHRKHYKHY(SR) KHYJ “1974 1996 ”“LSA ”“ MSC.8170”“MSC.21882”“MSC.22682”“MSC.29587” “MSC.32389”“2000 HSC”“ISO 9650” 2013 5 I Предисловие Чтобы поднять технологический уровень и гарантировать те...»

«О корректности смешанной задачи для гиперболических операторов с переменной кратностью характеристик П. А. ЗАХАРЧЕНКО, Е. В. РАДКЕВИЧ Московский государственный университет им. М. В. Ломоносова e-mail: evra@mathlib.ru УДК 517.9+533.7+533.723 Ключевые слова: гиперболические уравнения, смешанн...»

«Министерство образования и науки Российской Федерации Российская академия транспорта Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Пермский национальный исследовательский политехнический университет" Автодорожный факультет МОДЕРНИ...»

«НАЦИОНАЛЬНОЕ ОБЪЕДИНЕНИЕ СТРОИТЕЛЕЙ Стандарт организации Организация строительного производстваи СНОС (ДЕМОНТАЖ) зДАНИЙ И СООРУЖЕНИЙ СТО НОСТРОЙ 2.33.53-2011 ИзДАНИЕ ОфИЦИАЛЬНОЕ Москва 2012 НАЦИОНАЛЬНОЕ ОБЪЕДИНЕНИЕ СТРОИТЕЛЕЙ Стандарт организации Организация строительного производства СНОС (ДЕМОНТАЖ) ЗДАНИЙ И...»

«МФУ HP OfficeJet 150 Mobile (CN550A): Инструкция пользователя OFFICEJET 150 L511 Мобильный принтер HP Officejet 150 (L511) All-inOne Руководство пользователя 4. Не устанавливайте и не Информация об авторских используйте устройство рядо...»

«ГОСУДАРСТВЕННЫЙ стандарт СОЮЗА ССР СТАЛЬ ЭЛЕКТРОТЕХНИЧЕСКАЯ МЕТОДЫ ОПРЕДЕЛЕНИЯ МАГНИТНЫХ И ЭЛЕКТРИЧЕСКИХ СВОЙСТВ Г О С Т 1 2 1 1 9 -8 0 Издание официальное Цена 15 кол, ГОСУДАРСТВЕННЫЙ КОМИТЕТ СССР ПО СТАНДАРТАМ Москва оценка недвижимости РАЗРАБОТАН Государственным ком итетом СССР...»

«Московский государственный технический университет имени Н.Э. Баумана ПРАКТИЧЕСКАЯ ТЕХНОЛОГИЯ Под редакцией И.Б. Шачневой, Н.А. Ярославцевой Рекомендовано Учебно-методическим объединением вузов...»

«Газонокосилки электрические Руководство по эксплуатации и технический паспорт изделия Газонокосилки электрические моделей: LME3109, LME3110, LME3614, LMA3815, LME3816, LME4318 DYNAMIC DRIVE EQUIPMENT Уважаемый покупатель! Мы благодарим Вас за выбор техники DYNAMIC DRIVE EQUIPMENT. Прежде, чем начать п...»




 
2019 www.mash.dobrota.biz - «Бесплатная электронная библиотека - онлайн публикации»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.