linux系统调用inb()和outb()的包装

问题描述 投票:0回答:1

下面的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);

设置对上述端口的访问。包装器在syscall Go软件包中:

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

但不是inb()outb()的痕迹。我不想使用cgo进行此调用,以免丢失容易的交叉编译。

c linux go system-calls
1个回答
0
投票

inboutb不是系统调用,它们是处理器指令。您可以使用C编写包装函数,并使用cgo调用它们。

这里是C函数(除非您在sys/io.h中提供了这些函数:]

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

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

还有一个可以与cgo一起使用的头文件:

#ifndef IOPORT_H_
#define IOPORT_H_ 1

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

#endif
© www.soinside.com 2019 - 2024. All rights reserved.