outb(2) | System Calls Manual | outb(2) |
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.
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Konstantin Shvaykovskiy <kot.shv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
10 ноября 2022 г. | Linux man-pages 6.03 |