ios - дополнительный сегмент ввода/вывода
#include <sys/user.h>
Использование дополнительного сегмента ввода/вывода позволяет осуществить прямой доступ к областям физической памяти, например к видеопамяти графического контроллера, регистрам периферийных устройств или еще к чему-нибудь на системной шине. Доступ к такому сегменту обеспечивается с помощью дополнительной информации, введенной в структуру user. Драйвер ввода/вывода может записать нужные адреса в структуру и предоставить тем самым пользователю доступ к физической памяти.
В структуре user появились следующие дополнительные компоненты:
caddr_t u_iospad; /* Физич. адрес доп. сегмента */ caddr_t u_iosvad; /* Вирт. адрес доп. сегмента */ long u_iossiz; /* Размер доп. сегмента */
Значения всех этих компонентов должны быть кратны двум килобайтам (величина NBPC в файле <sys/param.h>).
Продемонстрируем управление графическим контроллером AGC-1 из прикладной программы. Для этого надо иметь доступ к памяти контроллера, что и достигается с помощью ios. Память контроллера расположена с адреса 0xfcc00000 и имеет длину 0x240000 (вместе с видеопамятью).
Установка процессом соотвествующих полей структуры user осуществляется с помощью открытия специального файла /dev/agc. При этом выполняется функция agcopen драйвера AGC (ее текст хранится в файле /usr/src/uts/io/agc.c). Функция устанавливает поля
u.u_iosvad = (caddr_t) 0xfcc00000; u.u_iospad = (caddr_t) 0xfcc00000; u.u_iossiz = 0x240000;
Для доступа к любому внутреннему регистру конроллера AGC-1 используются два регистра, вынесенных на внешнюю шину: регистр адреса - для указания номера внутреннего регистра, регистр данных - для указания данных, которые должны быть занесены во внутренний регистр (или прочитаны из него). Регистры имеют следующие адреса: регистр адреса - 0xfcc3c000, регистр данных - 0xfcc3c002.
Мы будем изменять два внутренних регистра - регистр высоты экрана и регистр масштабирования. Предполагается, что на графическом экране уже есть изображение (запустите предварительно какой-либо тест). Тогда, меняя содержимое внутренних регистров, мы сможем изменять изображение.