- •Архитектура современной вычислительной системы (обзор)
- •Кэши ассоциативные, с прямым отображением и множественно-ассоциативные
- •Представление бинарных данных
- •Режимы работы процессоров семейства i8086+
- •Регистры i8086+
- •Формат инструкции
- •Некоторые инструкции ЦПУ (не включая инструкции FPU, MMX, SSEn и пр.)
- •Формирование кодов основных инструкций i8086+
- •Соответствие мнемоники машинным кодам на примере инструкции пересылки (mov)
- •Режим реальных адресов i8086 (real mode)
- •Синтаксис основных ассемблеров (Intel и AT&T) семейства процессоров i8086+
- •Адреса: короткие, ближние, дальние; перемещаемые записи
- •Сегменты, секции, модели памяти, страницы
- •Переходы, вызовы процедур
- •Символы и макросы
- •Структура физического адресного пространства режима реальных адресов
- •Простейший пример BIOS
- •Некоторое оборудование IBM PC
- •Инициализация контроллера прерываний
- •Инициализация контроллеров клавиатуры PS/2
- •Инициализация PS/2 мыши
- •Инициализация таймера 8253/8254
- •Работа с последовательным интерфейсом UART
- •Программирование контроллера DMA 8257/8237
- •Прерывания в SMP системе; измерение времени
- •Инициализация локального контроллера прерываний (LAPIC)
- •Инициализация контроллера прерываний ввода-вывода (IO APIC)
- •Сегментная модель защищенных режимов i286...x64
- •Общая структура дескриптора
- •Cегмент состояния задачи; переключение стеков
- •«Нереальный 8086»
- •Системные вызовы
- •Структура адресного пространства многопоточного приложения (C, расширение MSVC) с обработкой исключений (Win32).
- •Структура адресного пространства многопоточного приложения (C++) с обработкой исключений (Posix Threads (NPTL); Linux; IA-32)
- •Страничная модель защищенных режимов i386...x64
- •Соглашения о вызовах C/C++ (платформы IA-32, x64)
- •Пример программы, демонстрирующей различные соглашения о вызовах.
- •Основные средства управления адресным пространством, основанные на страничном механизме
- •Запрет на исполнение данных
- •Пример использования уязвимости типа «переполнение буфера в стеке»
- •Проецирование файлов.
- •Императивный способ управления проецированием.
- •Пример создания разделяемого проецирования для межпроцессного взаимодействия
- •Исполняемые файлы и динамические библиотеки
- •Построение динамических библиотек
- •Загрузка библиотек на этапе исполнения.
- •Экспорт, импорт, перемещаемые записи в Windows
- •Экспорт, импорт, перемещаемые записи в Posix
- •POSIX. Позиционно-независимый код в архитектуре IA-32.
- •Построение и использование статических библиотек объектных файлов
- •Встроенный ассемблер; понятие барьеров оптимизации и барьеров памяти.
- •Пример измерения коротких интервалов времени
- •SMP, критические секции и взаимные блокировки
- •Литература
Работа с последовательным интерфейсом UART
1)установка вектора аппаратного прерывания порта
2)установка вектора программного прерывания порта
3)настройка режима работы порта
Основные сведения
Асинхронный последовательный интерфейс (UART — Universal Asynchronous Receiver/Transmitter) реализуется в компьютере на логическом уровне микросхемой 8250 или совместимой с ней, реализующей логику последовательной передачи данных, а на физическом уровне представлен интерфейсом RS-232, отвечающим за конкретное представление сигналов конкретными уровнями напряжений и т. п. В x86 архитектуре предусматривалось наличие до 4-х последовательных портов (COM1..COM4). За этими портами
закреплены: |
|
||
Название |
Базовый порт |
IRQ |
|
COM1 |
3F8 |
|
4 |
COM2 |
2F8 |
3 |
|
COM3 |
3E8 |
4 |
|
COM4 |
2E8 |
3 |
(COM1 и COM3, а также COM2 и COM4 разделяют один запрос IRQ) При этом реализованы COM порты могут быть на микросхеме:
8250 |
пословная передача данных на скоростях до 9600 бод. |
|||
16450 максимальная скорость передачи до 115200 бод. |
||||
16550A добавлен встроенный 16-ти байтовый буфер |
||||
16750 размер буфера увеличен до 64 байт. |
||||
(В современных системах UART является частью общей микросхемы |
||||
южного моста, обычно совместимой с 16550А или 16750) |
||||
UART представлен 12 регистрами, отображаемыми на 8 портов |
||||
ввода-вывода: |
|
|
||
Регистр |
Порт |
|
Операция |
Примечания |
THR |
база+0 |
w |
DLAB==0; Transmitter Holding Register |
|
RBR |
база+0 |
r |
DLAB==0; Receiver Buffer Register |
|
IER |
база+1 |
r/w |
DLAB==0; Interrupt Enable Register |
|
DLL |
база+0 |
r/w |
DLAB==1; Divisor Latch Low Byte |
|
DLH |
база+1 |
r/w |
DLAB==1; Divisor Latch High Byte |
|
IIR |
база+2 |
r |
Interrupt Identification Register |
|
FCR |
база+2 |
w |
FIFO Control Register |
|
LCR |
база+3 |
r/w |
Line Control Register |
|
MCR |
база+4 |
r/w |
Modem Control Register |
|
LSR |
база+5 |
r |
Line Status Register |
|
MSR |
база+6 |
r |
Modem Status Register |
|
SR |
база+7 |
r/w |
Scratch Register (reserved) |
Порты +0 и +1 отображаются на разные регистры в зависимости от значения бита DLAB регистра LCR; также отображение портов на регистры (+0: THR или RBR и +2: IIR или FCR) зависит от выполняемой операции.
Регистр SR никакой полезной функции не выполняет; в случае м/с 8250 обращение к этому регистру игнорируется, а в более поздних микросхемах это просто один байт памяти, куда можно записать и прочитать любое значение.
Регистры RBR и THR используются в качестве входных и выходных буферов. Байт из THR на передающей стороне помещается во внутренний т.н. «регистр сдвига», откуда последовательно извлекаются отдельные биты и передаются по линии на принимающую сторону, где накапливаются также в регистре сдвига и, после сборки всего «слова» (в данном случае слово равно числу бит, передаваемых за один раз — 5, 6, 7 или 8), помещаются в RBR.
При настройке UART необходимо задать: размер слова (5..8 бит); число т.н. «стоп-битов» (1 или 1.5(2) бита), способ задания бита чётности, скорость передачи данных (от 50 до 115200 бод). Для этого используются регистры LCR и два 8-ми битовых регистра делителя частоты (DLL и
DLH; допустимо рассматривать их как один 16-ти битовый регистр DL).
7 6 5 4 3 2 1 0 Line Control Register (LCR); r/w; Порт: База+3
длина передаваемого слова 00: 5 бит; 01: 6 бит; 10: 7 бит и 11: 8 бит
0:1 стоп-бит; 1: 1.5 или 2 стоп-бита
000:без контроля чётности
001: дополнять до нечётного; 011: дополнять до чётного 100: бит чётности всегда 1; 111: бит чётности всегда 0 1: разрешено прерывать передачу
DLAB бит; 1: порты база+0 и база+1 отображены на DLL и DLH регистры
Большинство параметров задаётся записью требуемого значения в LCR, а делитель частоты DL (Divisor Latch) вычисляется как 115200/скорость_боды; для его задания надо сначала взвести в LCR бит DLAB (7), затем записать в регистры DLL и DLH младший и старший байты делителя,
потом DLAB бит следует очистить. Делается это примерно по такой схеме:
uint8_t fcr = inb( 0x3F8+3 );/* функция inb соответствует инструкции inb */
outb( 0x3F8+3, |
fcr |
| 0x80 ); |
/* функция outb - инструкции outb */ |
outw( 0x3F8, 115200/baud_rate ); |
/* функция outw - инструкции outw */ |
||
outb( 0x3F8+3, |
fcr |
); |
|
Важно проследить, чтобы настройки портов на стороне приёмника и передатчика совпадали, способа определения параметров соединения на другой стороне не предусмотрено.
7 6 5 4 3 2 1 0 Line Status Register (LSR); r/o; Порт: База+5
1: ошибка FIFO: был обрыв связи, ошибка чётности или фрейма 1: регистры передатчика (THR) и сдвига пусты
1: регистр передатчика (THR) уже пуст, но регистр сдвига ещё нет 1: ошибка, обрыв связи 1: ошибка, некорректный фрейм
1:ошибка, проверка чётности
1:ошибка, переполнение буфера
1: буфер приёмника (RBR) содержит данные
При передаче данных очередной байт можно записывать в THR, если в LSR а) взведён бит 2 (бит 1 взводится чуть позже, когда опустошается регистр сдвига) и б) не взведено ни одного
бита, сигнализирующего об ошибке: |
|
|
|
while (0 == (0x7D & inb(0x3F8+5))) {} |
/* ждём готовности*/ |
||
if (0 == |
(0x79 & inb(0x3F8+5))) outb(0x3F8, data); |
/* передаём */ |
|
else ... |
/* взведён бит, сигнализирующий об ошибке */ |
Чтение данных из RBR возможно тогда, когда в регистре LSR |
В случае буферизованной (FIFO) передачи: |
взведён бит 7: |
- обработчик прерывания по поступлении данных в RBR или опустошения THR (т. е. значения |
while (0 == (0xF9 & inb(0x3F8+5))) {} /* ждём данные*/ |
битов 3..1 регистра IIR 001 и 010) означает, что можно прочитать или записать не одно слово, а |
if (0 == (0x79 & inb(0x3F8+5))) data=inb(0x3F8); |
целую серию — надо ориентироваться на биты состояния LSR; |
else ... /* взведён бит, сигнализирующий об ошибке */ |
- также посылается прерывание, если буфер FIFO за отведённое время был заполнен не |
Операции ввода-вывода через UART можно, конечно, выполнять под |
полностью (значение битов 3..1 равно 110), но он не пуст и возможно чтение. Возможность |
полным управлением процессором, как рассмотрено выше, но |
считывания из RBR очередного слова также определяется по битам регистра LSR (по сути |
гораздо эффективнее использовать механизм прерываний, особенно обработка прерывания при значениях 010 и 110 совпадает, различается лишь реальное число
совместно с буферизацией потока данных, что позволит |
|
|
|
прочитанных слов из RBR). |
|
|||||||||||||
обмениваться между устройствами целыми «пачками» данных и |
7 6 5 4 3 2 1 0 |
|
Interrupt Enable Register (IER); r/w; Порт: База+1 при DLAB=0 |
|||||||||||||||
лишь затем кратковременно привлекать процессор для перемещения |
|
|
|
|
|
|
|
|
|
|
|
1: разрешить прерывания при поступлении данных в буфер приёмника (RBR) |
||||||
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|||||||||||
накопленных данных между оперативной памятью и UART. |
|
|
|
|
|
|
|
|
|
|
|
|
1: разрешить прерывания при опустошении буфера передатчика (THR) |
|||||
|
|
|
|
|
|
|
|
|
|
|
||||||||
Для включения прерываний используются регистры IER и IIR; С |
|
|
|
|
|
|
|
|
|
|
|
1: разрешить прерывания при изменении состоянии линии (LSR) |
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||
помощью IER разрешается генерация прерываний UART'ом в |
|
|
|
|
|
|
|
|
|
|
|
1: разрешить прерывания при изменении состояния модема (MSR) |
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||
определённых ситуациях. Одно и то же прерывание может быть |
|
|
|
|
|
|
|
|
|
|
|
1: разрешить режим «спячки» (sleep mode, только для 16750) |
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||
послано разными COM-портами (IRQ 4, например, используется |
|
|
|
|
|
|
|
|
|
|
|
|
1: разрешить режим малого потребления энергии (только для 16750) |
|||||
|
|
|
|
|
|
|
|
|
|
|
||||||||
COM1 и COM3), и событиями разного типа; чтобы точно выяснить |
|
|
|
|
|
|
|
|
|
|
|
|
резерв |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
каким именно портом послан запрос прерывания и какое именно |
|
|
|
|
|
|
|
|
|
|
|
|
|
Interrupt Identification Register (IIR); r/o; Порт: База+2 |
||||
событие его вызвало надо анализировать регистр IIR. |
|
|
|
7 6 5 4 3 2 1 0 |
||||||||||||||
Когда COM-порт посылает запрос прерывания, бит 0 его регистра IIR |
|
|
|
|
|
|
|
|
|
|
0: ожидающий запрос; 1: нет запроса прерывания |
|||||||
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||
обнуляется — так можно определить, какой именно порт послал |
|
|
|
|
|
|
|
|
|
|
|
|
|
000: изменилось состояние модема; сброс выполняется чтением MSR |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
запрос. Далее, анализируя биты 3..1 регистра IIR можно выяснить |
|
|
|
|
|
|
|
|
|
|
|
|
|
001: буфер передатчика пуст; сбрасывается записью в THR или чтением IIR |
||||
причину, по которой было послано прерывание: |
|
|
|
|
|
|
|
|
|
|
|
|
|
010: буфер приёмника содержит данные; сбрасывается чтением RBR |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
011: изменилось состоянии линии; сброс выполняется чтением LSR |
|||
uint8_tiir; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
uint8_rbase[] = { 0x3F8, 0x2F8, 0x3E8, 0x2E8 }; |
|
|
|
|
|
|
|
|
|
|
|
|
|
110: таймаут приёмника (FIFO не полон в буферизованном режиме) |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
unsigned |
i; |
|
|
|
|
|
|
|
|
|
|
|
|
|
резерв |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
for (i=0; i<4; i++ ) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
1: разрешён 64-х байтовый FIFO (только для 16750) |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
iir = inb( base[i]+2 ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
00: отключён режим буферизации (FIFO; для 16450 и более поздних) |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
if ( 0 == ( iir & 1 ) ) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
10: FIFO разрешён, но не действует (только 16550, не 16550А) |
||||
|
switch ( iir & 0xE ) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
11: FIFO разрешён и используется |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
case 0x2: |
|
|
|
Для включения буферизованной передачи используется регистр FCR, младший бит которого |
|||||||||||||
|
/* записываем очередную порцию */ |
управляет включением FIFO буфера, а старшие биты задают размер очереди и (для 16750) |
||||||||||||||||
|
break; |
|
|
|
возможность использования 64-х байтового буфера. |
|||||||||||||
|
case 0x4: |
|
|
|
7 6 5 4 3 2 1 0 |
FIFO Control Register (FCR); w/o; Порт: База+2 |
||||||||||||
|
case 0xC: |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: включить FIFO; 0: выключить |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
/* читаем */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: очистить буфер приёмника (применяется при инициализации) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
} |
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: очистить буфер передатчика (аналогично) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: выбор DMA (обычно не поддерживается) |
|
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
резерв |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: разрешить 64-х байтовый буфер |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
В случае пословной передачи без FIFO: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
размер FIFO буфера 00: 1 байт; 01: 4 байта; 10: 8 байт и 11: 16 байт |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
- при поступлении очередного слова (5..8 бит) в RBR, когда возможно |
|
|
|
|
|
|
|
|
|
|
|
|
|
(для FIFO-64 1, 16, 32 и 56 байт соответственно) |
||||
чтение этого слова без продолжительного ожидания (биты 3..1 |
|
|
|
Биты 2 и 1 регистра FCR используются при первоначальной настройке порта, чтобы очистить |
||||||||||||||
регистра IIR имеют значение 010); |
|
|
|
|||||||||||||||
|
|
|
содержимое FIFO, если туда что-то уже успело попасть; это вполне может случиться, так как |
|||||||||||||||
- после передачи слова из THR в регистр сдвига, когда возможна |
|
|
|
|||||||||||||||
|
|
|
включение устройства на другой стороне линии могло выполниться гораздо раньше и оно уже |
|||||||||||||||
немедленная передача следующего слова (значение 001). |
|
|
|
|||||||||||||||
|
|
|
могло пытаться передать какие-либо данные.. |
|||||||||||||||
|
|
|
|
|
Программирование контроллера DMA 8257/8237
В аппаратуре IBM PC имеется обычно несколько DMA-контроллеров; традиционно первый контроллер является 8ми разрядным, с максимальным обслуживаемым адресным пространством 1МБ, второй — 16ти разрядным, обслуживающим до 16МБ пространства. Более современные системы поддерживают 32х разрядные каналы, обслуживающие более 4ГБ адресного пространства.
Каждый контроллер поддерживает 4 канала, для каждого из которых выделяются регистры (порты) адреса, страницы и счетчика. Кроме этого каждый контроллер имеет еще несколько управляющих регистров.
8ми разрядный контроллер |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16ти разрядный контроллер |
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
0x00, 0x01, 0x87 - базовый адрес, счетчик и страница канала 0 |
|
|
|
|
|
|
|
|
0xC0, 0xC2, ---- - базовый адрес, счетчик и страница канала 4 (0) |
|||||||||||||||||||||||||||||||||||||||||||||
0x02, 0x03, 0x83 - базовый адрес, счетчик и страница канала 1 |
|
|
|
|
|
|
|
|
0xC4, 0xC6, 0x8B - базовый адрес, счетчик и страница канала 5 (1) |
|||||||||||||||||||||||||||||||||||||||||||||
0x04, 0x05, 0x81 - базовый адрес, счетчик и страница канала 2 |
|
|
|
|
|
|
|
|
0xC8, 0xCA, 0x89 - базовый адрес, счетчик и страница канала 6 (2) |
|||||||||||||||||||||||||||||||||||||||||||||
0x06, 0x07, 0x82 - базовый адрес, счетчик и страница канала 3 |
|
|
|
|
|
|
|
|
0xCB, 0xCD, 0x8A - базовый адрес, счетчик и страница канала 7 (3) |
|||||||||||||||||||||||||||||||||||||||||||||
0x08 - w: управляющий регистр; r: регистр состояния |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0xD0 - w: управляющий регистр; r: регистр состояния |
|
|
|
|
|
|||||||||||||||||||||||||||||||||
0x09 - w: регистр запросов |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0xD2 - w: регистр запросов |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
0x0A - w: регистр индивидуальной маски |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0xD4 - w: регистр индивидуальной маски |
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
0x0B - w: регистр режима работы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0xD6 - w: регистр режима работы |
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
0x0C - w: любая операция записи сбрасывает защелку младшего/старшего байта |
0xD8 - w: любая операция записи сбрасывает защелку младшего/старшего байта |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
0x0D - w: любая операция записи инициализирует контроллер |
|
|
|
|
|
|
|
|
0xDA - w: любая операция записи инициализирует контроллер |
|
|
|||||||||||||||||||||||||||||||||||||||||||
0x0E - w: любая операция записи запрещает все каналы |
|
|
|
|
|
|
|
|
|
|
|
|
|
0xDC - w: любая операция записи запрещает все каналы |
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
0x0F - w: регистр групповой маски |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0xDE - w: регистр групповой маски |
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
63 |
|
|
52 |
|
32 |
|
24 |
|
|
|
20 |
|
16 |
|
|
|
|
0 |
|
|
|
63 |
|
|
52 |
|
|
|
32 |
|
24 |
20 |
|
16 |
|
|
0 |
|
||||||||||||||||
|
|
|
|
|
|
|
-...- |
3210FE...43210 |
FEDCBA98 |
|
|
|
76543210FEDCBA9876543210 |
|
|
|
|
-...- |
3210FE...43210 |
FEDCBA98 |
|
76543210FEDCBA9876543210 |
|
|||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
... |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
Управляющий регистр |
|
|
|
Страница DMA |
|
|
|
|
Адрес DMA |
|
Регистр состояния |
|
|
|
|
|
|
|
Страница DMA |
|
|
|
Адрес DMA |
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
7 6 5 4 3 2 1 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 6 5 4 3 2 1 0 |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
1: разрешить обмен память-память (канал 0 → канал 1); 0: не разрешать |
|
|
|
|
|
|
|
|
|
1: канал 0 достиг терминального состояния; 0: не достиг |
||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
1: разрешить удержание адреса на канале 0; 0: не разрешать |
|
|
|
|
|
|
|
|
|
|
1: канал 1 достиг терминального состояния; 0: не достиг |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
1: запрет контроллера; 0:нормальная работа |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: канал 2 достиг терминального состояния; 0: не достиг |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
1: ускоренный режим; 0: нормальный |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: канал 3 достиг терминального состояния; 0: не достиг |
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
1: разрешить циклический сдвиг приоритетов; 0: не разрешать |
|
|
|
|
|
|
|
|
|
|
1: канал 0 имеет ожидающий запрос; 0: не имеет |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
0: нормальный режим записи; 1: расширенный режим |
|
|
|
|
|
|
|
|
|
|
1: канал 1 имеет ожидающий запрос; 0: не имеет |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
чувствительность к уровню DRQ 1:высокий; 0:низкий |
|
|
|
|
|
|
|
|
|
|
1: канал 2 имеет ожидающий запрос; 0: не имеет |
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
чувствительность к уровню DACK 1:высокий; 0:низкий |
|
|
|
|
|
|
|
|
|
|
1: канал 3 имеет ожидающий запрос; 0: не имеет |
|||||||||||||||||||||||||||||||||
|
Регистр запросов |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||
x x x x x 2 1 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Регистр индивидуальной маски |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
номер канала |
|
|
|
|
|
|
|
|
|
|
|
|
|
x x x x x 2 1 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
1: установить запрос; 0: сбросить запрос |
|
|
|
|
|
|
|
|
номер канала |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1: запретить канал; 0: разрешить канал |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
Регистр групповой маски |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Инициализация DMA |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
x x x x 3 2 1 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
0: канал 0 разрешен; 1: запрещен |
|
|
|
|
|
- инициализация контроллеров записью любого значения в порты 0x0D и 0xDA |
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
0: канал 1 разрешен; 1: запрещен |
|
|
|
|
|
- включить каскадный режим с увеличением адресов и запретом автоинициализации канала 4 |
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
0: канал 2 разрешен; 1: запрещен |
|
|
|
|
|
- сбросить маску (разрешить) канал 4 (каскадный) |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
0: канал 3 разрешен; 1: запрещен |
|
|
|
|
|
Программирование канала |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
Регистр режима работы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- запрет канала |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
7 6 5 4 3 2 1 0 |
номер канала |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- сброс защелки |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- задание адеса, страницы и счетчика (последовательно младший, затем старший байты) |
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
операция: 00:verify; 01:write; 10:read; 11:запрещено- задание режима для канала |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
1: разрешена автоматическая инициализация |
- разрешение канала (иногда — посылка запроса) |
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
0: увеличение адреса; 1: уменьшение адреса |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
режим: 00: по требованию; 01: единичный; 02: блочный; 11:каскадный |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CPU #0 |
|
|
Счетчик тактовых импульсов |
|
|
TSC (Time Stamp Counter) |
|
|
mem:...FEE0 0000 |
#INTA #SMI #NMI #RESET #INTR |
|
Local APIC #0 |
||
ex.82489DX |
||
|
||
Локальный |
|
|
APIC таймер |
(ex.#NMI) |
|
#LINT1 |
||
#LINT0 |
(ex.#INT) |
CPU #1 |
|
|
Счетчик тактовых импульсов |
|
|
TSC (Time Stamp Counter) |
|
|
mem:...FEE0 0000 |
#INTA #SMI #NMI #RESET #INTR |
|
Local APIC #1 |
||
ex.82489DX |
||
|
||
Локальный |
|
|
APIC таймер |
(ex.#NMI) |
|
#LINT1 |
||
#LINT0 |
(ex.#INT) |
межпроцессорные прерывания |
Шина контроллера прерываний |
|
ША
ШД
ШУ
Прерывания в SMP системе; измерение времени
Функции измерения времени
Win32 API (Windows)
получение календарного времени
GetSystemTime
получение счетчика «тиков» таймера (8254)
(~10 мс) GetTickCount
«мультимедийный» таймер
timeBeginPeriod (выбор точности)
(~1..10 мс) timeGetTime timeEndPeriod
таймер высокого разрешения (TSC)
QueryPerformanceFrequency (~100нс) QueryPerformanceCounter
POSIX (Linux, UNIX и т.п.)
получение календарного времени gmtime
localtime
получение счетчика «тиков» таймера (8254) (~10 мс) clock (время работы процесса)
(~10 мс) times (с учетом простоя) таймеры высокого разрешения
(~1 мкс) gettimeofday (~<1 мкс) clock_gettime clock_getres
таймер высокого разрешения (TSC)
(~100 нс) __rdtsc (встроенная функция gcc)
RAM
CMOS
«Будильник» (Alarm Clock)
|
|
i/o mem: ...FEC0 0000 |
|
|
IO APIC |
DMA |
|
распределение IRQn |
|
по локальным APIC |
|
|
|
0: PIC mode |
|
|
1: virtual wire mode (похож на 0) |
|
|
2: symmetric I/O mode |
|
||
|
|
(таблица перенаправления |
|
|
запросов ввода-вывода) |
Контроллер шины 1
IRQ n
Шина 2
Таймер 8254
Запросы прерываний от внешнего оборудования
Запросы
прерываний от внешнего оборудования
Шина 1 (PCI...)
Мост шины 2
1.19318 MHz |
|
8031 |
|
|
|
PS/2 |
|
|
Other |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Host-to-PCI |
PCI Bus #0 |
|
|||||||||||
|
|
|
|
Keyboard |
|
|
Mouse |
|
|
Legacy |
|
|
|
IRQ 3-7,9-11,14,15 |
|
|
|
PIRQ A-H |
|
Bridge |
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
PIT |
|
gate2.en |
PS/2 |
|
|
|
PS/2 |
|
|
CMOS |
|
Devices |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
COM1-4, LPT1-2, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
PCI-to-PCI |
|
|||||||||||||
(8253/8254) |
VLSI |
|
|
|
|
RTC Alarm |
|
|
|
|
|
|
|
|
|
|
|
|
PIRQ Mapping |
|
PCI Bus #1 |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
FDC, IDE, |
|
|
|
|
|
|
|
|
|
|
|
|
|
Bridge |
|
|||||||||||||||
|
канал 0 #40 |
#61.0 |
(8042/8043) |
|
|
|
Alarm) |
|
SoundBlaster |
|
|
|
|
|
|
|
|
|
|
|
|
(PIRQi → IRQj) |
|
|
|
|
|
|
|
|
|
|||||||||
|
канал 1 #41 |
|
порт A #60 |
|
|
|
(ISA, EISA и др. |
|
|
|
|
|
|
|
|
|
|
|
|
|
IRQ13 (PCI) |
|
|
|
|
|
|
|
|
|
||||||||||
|
канал 2 #42 |
|
|
|
|
не-PCI устройства) |
|
|
|
IRQ13 (EISA DMA changing) |
|
IRQ13 (FPU) |
|
|
|
AND |
|
|||||||||||||||||||||||
|
|
|
порт B #61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
управление #43 |
|
|
|
|
|
|
|
IRQ12 (от PCI-устройства) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
порт D #63 |
|
|
|
|
|
|
|
|
|
|
OR |
|
|
|
|
|
|
|
IGNNE# FERR# (CR0.NE==0) (для SMP д.б. 1) |
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
2 1 |
0 |
|
|
порт D #64 |
|
|
|
OR |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
IRQ12 (PS/2 Mouse или PCI) |
|
|
|
BSP Boot Strap Processor |
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
PS/2 Mouse |
IRQ12 |
|
|
|
|
IRQ13 |
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
IRQ0/2 (PIT) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
(CMOSIRQ8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(FPU, |
|
AP |
Application Processor |
||||||||
|
Резерв |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
IRQ1 (Keyboard) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DMA, |
|
BSP...AP CPU |
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PCI) |
|
|
|
регистры |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
#61.1 spk.en |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
АЛУ |
|
|
|
|||
|
|
|
|
|
3 |
4 |
5 |
6 |
7 |
|
|
9 10 11 |
14 15 |
|
|
|
|
3 |
4 |
|
5 |
6 |
7 |
9 |
10 11 |
14 |
15 |
|
|
Perf.MON |
|
|
|
|
|
|||||
|
AND |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sensor |
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A B C D E F G |
H |
УУ |
логические адреса |
RESET# SMI# NMI# INTR# |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INTA# |
||||||||
|
PC Speaker |
82C59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
физические адреса |
||||||
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
|
7 |
8 |
9 |
10 11 12 13 14 15 |
0 |
1 |
2 |
3 |
4 |
|
5 |
6 |
7 |
8 |
9 |
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
|
|
Local APIC (LAPIC) |
PRST# |
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
PSMI# |
|
|
||||||||||||||||||||||||||||
|
8259 |
|
|
|
порт #20 |
8259 |
|
порт #20 |
|
|
82093AA |
|
|
|
|
(селектор) APICBASE |
|
|
|
Timer ESR |
|
|
PNMI# |
|
|
|||||||||||||||
|
PIC 0 |
|
|
|
порт #21 |
PIC 1 |
|
порт #21 |
|
|
IO APIC |
|
|
|
|
|
|
|
ERROR# TIMER# PERF# THERM# LINT0# LINT1# |
PINT# |
OR |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(окно) APICBASE+0x10 |
|
|
|
|
|
|
||||||||||||||||||||
|
|
INTR# INTA# |
|
|
|
|
INTR# |
INTA# |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AND |
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ExtINTA# |
INTA |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
intr# и IRQ0 IOAPIC |
|
SouthBridge (Южный Мост) |
|
|
|
|
|
|
|
||||||||||||||||||
#01 |
шестнадцатеричный |
|
|
|
|
|
|
|
|
|
|
|
|
NorthBridge |
|
|
|
(APICBASE: 0xFEC0xy00) |
|
|
|
|
№ |
|
|
IMCR* |
|
|||||||||||||
|
номер порта. |
|
|
|
|
|
|
|
|
|
RAM |
|
|
|
(Северный Мост) |
|
|
i/o адрес 0xFEC0xy00 |
|
|
|
|
Вектор |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
APICEN |
|
||||||||||||||||||
abc# |
название сигнала. |
|
|
|
|
|
|
|
|
|
|
|
|
|
i/o адрес 0xFEC0xy10 |
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
0x123 физический адрес |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
( x [0..F]; y [0,4,8,C] ) |
|
|
|
|
|
INIT# |
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INTR# |
NMI# ICC |
INTA# |
|
|||||||||
|
или смещение. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(BUS cycles) |
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NMI# |
|
|
|
|
FSB |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INTR# |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INIT# |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ICC |
|
|
* - IMCR (Interrupt Mode Control Register) изображён для случая внешнего LAPIC 80489DX (0x70 → #22; 0|1 → #23). |
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
PIC Mode: |
|
|
IRQi# → PIC → intr# → BSP CPU → inta# → PIC → вектор → CPU → ... → EOI/PIC |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
Virtual Wire Mode A: IRQi# → PIC → intr# → lint0 BSP LAPIC → pint# → BSP CPU → inta# → PIC → вектор → CPU → ... → EOI/PIC |
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||
Virtual Wire Mode B: IRQi# → PIC → IRQ0# IOAPIC → Шина ICC (сообщ. типа ExtINT) → BSP/AP LAPIC → pint# → CPU → inta# → PIC → вектор → CPU → ... → EOI/PIC |
|
|
||||||||||||||||||||||||||||||||||||||
Symmetric Mode: |
|
IRQi# → IOAPIC → Шина ICC (сообщ. с вектором) → BSP/AP LAPIC → pint# → CPU → inta# → LAPIC → вектор → CPU → ... → EOI/LAPIC → Шина ICC → EOI/IOAPIC |