1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-29 08:12:21 +00:00
2018-07-24 08:15:48 +08:00

42 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 3.8. 汇编语言的威力
汇编语言的真正威力来自两个维度一是突破框架限制实现看似不可能的任务二是突破指令限制通过高级指令挖掘极致的性能。对于一个问题我们将讨论如何通过Go汇编语言直接访问系统调用和直接调用C语言函数。对于第二个问题我们将简单讨论X64指令中AVX等高级指令的简单用法。
## 系统调用
系统调用是操作系统为外提供地公共接口。因为操作系统彻底接管了各种底层硬件设备因此操作系统提供的系统调用成了某些操作地唯一方法。从另一个角度看系统调用更像是一个RPC远程过程调用。在系统调用时我们只是像操作系统发送某个调用地编号和对应地参数然后阻塞等待系统调用地返回。因为涉及到阻塞等待因此系统调用期间对应CPU的利用率一般是可以忽略地。同时系统调用时类似RPC地远程调用操作系统内核处理系统调用时不会依赖用户的栈空间一般不会导致爆栈发生。因此可以认为系统调用是最简单的一种调用了。
系统调用虽然是最简单地调用但是它是操作系统对外的接口因此不同的操作系统调用规范可能有很大地差异。我们先关注Linux在AMD64架构上的系统调用规范`syscall/asm_linux_amd64.s`文件中有注释说明:
```go
//
// System calls for AMD64, Linux
//
// func Syscall(trap int64, a1, a2, a3 uintptr) (r1, r2, err uintptr);
// Trap # in AX, args in DI SI DX R10 R8 R9, return in AX DX
// Note that this differs from "standard" ABI convention, which
// would pass 4th arg in CX, not R10.
```
这是`syscall.Syscall`函数的内部注释简要说明了Linux系统调用的规范。系统调用一般不超过6个参数直接由DI、SI、DX、R10、R8和R9寄存器传输结果由AX和DX寄存器返回。
TODO
## 直接调用C函数
TODO
## AVX指令
TODO
<!--
学习汇编的原因是汇编可以挖掘功能
同时也可以挖掘性能
syscall类似rpc没有栈爆问题
cgoall
avx2
-->