outb, outw, outl, outsb, outsw, outsl, inb, inw, inl, insb, insw, insl, outb_p,
outw_p, outl_p, inb_p, inw_p, inl_p -
ввод/вывод
в порт
Standard C library (
libc,
-lc)
#include <sys/io.h>
unsigned char inb(unsigned short port);
unsigned char inb_p(unsigned short port);
unsigned short inw(unsigned short port);
unsigned short inw_p(unsigned short port);
unsigned int inl(unsigned short port);
unsigned int inl_p(unsigned short port);
void outb(unsigned char value, unsigned short port);
void outb_p(unsigned char value, unsigned short port);
void outw(unsigned short value, unsigned short port);
void outw_p(unsigned short value, unsigned short port);
void outl(unsigned int value, unsigned short port);
void outl_p(unsigned int value, unsigned short port);
void insb(unsigned short port, void addr[.count],
unsigned long count);
void insw(unsigned short port, void addr[.count],
unsigned long count);
void insl(unsigned short port, void addr[.count],
unsigned long count);
void outsb(unsigned short port, const void addr[.count],
unsigned long count);
void outsw(unsigned short port, const void addr[.count],
unsigned long count);
void outsl(unsigned short port, const void addr[.count],
unsigned long count);
Это
семейство
вызовов
используется
для
низкоуровневой
работы с
портами
ввода/вывода.
Вызовы out*
выполняют
запись в
порт, а
вызовы in*
выполняют
чтение из
порта;
вызовы с
суффиксом b
работают с
данными
шириной
один байт, а
вызовы с
суффиксом w
работают с
данными
шириной в
одно слово;
вызовы с
суффиксом _p
ждут
завершения
операции
ввода-вывода.
В основном,
они
предназначены
для
использования
внутри
ядра, но
могут быть
вызваны и
из
пользовательского
пространства.
Вы должны
скомпилировать
свою
программу
с флагами
-O,
-O2 и им
подобными.
Данные
вызовы
определены
в виде
встроенных
макросов и
не будут
подставляться
без
включённой
оптимизации,
что
приводит к
появлению
неразрешаемых
ссылок в
процессе
компоновки
программы.
Для того,
чтобы
запросить
у ядра
разрешение
доступа к
портам
ввода-вывода
из
приложения,
работающего
в
пользовательском
пространстве,
используйте
ioperm(2) или
iopl(2).
Если этого
не сделать,
приложение
получит
сообщение
об ошибке
сегментации.
Вызовы
outb() и
ему
подобные
зависят от
конкретного
оборудования.
Аргумент
value
передаётся
первым, а
port
— вторым,
что
является
обратным
порядком
по
сравнению
с
большинством
реализаций
этих
вызовов в DOS.
ioperm(2),
iopl(2)
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Konstantin Shvaykovskiy
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]