目录

golang系统调用定义

ioctl函数定义

实例调用流程

调用实例


最近在研究go语言,发现go语言系统调用源码只有调用函数的定义,没有指导文档,网上也没有相关文档的说明,自己稍微研究了一下,不对的地方欢迎指教

golang系统调用定义

go源码中关于系统调用的定义如下:

func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)

其中Syscall和RawSyscall区别在于Syscall开始和结束,分别调用了 runtime 中的进入系统调用和退出系统调用的函数,说明Syscall函数受调度器控制,不会造成系统堵塞,而RawSyscall函数没有调用runtime,因此可能会造成堵塞,一般我们使用Syscall就可以了,RawSyscall最好用在不会堵塞的情况下。

func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)

Syscall 的定义位于 src/syscall/asm_linux_amd64.s, 是用汇编写成的,封装了对linux底层的调用。接收4个参数,其中trap为中断信号,a1,a2,a3为底层调用函数对应的参数

ioctl函数定义

trap中断类型传入syscall.SYS_IOCTL,SYS_IOCTL中断号表示调用linux底层ioctl函数

Syscall函数中剩下三个参数a1,a2,a3分别对应ioctl的三个参数。可以man命令查看linux ioctl函数参数,如下

int ioctl(int d, int request, ...);

第一个参数d指定一个由open/socket创建的文件描述符,即socket套接字

第二个参数request指定操作的类型,即对该文件描述符执行何种操作,设备相关的请求的代码

第三个参数为一块内存区域,通常依赖于request指定的操作类型

实例调用流程

1 通过socket创建套接字

2 初始化struct ifconf与/或struct ifreq结构

3 调用ioctl函数,执行相应类型的SIO操作

4 获取返回至truct ifconf与/或struct ifreq结构中的相关信息

调用底层socket函数创建socket套接字,linux下用man命令查看socket函数用法

int socket(int domain, int type, int protocol);

其中domain为协议类型,type为套接字类型,protocol指定某个协议类型常值
domain的值有:

AF_INET IPv4协议
AF_INET6 Ipv6协议
AF_ROUTE 路由套接字
...

type的值有:

SOCK_STREAM 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_RAW 原始套接字
...

protocol的值有:

IPPROTO_IP IP传输协议
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP传输协议
...

因此linux下调用socket生成套接字写法:

fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

综上,转换成go语言中系统调用写法

fd, _, err := syscall.RawSyscall(syscall.SYS_SOCKET, syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_IP)

此时即生成了的socket套接字fd

我们传给int ioctl(int d, int request, …);函数作为第一个参数,

第二个参数request操作的类型我们传入SIOCETHTOOL,获取ethtool信息

SIOCETHTOOL 在源码中宏定义为

#define SIOCETHTOOL     0x8946

第三个参数为struct ifreq结构内存地址
Struct ifreq结构如下:

Struct ifreq{
Char ifr_name[IFNAMSIZ];
Union{Struct  sockaddr  ifru_addr;Struct  sockaddr  ifru_dstaddr;Struct  sockaddr  ifru_broadaddr;Struct  sockaddr  ifru_netmask;Struct  sockaddr  ifru_hwaddr;Short  ifru_flags;Int     ifru_metric;Caddr_t ifru_data;
}ifr_ifru;
};
#define ifr_addr        ifr_ifru.ifru_addr
#define ifr_broadaddr   ifr_ifru.ifru_broadadd
#define ifr_hwaddr      ifr_ifru_hwaddr

综上,linux调用ioctl函数如下:

fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
ioctl(fd, SIOCETHTOOL, &ifreq);

调用实例

