LINUX.ORG.RU

Работа с портами на asm.


0

1

Открыл я /proc/ioports, и хотел прочитать содержимое 60 и 64 портов у клавиатуры.

На NASM написал так:

in al, 0x60

На что получил ошибку сегментирования.

После чего скачал учебник Д. Бовет, М. Чезати «Ядро Linux» и нашел там что надо пользоваться командами inb, inw, inl, outb, outw, outl.

Зашел я в asm/io.h и увидел:

static __inline unsigned char inb (unsigned short int __port)

{

unsigned char _v;

__asm__ __volatile__ («inb %w1,%0»:«=a» (_v):«Nd» (__port));

return _v;

}

На линуксе я недавно и с подобным синтаксисом не знаком.

Погулил, нашел, что асм строка передается gas в виде:

asm [volatile] («команды и директивы ассемблера» : выходные параметры : входные параметры : изменяемые параметры);

Отсюда возник вопрос: что такое «inb %w1,%0» ? Ведь нет такой команды в x86 как inb.

Если есть какая-нибудь книжка/статья, где можно об этом почитать, буду очень благодарен.

Спасибо.

/dev/port даст доступ к портам. Номер порта ставишь через lseek, дальше read/write. Только не пойму нафига тут ассемблер.

anonymous
()

гугли at&t синтаксис.

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

ilovewindows, спасибо, теперь все работает, после добавления вызова iopl(3).

Программа больше не вылетает с ошибкой сегментации, однако, при запуске ее в отладчике (даже если отладчик запущен с правами root) опять вылетает ошибка сегментации (пробовал в gdb и edb).

Есть идеи как это исправить?

Другой вариант, использовать /dev/port, но сначала хочется разобраться с этим.

Спасибо.

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

Точно линуксовый механизм обращения к портам не знаю, могу только предположить. Ядро выполняется в кольце 0, приложения в кольце 3, когда в приложении встречается инструкция типа out , случается исключение общей защиты, процессор переходит в кольцо 0 , определяет причину исключения, в случае выполнения инструкции out выполняет её и переключается
в кольцо 3. Где-то так, если популярно. Возможно отладчик уровня ядра нужен, чтобы такие вещи смотреть. Рут не поможет, это права на уровне операционки, а тут «железные» процессорные.

ilovewindows ★★★★★
()

До 1-го сентября осталось три недели. Ты точно все задания на лето сделал? А по литературе?

anonymous
()

На что получил ошибку сегментирования.

Всё правильно. Ты ломишься по непонятному адресу из userspace.

Читай Танненбаума для начала, сначала по архитектуре, потом по операционкам. В процессе прочтения поймёшь, что ты не так делаешь.

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

Да тут необязательно Таненбаума читать (что-то он постоянно мыслью по дереву растекается), нужно просто усвоить про существование защищённого режима. А для записи в порты и чтения из портов нужно использовать тёплый ламповый дос (на крайняк DOSBox) и TASM/Turbo C впридачу.

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