首页 > 解决方案 > inb() 和 outb() linux 系统调用的包装器

问题描述

是否有以下用于低级端口输入输出的 Linux 系统调用的 Go 包装器?

#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);

它设置了对上述端口的访问。Wrapper 在 syscall Go 包中:

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

但没有inb( )outb()的痕迹。我不想在这个调用中使用cgo,以免丢失简单的交叉编译。

标签: clinuxgosystem-calls

解决方案


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

推荐阅读