fd, _, err := syscall.RawSyscall(syscall.SYS_SOCKET, syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_IP)
if err != 0 {return syscall.Errno(err)}_, _, ep := syscall.Syscall(syscall.SYS_IOCTL, uintptr(e.fd), SIOCETHTOOL, uintptr(unsafe.Pointer(&ifreq)))
if ep != 0 {return syscall.Errno(ep)

golang 系统调用 syscall 简介相关推荐

  1. Golang 系统调用Syscall

    最近在研究go语言,发现go语言系统调用源码只有调用函数的定义,没有指导文档,网上也没有相关文档的说明,自己稍微研究了一下,不对的地方欢迎指教 go源码中关于系统调用的定义如下: func Sysca ...

  2. Android 6.0 JNI原理分析 和 Linux系统调用(syscall)原理

    JNI原理 引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: fram ...

  3. 大家一起学Golang——Go语言简介与安装

    大家一起学Golang --Go语言简介与安装 go语言简介 Go语言是有google公司推出的一门编程语言,是开源,静态编程语言,语法简洁,天生支持并发. 2007年由Robert Grieseme ...

  4. 间接系统调用syscall(SYS_gettid)

    在linux下每一个进程都一个进程id,类型pid_t,可以由getpid()获取.POSIX线程也有线程id,类型pthread_t,可以由pthread_self()获取,线程id由线程库维护.但 ...

  5. 系统调用syscall函数和字符设备驱动file_operations

    一.syscall是什么 Linux 中分为用户态和内核态两种运行状态. 对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力.当进行一些敏感操作,比如说要打开文件(open)然后进行写入(wr ...

  6. Golang通过syscall调用win32的Api

    2019独角兽企业重金招聘Python工程师标准>>> What you are wasting today is tomorrow for those who died yeste ...

  7. golang signal 信号简介

    目录 1.1. 基本概念 1.2. Go 对信号的处理 1.2.1. Go 程序对信号的默认行为 1.2.2. 改变信号的默认行为 1.2.3. SIGPIPE 1.2.4. cgo 注意事项 1.3 ...

  8. linux系统调用(syscall)原理

    引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app.framework.native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到 ...

  9. Linux系统调用(syscall)原理(转)

    引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app.framework.native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到 ...

最新文章

  1. 在dbca建库的时候报ORA-27125错误的解决方法
  2. 这么全的数组去重,你怕不怕?
  3. 【Xamarin挖墙脚系列:Xamarin4.0的重大变更】
  4. vim安装时报错:Depends:vim-common (=2:7.4.1689-3ubuntu1.4) but 2:8.0.1453-1ubuntu1.1 is to be installed
  5. 217 Contains Duplicate
  6. pythonurllib的使用_python re和urllib的使用问题。
  7. mpAndroidchart 坐标和图表距离_几个小细节--图表那些事
  8. java开发大全、系列文章、精品教程
  9. python3数据库框架_Python3 MySQL 数据库连接:安装pymysql(mysql数据库驱动), sqlalchemy(ORM框架)。...
  10. c语言中十进制与十六进制转换_二进制、八进制、十进制、十六进制数据转换...
  11. IIS建立两个站点服务,只有一个公网IP
  12. UBUNTU给已有用户改名
  13. 使用 Metasploit 利用 MySQL 默认空密码或弱密码漏洞 (CVE-2002-1809, CNNVD-200212-263, CVE-1999-0502)
  14. 树莓派使用 python IIC 驱动 OLED 刷新率低问题与解决
  15. 人人接龙助手,三分钟为你的微信群创建打卡活动
  16. android实现箭头流程列表_Android弹出选项框及指示箭头动画选择
  17. 【Hibernate步步为营】--详解基本映射
  18. numpy数组中元素单个选取或部分选取
  19. 武田公布2019财年第一季度强劲业绩并上调全年指引
  20. SecureCRT命令行参数

热门文章

  1. GPU — CUDA 编程模型
  2. 微服务架构 — 服务治理 — 服务限流、服务降级、服务熔断
  3. 边缘计算 — 商业模式
  4. Go 语言编程 — go-swagger OpenAPI 工具
  5. OvS v.s. OvS-DPDK v.s. VPP
  6. Octavia health-manager 与 amphora 故障修复的实现与分析
  7. Git 本地仓库管理
  8. openstack nova 源码解析 — Nova API 执行过程从(novaclient到Action)
  9. 【Python】 linecache模块读取文件
  10. Notification 浏览器右下角弹出提示消息