这篇和之前的汇编那篇一样,都是翻译自 github 的 go-internals 这个项目,我的翻译地址是:
> https://github.com/cch123/go-internals
这篇写的比较长,如果讲深度的话。。那自己真是惭愧到不好意思去写 interface 的文章了。
不过还是要写,因为看这种基于汇编分析问题的东西,对于大多数人来说还是比较难。这篇其实也不能算面面俱到,而且作者的研究方法是从 binary asm
反推实现原理,实际上还可以直接去看编译器的代码的。
废话不多说,如下。
$ go version
go version go1.
Bootstrap
locate entry point
思路,找到二进制文件的 entry point,在 debugger 中确定代码位置。
使用 gdb:
(gdb) info files
Symbols from "/home/ubuntu/exec_file".
Local exec file:
`/home/ubuntu/exec_file', file type elf64-x86-64.
Entry
说明,做 Go
开发也有不短的时间了,积累了不少工具,感觉是时候开这么个坑了。源码阅读这种事情,别人发文、出书是别人的事情,如果没有自己尝试做一遍始终还是会少得到很多东西。最近感觉时机成熟,因为自己没有之前那么菜了,所以开这个坑。慢慢填上。内容是读
1.10 的源代码。用 stackedit 写完以后同步到 github 上,这里是原始仓库:golang-notes
[https://github.com/cch123/golang-notes]。
更新主要还是在 github 吧,
Go 最近有一个比较有意思的 proposal,提出要将协作式的抢占调度修改为非协作式的抢占调度,并使 Go
的每一条指令理论上都可以被抢占。起因是因为之前有类似这样 [http://xargin.com/how-to-locate-for-block-in-golang/]
的问题。当然,社区里遇到问题的人很多,如果你感兴趣,还可以看看这些 github 上的 issue:#543, #12553, #13546, #14561,
#15442, #17174, #20793, #21053。
之前的协作式抢占是怎么一回事呢,我翻译的这篇 [http://xargin.com/
本文翻译自:
> https://github.com/teh-cmc/go-internals
的第一章。之后如果有余裕,这个项目会一直跟进翻译。
Chapter I: Go 汇编入门
在深入学习 runtime 和标准库的实现之前,我们需要先对 Go 的汇编有一定的熟练度。这份快速指南希望能够加速你的学习进程。
* 本章假设你已经对某一种汇编器的基础知识有所了解
* 涉及到架构相关的情况时,请假设我们是运行在 linux/amd64 平台上
* 学习过程中编译器优化会打开。
--------------------------------------------------------------------------------
Table of Contents
* "Pseudo-assembly"
* Decomposing