Оболочки для системных вызовов inb () и outb () linux - PullRequest
0 голосов
/ 19 января 2020

Есть ли Go оболочки для следующих системных вызовов Linux, используемых для низкоуровневого ввода-вывода порта?

#include <sys/io.h>

unsigned char inb(unsigned short int port);
void outb(unsigned char value, unsigned short int port);

Мне удалось найти только обертку для вызова сестры:

int ioperm(unsigned long from, unsigned long num, int turn_on);

, которая устанавливает доступ к вышеупомянутым портам. Оболочка находится в системном пакете Go:

func Ioperm(from int, num int, on int) (err error)

, но не содержит следов inb () и outb () . Я не хочу использовать cgo, чтобы эти вызовы не теряли простую кросс-компиляцию.

1 Ответ

1 голос
/ 19 января 2020

inb и outb не системные вызовы, это инструкции процессора. Вы можете написать для них функции-оболочки в C и вызывать их с помощью cgo.

Вот функции C (если они не доступны в sys/io.h):

unsigned char inb(unsigned short port)
{
    unsigned char ret;
    asm volatile("in %%dx, %%al" : "=a"(ret) : "d"(port) : "memory");
    return ret;
}

void outb(unsigned char value, unsigned short port)
{
    asm volatile("out %%al, %%dx" : : "a"(value), "d"(port) : "memory");
}

И небольшой заголовочный файл, который вы можете использовать с cgo:

#ifndef IOPORT_H_
#define IOPORT_H_ 1

unsigned char inb(unsigned short port);
void outb(unsigned char value, unsigned short port);

#endif
...