c - 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,以免丢失简单的交叉编译。
解决方案
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
推荐阅读
- javascript - Redux Store 值变化很慢
- jquery - Codeigniter 验证无法使用 jQuery / ajax
- amazon-web-services - 通过 cloudformation 创建 VPC 中的子网问题
- python - Pyshark 库内存问题
- java - WorkbookFactory 无法解析(Selenium/maven/java)
- mysql - mariaDB 语法错误(带有 if 语句和参数的存储过程)
- javascript - 我可以使用 JavaScript 增强复杂表格的可访问性吗?
- php - php 错误:SQLSTATE[HY093]:参数号无效:参数未定义
- python - AttributeError:模块“cv2.dnn”没有属性“NMSBoxesRotated”
- random - 下面伪代码中的高斯分布函数在哪里?