- •Регистры общего назначения
- •Сегментные регистры
- •Регистр флагов
- •Регистры управления процессором
- •Поколения эвм
- •Архитектура фон Неймана и гарвардская архитектура
- •Режимы адресации мп i80386 (реальный, защищённый, v86, страничной адресации)
- •Организация памяти в мп i80386 (физический, логический, линейный адрес, сегментированная память, сплошная память, разбиение на страницы)
- •Адресация в защищённом режиме
- •Страничная адресация
- •Механизм защиты в защищённом режиме (уровни привилегий, какие биты и поля используются механизмом защиты, какие проверки выполняются)
- •Прерывания и исключения
- •Обработчики прерываний в реальном режиме
- •Контроллер прерываний
- •Прерывания в защищённом режиме
- •Порты ввода-вывода
- •Доступ к портам под Windows nt/2000/xp.
- •Simd-расширения команд (mmx, sse, sse2, sse3) simd-расширения архитектуры x86
- •Расширение mmx (Multimedia Extension)
- •Расширение sse (Streaming simd Extension)
- •Расширение sse2
- •Расширения sse3
- •Основы дизайна процессоров (препроцессор, постпроцессор, конвейер, суперскалярность)
- •Предсказание ветвлений
- •Иерархия оперативной памяти
- •Принцип работы обычной dram-памяти (Conventional dram)
- •Ядро микросхемы динамической памяти
Контроллер прерываний
Это устройство, которое получает запросы на аппаратное прерывание от всех внешних устройств. Он определяет какие запросы следует обслуживать , какие будут ждать своей очереди, а какие не будут обслуживаться вообще. В ПК существует 2 контролера прерываний: IRQ 0 (8) – IRQ 7 (15), если происходит одновременно несколько прерываний, обслуживается тот, у которого высший приоритет.
IRQ 0 (int 8) – прерывание системного таймера
IRQ 1 (int 9) – прерывание клавиатуры
IRQ 2 – подключается ведомый контролер
IRQ 8 (int 70h) – прерывание часов реального времени
IRQ 9-12 – могут использовать дополнительными устройствами
IRQ 13(int 2 or int 75h) – ошибка математического сопроцессора
IRQ 14 (int 76h) – прерывание IDE 1 контролера (ЖД)
IRQ 15 (int 77h) – прерывание IDE 2 контролера
IRQ 3 (int 0Bh) - прерывание последовательного порта COM 2
IRQ 4 (int 0Ch) – COM 1
IRQ 5 (int 0Dh) – LPT 2
IRQ 6 (int 0Eh) – прерывание Floppy Disc
IRQ 7 (ont 0Fh) – прерывание LPT 1
Прерывания в защищённом режиме
При передачи управления обработчику, ЦП помещает в стек флаги и адрес возврата.
Int 2 |
Немаскируемое прерывание NMI |
Int 3 |
#BP точка остановки |
Int 8 |
#DF двойная ошибка Вызывается, если одновременно произошли 2 исключения, которые не м/б обслужены последовательно (#DE #TS #NP #SS #GP #PE). Если при #DF произошло ещё одно исключение, то ЦП отключается и м/б выведен из этого состояния, только сигналом NMI или перезагрузкой |
Int 0Ah |
#TS ошибочный TSS Вызывается при попытке переключения с ошибочным TSS |
Int 0Bh |
#NP сегмент недоступен Вызывается при попытке загрузить в сегментный регистр селектор сегмента в дескрипторе которого сброшен бит присутствия сегмента |
Int 0Ch |
#SS ошибка стека |
Int 0Dh |
#GP общая ошибка защиты |
Int 0Eh |
#PF ошибка страничной адресации Вызывается в режиме страничной адресации, если программы пытается обратиться к отсутствующей или прилигированной страницы. |
Int 10h |
#MF ошибка сопроцессора |
Int 20h |
#FFh для программ |
Порты ввода-вывода
Системы реального времени должны иметь возможность читать и писать данные в устройства. RTX-интерфейсы портов ввода / вывода позволяют осуществлять это без необходимости переключения в режим ядра. Отпадает необходимость написания драйвера для каждого устройства, к которому необходимо получить доступ. Кроме того, устраняются задержки, связанные с запросом обслуживания драйвером при каждом обращении к устройству.
Порт ввода / вывода предоставляет альтернативный метод прямого общения с аппаратурой. В адресном пространстве ввода / вывода у процессоров Intel каждый адрес представляет собой 8-ми битный “порт”, который обычно соответствует 8-ми битному управляющему регистру устройства. Хотя последовательные адреса могут представлять байты в многобайтовом порту, разработчики обычно используют подход, при котором существует однобайтовый порт, а многобайтовые величины обычно вводятся, как последовательные однобайтовые записи в порт.
Перед любым вводом/выводом из портов необходимо разрешить доступ к портам. Это осуществляется посредством функции RtEnablePortIo, параметром которой является диапазон портов ввода / вывода , к которым надо получить доступ. После этого для передачи данных можно использовать функции RtWrite* и RtRead*.
API управления портами ввода / вывода:
Следующие функции служат для управления портами ввода / вывода :
RtEnablePortIo -
разрешает прямой доступ к портам ввода / вывода для указанного диапазона адресов
RtDisablePortIo -
запрещает прямой доступ к портам ввода / вывода для указанного диапазона адресов
API передачи данных:
Следующие функции служат для передачи данных из/в портов ввода / вывода :
RtReadPortUchar,RtReadPortUshort,RtReadPortUlong -
напрямую читают одно-, двух-, четырехбайтовые данные из указанного порта
RtWritePortUchar,RtWritePortUshort,RtWritePortUlong -
напрямую пишут одно-, двух-, четырехбайтовые данные в указанный порт
RtReadPortBufferUchar,RtReadPortBufferUshort,RtReadPortBufferUlong -
копируют одно-, двух-, четырехбайтовые данные из указанного порта ввода / вывода в буфер
RtWritePortBufferUchar,RtWritePortBufferUshort,RtWritePortBufferUlong -
копируют одно-, двух-, четырехбайтовые данные из буфера в указанный порт ввода / вывода
Общие замечания по программированию
Интерфейсы RTX написаны на ассемблере и используют вызов _ _stdcall. Это означает, что подпрограмма ответственна за очистку стека. Вы не должны использовать другие соглашения о вызове (это может вызвать проблемы с компилятором).