Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Замечание о сетевых устройствах
Сетевые устройства имеют атрибуты как блочных, так и символьных устройств и зачастую рассматриваются как особый класс устройств. Подобно символьным устройствам, на физическом уровне данные передаются последовательно. При этом данные упаковываются в пакеты и передаются на и сетевой контроллер с него с помощью прямого доступа к памяти (обсуждается в подразд. 5.2.9) как для блочных устройств. Сетевые устройства только упоминаются в этой главе, но из-за своей сложности они выходят за пределы рассмотрения этой книги. Резюме Устройства таймера Таймер - это устройство ввода-вывода, считающее сердцебиение системы. Без концепции прошедшего времени Linux вообще не смог бы функционировать. Гл. 7, «Планирование и синхронизация ядра», описывает системный таймер и таймер реального времени. Терминальные устройства Ранние терминалы были телетайпными машинами (отсюда и произошло имя tty для драйвера последовательного порта). Консольное устройство было разработано в середине прошлого века с целью отправки и приема текста по телеграфным сетям. В ранних 60-х телетайп превратился в ранний стандарт RS-232 и стал использоваться во множестве появляющихся микрокомпьютеров. В терминалах 70-х телетайп использовался для связи компьютеров. Настоящие терминалы стали редкостью. Популярные на мейнфреймах и мини-компьютерах в 70-х, терминалы были заменены на компьютерах 80-х программными эмуляторами терминалов. Сам терминал (зачастую называемый «глупым» терминалом) представлял собой обычные монитор и клавиатуру, подключенные по последовательной линии к мейнфрейму. В отличие от ПК они достаточно умны для отправки и получения текстовых данных. Главная консоль (настраиваемая при загрузке) является первым терминалом, появившимся в системе Linux. Обычно после нее запускается графический интерфейс, а далее при необходимости используется оконный эмулятор терминала. Прямой доступ к памяти (DMA) Контроллер DMA является аппаратным устройством, расположенным между устройством ввода-вывода и (обычно) высокопроизводительной шиной системы. Назначение контроллера DMA заключается в перемещении большого массива данных без вмешательства процессора. Контроллер DMA без задействования процессора может быть запрограммирован на перемещение блоков данных в основную память и из нее. На уровне регистров контроллер DMA получает адреса источника и назначения и длину, необходимые для выполнения задачи. Затем, пока основной процессор бездействует, контроллер может посылать порцию данных из устройства в память, из памяти в память и из памяти на устройство. Многие контроллеры (дисковый, сетевой и графический) имеют встроенный DMA-движок, позволяющий передавать большие объемы данных без участия процессора. Резюме Эта глава описывает, как ядро Linux обрабатывает ввод и вывод. То есть мы рассмотрели следующие вопросы: Глава 5* Ввод-Вывод • Выполнили обзор аппаратуры, используемой ядром Linux для выполнения низкоуровневых операций ввода и вывода, таких, как мосты и шины. • Рассмотрели, как Linux представляет интерфейсы для блочных устройств. • Мы рассмотрели различные планировщики Linux и очереди запросов: безоперационный, предельный и предварительный. Проект: сборка драйвера параллельного порта Этот проект представляет вашему вниманию основы контроллера параллельного порта и во что сливаются ранее описанные функции ввода-вывода. Параллельный порт обычно интегрирует в Superio часть чипсета и является хорошим примером для написания основы драйвера символьного устройства. Этот драйвер, или динамически загружаемый модуль (module), не особенно полезен, хотя и годится для дальнейшего усовершенствования. Так как мы адресуем устройство на уровне регистров, этот модель может использоваться на системах PowerPC для доступа к вводу-выводу, как описано в документации по отображению в память. Наш параллельный драйвер устройства использует стандартные open (), close () и, что самое главное, интерфейс ioctl () для иллюстрации архитектуры и внутренней работы драйвера устройства. Мы не будем использовать в этом проекте функции read () и write (), так как функция ioctl () может возвращать значения регистров. (Так как наш драйвер устройства является загружаемым модулем, мы будем называть его просто модулем.) Мы начнем с краткого описания того, как общаться с параллельным портом, а затем перейдем к рассмотрению основных операций нашего драйвера устройства. Мы используем интерфейс ioctl () для обращения к отдельным регистрам в устройстве и создадим приложение для взаимодействия с нашим модулем. Аппаратное обеспечение параллельного порта Любой поиск в сети о параллельном порте выдает огромный массив информации. Так как нашей целью в этой главе является описание модулей Linux, мы коснемся только основ этого устройства. В этом проекте мы будем экспериментировать на х86-системе. Структуру драйвера легко портировать на PowerPC; для этого нужно просто обратиться к другому устройству на уровне ввода-вывода. Несмотря на то что параллельный порт существует на многих встроенных реализациях PowerPC, он слабо распространен на десктопах (таких, как G4 и G5). Для настоящего общения с регистрами параллельного порта мы используем inb () и outb(). Мы легко можем использовать readbO и writebO, доступные в io.h на обеих архитектурах - х86 и РРС. Макросы readb () и writeb () являются хорошим выбором для аппаратно-независимой реализации, так как они обращаются к низкоуровневым функциям ввода-вывода, используемым на х86 и РРС. Резюме Параллельный порт на системах х86 обычно является частью устройства Superio или может быть отдельной (PCI) картой, добавляемой в систему. Если вы перейдете на страницу настройки BIOS, мы увидите, что параллельный порт (порты) отображается в системное пространство ввода-вывода. Для систем х86 параллельный порт может располагаться по адресам 0x278, 0x378 или ОхЗЬс и использует IRQ 7. Это базовый адрес устройства. У параллельного порта есть три 8-битовых регистра, начинающихся с базового адреса, которые показаны в табл. 5.2. Для примера мы будем использовать базовый адрес 0x378. Таблица 5.2. Регистры параллельного порта Бит Адрес порта ввода-вывода
Низкий активный сигнал. Регистр данных содержит 8 бит для записи со штырьков разъема. Регистр состояния содержит входные сигналы с разъема. Управляющий регистр посылает специфические управляющие сигналы на разъем. Разъем параллельного порта имеет 25-пиновый D-порт (DB-25). Табл. 5.3 демонстрирует, как эти сигналы передаются на отдельные штырьки разъема. Таблица 5.3. Набор сигналов на штырьках параллельного разъема Имя сигнала Строб (Strobe) DO Dl D2 D3 D4 D5 Номер штырька 1 2 3 4 5 6 7 Глава 5 • Ввод-Вывод Таблица 5.3. Набор сигналов на штырьках параллельного разъема (Окончание)
ВНИМАНИЕ! Параллельный порт является чувствительным к статическому электричеству и перегрузкам. Не используйте свой интегрированный (встроенный в материнскую плату) параллельный порт: • если вы точно уверены в своем умении обращаться с оборудованием; • если вас не смущает вероятность выхода из строя параллельного порта или всей материнской платы. Мы настойчиво рекомендуем использовать карту адаптера параллельного порта для этого и других экспериментов Для операций ввода мы используем переключатель D7 (штырек 9), для подтверждения (штырек 10) и D6 (штырек 8), для занято (штырек 11) с резисторами по 470 Ом. Для мониторинга вывода мы будем использовать индикаторы LED с данными штырьков с DO по D4 с резисторами максимального ограничения 470 Ом. Для этой цели можно использовать старый кабель от принтера или 25-пиновый разъем D-Shell «nana» из ближайшего магазина электроники. ПРИМЕЧАНИЕ. Хороший программист уровня регистров всегда должен знать как можно больше об аппаратном обеспечении, с которым он работает. Сюда входит отыскание перечня данных для вашего драйвера параллельного порта. В этом перечне данных вы можете найти текущие ограничения/утечки драйвера. На многих сайтах в сети выложены интерфейсные решения для работы с параллельным портом, включая изолированные, расширяемые системы сигналов и резисторов усиления и ослабления. И несмотря на то что они находятся за пределами рассмотрения данной книги, вам стоит с ними ознакомиться самостоятельно. Резюме Этот модуль адресует параллельный порт с помощью функций outb () и inb (). Вспомните гл. 2, «Исследовательский инструментарий», в которой описано, что в зависимости от платформы компиляции эти функции корректно реализуют инструкции in и out для х86 и инструкции lbz и stb для отображаемого в память ввода-вывода на PowerPC. Этот встроенный код можно найти в файле /io. h соответствующей платформы. Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 840; Нарушение авторского права страницы