这几天仔细看了一下go语言运行时实现,它的运行时主要使用xxx.s文件的plan9汇编,xxx.c文件的c语言,xxx.goc文件的go与c的组合,xxx.go文件的go语言实现。
其中plan9汇编格式可以参阅:http://plan9.bell-labs.com/sys/doc/asm.html
其中像与操作系统内核交互层都使用了汇编,是为了效率考虑。
go语言2-LMLPHP

跟踪发现运行时入口放在rt0_xxx_yyy.s(xxx表示操作系统,yyy表示cpu体系结构)的文件里:
go语言2-LMLPHP

因为自己比较关注linux-amd64,所以将会按照这个平台分支探究。
大体调用流程如下图:

go语言2-LMLPHP
在rt0_linux_amd64.s里将会启动一个main(argc, argv)的函数,main调用asm_amd64.s里的_rt0_go。
而_rt0_go将会调用一些平台相对独立的运行时初始化。也从此进入了go运行时调度。
09-06 10:58