Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

IOS(7)

НАЗВАНИЕ
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.

Мы будем изменять два внутренних регистра - регистр высоты экрана и регистр масштабирования. Предполагается, что на графическом экране уже есть изображение (запустите предварительно какой-либо тест). Тогда, меняя содержимое внутренних регистров, мы сможем изменять изображение.


#include <fcntl.h>



#define HEIGHT 0x008A

#define ZOOM   0x00EA



typedef unsigned short  ushort;



main (argc, argv)

int argc;

char *argv[];

{

  int i, j, k, fd, old_value;



  if ((fd = open ("/dev/agc", 0, O_RDWR)) < 0) {

    perror ("\nOpen error /dev/agc :");

    exit (0);

  }



  /* Прочитаем значение высоты экрана в строках */

  old_value = read_register (HEIGHT);



  /* Будем изменять высоту экрана (сначала уменьшаем до

     нуля, а потом увеличиваем до исходного значения */

  for (i=old_value; i>=1; i--) {

    write_register (HEIGHT, i);

    /* задержка */

    for (j=0; j<1000; j++) k = j/231;

  }



  for (i=1; i<=old_value; i++) {

    write_register (HEIGHT, i);

    for (j=0; j<1000; j++) k = j/231;

  }



  /* Будем изменять регистр масштабирования */

  for (i=0; i<16; i++) {

    write_register (ZOOM, (i | (i<<4)) << 8);

    sleep (1);

  }

  for (i=15; i>=0; i--) {

    write_register (ZOOM, (i | (i<<4)) << 8);

    sleep (1);

  }



  close (fd);

}



/* Запись в регистр контроллера */

void write_register (number, value)

int number;  /* Номер регистра */

int value;   /* Значение регистра */

{

  ushort *adr= (ushort *) 0xfcc3c000;

  ushort *dat= (ushort *) 0xfcc3c002;

  ushort val;



  *adr = number;

  *dat = value;

}



/* Чтение регистра контроллера */

int read_register (number)

int number;  /* Номер регистра */

{

  ushort *adr= (ushort *) 0xfcc3c000;

  ushort *dat= (ushort *) 0xfcc3c002;



  *adr = number;

  return ((int) *dat);

}

ПРЕДОСТЕРЕЖЕНИЯ
Неосторожное использование ios может нарушить работу системы.

Ios является машинно-зависимым средством и на других компьютерах может не работать.

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...