IOPERM(2) | Руководство программиста Linux | IOPERM(2) |
ioperm - устанавливает права на работу с портами ввода/вывода
#include <sys/io.h> /* для glibc */
int ioperm(unsigned long from, unsigned long num, int turn_on);
Вызов ioperm() устанавливает num бит прав доступа вызывающей нити, начиная с адреса порта from. Если turn_on не равно 0, то права для указанных битов устанавливаются, иначе сбрасываются. Если turn_on не равно 0, вызывающая нить должна быть привилегированной (CAP_SYS_RAWIO).
До Linux 2.6.8, можно было указывать только первые 0x3ff портов ввода-вывода. Для остальных портов нужно было использовать системный вызов iopl(2) (с аргументом level равным 3). Начиная с Linux 2.6.8, можно указывать 65536 портов ввода-вывода.
Права наследуются дочерним процессом, созданным fork(2) (но смотрите ЗАМЕЧАНИЯ). Права сохраняются при вызове execve(2); это полезно для предоставления доступа к портам ввода-вывода непривилегированным программам.
Данный вызов, в основном, предназначен для архитектуры i386. На большинстве других архитектур он не существует или будет возвращать ошибку.
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
Вызов ioperm() есть только в Linux. Он не должен использоваться в переносимых программах.
В /proc/ioports показываются все порты ввода-вывода, которые выделены в системе в настоящий момент.
До Linux 2.4 права не наследовались потомком, созданным fork(2).
В glibc прототип ioperm() расположен в <sys/io.h> и <sys/perm.h>. Не используйте последний вариант, он существует только для i386.
2017-09-15 | Linux |