Устройство ввода-вывода имеет следующую архитектуру.
CPU |
I/O Controler |
I/O Interface |
I/O Port |
I/O Port |
I/O Device |
I/O Bus |
Каждое подключенное к шине устройство имеет свой уникальный адрес – порт. Для IBM PC совместимых компьютеров предполагается 65535 8-битных портов. Два 8-битных порта могут расцениваться как один 16-битный, пара которых, в свою очередь образуют 32-битный порт. 4 инструкции ассемблера процессора позволяют ему писать и читать из порта ввода-вывода in, ins, out, outs. Это “тяжелые” инструкции. Каждая содержит около десятка простых. Для передачи различных переменных используются дополнительные функции. Например для инструкции in существуют:
Inl – для переменных long
Ind – для переменных double и т.д.
Для нахождения требуемого порта нужны два номера.
Номер драйвера ядра, обслуживающего устройство
Номер порта ввода-вывода устройства
При запуске, ядро определяет подключенные устройства, выставляя им уникальный номер от 1 до 255. Это номер пула драйверов для обслуживания устройства. Мажор.
Порты ввода - вывода могут также быть отображены в адреса физического адресного пространства. (в область оперативной памяти). Процессор тогда способен связаться с устройством ввода - вывода, издавая команды ассемблера, которые работают непосредственно на памяти (например, mov, or, and, и так далее). Современные аппаратные устройства более подходят для отображенного ввода - вывода, так как это быстрее и может быть объединено с прямым доступом в память.
Для доступа к устройству процессор использует 4 потока, определяемые 8-битными номерами порта
Control register – процессор направляет управляющие команды, изменяя состояние утсройства
Status register – процессор считывает результаты команд и состояние устройства
Input register – процессор считывает данные из порта ввода-вывода
Output register – процессор записывает данные в порт ввода-вывода.
Два одинаковых порта не могут быть использованы в одной системе. Для разрешения этого конфликта, ядро содержит специальную иерархическую ресурсную таблицу. Каждое устройство имеет строго определенный пул адресов.
Например, для IDE жестких дисков использует пул 16 адресов 0xf000 –0xf00f. Это ресурсный узел. При этом определяется, что первые 8 адресов 0xf000 – 0xf007 используются для доступа к master-дискам а 8 адресов 0xf008-0xf00f для slave-дисков. Эти пулы также делятся 0xf000- 0xf003 – для доступа блочных устройств(кешируемых), 0xf004-0xf007 для доступа символьных устройств (не кешируемых). (остальное разбиение касается primary партиций. Их может быть не более 4.)
Ядро сопровождает этот пул с помощью драйвера жесткого диска. Этот драйвер имеет номер в таблице ресурсов ядра и называется мажором. Адрес, точно указывающий на устройство называется минором.
Таким образом, чтобы обратится блочному устройству на мастер диску к первой primary таблице нужно обратится к специальному файлу в директории /dev
/dev/hda1 c 3 номером ядра и адресом 0xf000
Direct Memory Access Controller (DMAC),
Современные платы имеют вспомогательный процессор Direct Memory Access Controller (DMAC), который контролирует передачу данных от низкоуровневых драйвером устройства в оперативную память. Его наличие позволяет использовать адресацию более 32бит и, следовательно, подключать большее количество портов для обслуживания оборудования.
Контролер имеет 4 канала. Для IBM PC XT
Память-память
Свободен
Обмен с контролером гибких дисков
Обмен с контролером жесткого диска.
Дальнейшее развитие – появление дополнительных контролеров в каскаде. Пример IBM PC
В работе DMA различают два режима – цикл ожидания и активный цикл.
S0 – ожидание до появление сигнала DREQi
S1 - первое состояние обслуживания. Наступает когда приходит запрос DREQi Контролер запрашивает разрешение у процессора на захват системной шины. После получения подтверждения, переходит в рабочее состояние
S2…-Sn – рабочее состояние (циклы DMA) идет передача