LINUX.ORG.RU

прямое обращение к портам


0

0

В среде win разобрался как обратиться напрямую к любым портам аппаратуры. Попробовал это сделать для Linux, в Kylixe вставил ассемблерный код обращения к портам и в ответ получил ошибку. Она аналогична ошибки в среде W2k - запрещенное обращение. С Linux только начал заниматься, литературы никакой не нашел. Может кто-то сталкивался с этой проблемой. Просьба помочь. Сергей. Мой мэйл: lsv@prao.psn.ru

anonymous

Если из userspace

то

iopl(3)

или ioperm для диапазона

и потом чтонибудь из серии

inb() , outb(), inbl(), outbl()

либо еще способ memset_io() readb() writeb()

C asm лучше не связывайся , а то долго разбираться будешь

anonymous
()

Не хрена ты не обратишься напрямую к портам. Только из kernel-спейс это можно делать.

iopl и остальные это системные вызовы, которые передают управление коду в ядре который работает на 0 уровне привилегий через шлюз прерывания 0x80.

Так что ассемблер пробовать не нужно. Разница с виндой в том, что винда построена на микроядерной архитектуре (то есть какие то части системы наботают не на одном уровне привилегий с виндозым ядром; наверное драйвера) и поэтому тебе дали доступ.

Banshee
()

Причем винды дают доступ далеко не ко всем портам. Даже 95й.

Havoc ★★★★
()

2Havoc: Согласен, что не ко всем.

Banshee
()

Banshee ты не прав Тебе нужны шашечки или ехать? Если программа делает Set UID root или запускается под root-ом то описанный первым автором способ работает Если посмотреть на определения inb outb и тд то видно что это ассемблерные макросы Вообще есть IO-Port-Programming-HOWTO Поискать можно ftp.chg.ru/.1/Linux/Slackware/slackware-8.0/docs/Linux-mini-HOWTO/IO-Port-pro... geekkoo

anonymous
()
Ответ на: комментарий от anonymous

Попробовал из Kylix выполнить iopl(3). Получилось. Только надо указать модуль Libc (м.б. это си библиотека?). Далее обнаглел и сделал ассемблерную вставку mov dx,port; in al,dx; mov i,al и с удивлением увидел, что я прочитал содержимое порта (в данном случае $220); Далее сделал аналоги си inportb, outportb. Написал программу под Kylix опроса АЦП с буфером (практически перенес из Delphi) и она заработала! Огромное спасибо за совет. Memset не пробовал, этого оказалось достаточно. Сергей.

anonymous
()

Пробовал несколько лет назад под линухом с SB16 поковыряться (как в досе).
Только я писал/читал из /dev/port (или ports?)
Даже работало, правда только под рутом

Havoc ★★★★
()

Да, оказывается можно писать/читать из порта на прямую. Я этого не знал. Как это обьяснить? Для этого типа не нужет уровень привилегий 0.

iopl - системный вызов (см. /usr/include/bits/syscall.h, стр. 88). Как они работают я уже говорил выше.

/dev/... это ж файлы десайсов. Когда ты в него пишешь или читаешь, то передаешь управление соотв. функциям read, write в каком то модуле или в ядре через read, write... Это системные вызовы, а их по определению может делать только рут.

Banshee
()
Ответ на: комментарий от Banshee

Речь идет о портах пользовательских адреса 200-3FF. Доступ ко всему диапазону адресов до 65тыс. просто не пробовал. Сергей.

anonymous
()

>Да, оказывается можно писать/читать из порта на прямую. Я этого не знал.
>Как это обьяснить? Для этого типа не нужет уровень привилегий 0.

Это от оси зависит. Ось может сделать так, чтобы при попытке работы с портом генерировалось исключение. А дальше ось может или пристрелить программу или повторить операцию, но на нулевом ринге.

Тоже самое касается дергания прерываний. Только с прерываниями несколько сложнее.

Havoc ★★★★
()

Хм ... а COFFEE HOWTO это не про, то о чем вы тут говорите? :)))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.