登录
首页 >  Golang >  Go问答

封装 Linux 系统调用中的 inb() 和 outb() 函数

来源:stackoverflow

时间:2024-03-28 15:54:33 351浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《封装 Linux 系统调用中的 inb() 和 outb() 函数》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

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

#include 

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 进行此调用,以免丢失简单的交叉编译。


解决方案


inboutb 不是系统调用,它们是处理器指令。您可以用 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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>