Browsed by
分类:Go内部实现

探索Go语言内部实现

文件I/O:通用的 I/O 模型 — Go 封装

文件I/O:通用的 I/O 模型 — Go 封装

本文介绍 Unix I/O 模型中的4个通用系统调用:open()、read()、write()和close() 的 Go 语言封装。 1、Linux 中 open 系统调用的定义 2、Go 中 open 系统调用的封装 一般的,我们使用 os 标准库的 Open/Create 方法来间接调用 open 系统调用,跟踪代码,找到 Go 中 open 系统调用的封装: 2.1 openat 又是什么呢? 从 2.6.16 (Go 支持的 Linux 版本是 2.6.23)开始,Linux 内核提供了一系列新的系统调用(以at结尾),它们在执行与传统系统调用相似任务的同时,还提供了一些附加功能,对某些程序非常有用,这些系统调用使用目录文件描述符来解释相对路径。 可见,openat 系统调用和 open 类似,只是添加了一个 dirfd 参数,其作用如下: 1)如果 pathname 中为一相对…

阅读全文 阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (1 人打了分, 平均分:4.00,总分:5)
Loading...
Go 语言系统调用简析

Go 语言系统调用简析

一、系统调用概述 系统调用是受控的内核入口,借助于这一机制,进程可以请求内核以自己的名义去执行某些动作。Linux 内核以 C 语言语法 API 接口形式(头文件),提供有一系列服务供程序访问。可以通过 man 2 syscall 查看系统调用信息。 关于系统调用,需要注意以下几点: 1、系统调用将处理器从用户态切换到核心态,以便 CPU 访问受到保护的内核内存; 2、系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识; 3、每个系统调用可辅之以一套参数,对用户控件(进程虚拟地址控件)与内核空间之间(相互)传递的信息加以规范; 以C语言为例,执行系统调用时,幕后会历经诸多步骤。以 x86-32 平台为例,按时间发生顺序对这些步骤加以分析: 1、应用程序通过 C 语言函数库中的外壳(wrapper)函数,来发起系统调用; 2、对系统调用中断处理例程来说,外壳函数必须保证所有的系统调…

阅读全文 阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有人评分,赶紧评一下)
Loading...
汇编和Plan9汇编

汇编和Plan9汇编

最近在研究 Go 的源代码(阅读后的代码注释放在了github上:http://github.com/polaris1119/go_src_comment),由于不少底层代码是用汇编写的,而且是 Plan9 的汇编,因此重新看了一些汇编和 Plan9 汇编的知识。在这里做一个总结、备忘。 一、资源 1、指令查询: http://68k.hax.com/ 2、命令查询 https://9p.io/magic/man2html/1/8a 3、LEA 和 MOV LEA:操作地址; MOV:操作数据 如: LEAQ 8(SP), SI // argv 把 8(SP)地址放入 SI 寄存器中 MOVQ 0(SP), DI // argc 把0(SP)内容放入 DI 寄存器中 4、对外部数据的引用需要用到 伪寄存器 PC (the virtual program counter) or SB (th…

阅读全文 阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有人评分,赶紧评一下)
Loading...
Go语言源码学习:引导工具cmd/dist

Go语言源码学习:引导工具cmd/dist

一、简介 cmd/dist是生成Go distribution的引导工具。它负责构建C程序(像Go编译器)和初始化Go工具的拷贝(即go_bootstrap)。 dist本身是用C语言写的。所有和C库,甚至和C标准库的交互,都通过一个系统相关的文件封装起来,以方便移植,如:plan9.c、unix.c和windows.c等。通过这个可移植层提供功能,供其他文件使用。在这个可移植层中,为了避免和现有函数混淆,相同功能的函数带有前缀:x。例如:xprintf是printf的可移植版本。 到目前为止,dist中大部分普通数据类型是字符串或字符串数组。然而,dist中使用两个命名的数据结构:Buf和Vec,保存它们拥有的所有数据,而不是使用char*和char**。Buf相当于Go中的[]byte,Vec相当于Go中的[]string。对Buf的操作函数以b开头;对Vec的操作函数以v开头。 二、…

阅读全文 阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有人评分,赶紧评一下)
Loading...
分析源码安装Go的过程(初稿)

分析源码安装Go的过程(初稿)

安装Go语言,建议通过源码安装。通过源码安装Go,一般只需要安装一个GCC编译器就可以了。(Windows下是安装MinGW)。该文分析通过源码安装Go语言的过程。 一、分析安装脚本 在《探究Go中各个目录的功能》一文中提到了几个脚本,以及它们的作用。现在来分析这些脚本都做了些什么。(以linux下为例,Windows对应的脚本类似) 1、all.bash 说明: 1)set -e 当脚本中某个命令返回非零退出状态时,脚本退出 2)if语句 是要求all.bash必须在make.bash所在的目录运行(也就是$GOROOT/src) 3)OLDPATH=”$PATH” 保存当前PATH 4)执行make.bash并传递–no-banner参数 5)执行run.bash并传递–no-rebuild参数 6)执行dist工具并传递 banner参…

阅读全文 阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有人评分,赶紧评一下)
Loading...
探究GO中各个目录的功能

探究GO中各个目录的功能

下载Go源码后,根目录结构如下: |– AUTHORS — 文件,官方 Go语言作者列表 |– CONTRIBUTORS — 文件,第三方贡献者列表 |– LICENSE — 文件,Go语言发布授权协议 |– PATENTS — 文件,专利 |— README — 文件,README文件,大家懂的。提一下,经常有人说:Go官网打不开啊,怎么办?其实,在README中说到了这个。该文件还提到,如果通过二进制安装,需要设置GOROOT环境变量;如果你将Go放在了/usr/local/go中,则可以不设置该环境变量(Windows下是C:\go)。当然,建议不管什么时候都设置GOROOT。另外,确保$GOROOT/bin在PATH目录中。 |– VERSION &#…

阅读全文 阅读全文

1 Star2 Stars3 Stars4 Stars5 Stars (还没有人评分,赶紧评一下)
Loading...