首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏大愚Talk

    走进Golang之运行与Plan9汇编

    本文目录速览: Golang的运行环境 内存 操作系统、CPU、内存互相配合 Go程序的调用规约 函数在栈上的分布 Go的调用实例 Go的汇编plan9 查看go应用代码对应的翻译函数 逃逸分析 传值还是传指针 以及通过查阅 Golang 的 Plan9 汇编来了解Golang的一些内部秘密。 Golang的运行环境 当我们把编译后的Go代码运行起来,它会以进程的方式出现在系统中。 Go的调用实例 才开始,我们就从一个简单的函数开始来分析一下整个函数的调用过程(下面涉及到 Plan9 汇编,请别慌,大部分都能够看懂,并且我也会写注释)。 ---- 由于上面涉及到一些 Plan9 的知识,就顺带一起介绍一些它的语法,如果直接讲语法会很枯燥,下面会结合一些实际中会用到的情况来介绍。既有收获又能学会语法。 Golang的汇编是基于 Plan9 汇编的,个人觉得要完全学懂太复杂了,因为这涉及到很多底层知识。不过如果只是要求看懂还是能够做到的。下面我们就举一些例子来试试看。

    1.2K10发布于 2019-12-04
  • 来自专栏光华路程序猿

    肝了一上午的Golang之Plan9入门

    汇编这些东西的确我们现在使用的高级语言的编译器都帮助我们屏蔽掉了,但是今天我们要来学学Go的plan9汇编,要是硬扛为什么? 对于一只老鸟来说,我觉得搞搞Plan9汇编还是有不少益处的: 可以搞懂一段代码底层到底是如何运行的 性能极致追求的优化 基础数据结构如何运行 比如hashmap、channel 反编译对二进制包进行分析 ,可以使用 0x123的形式表示十六进制 操作方向 plan9汇编操作数方向 与intel汇编方向相反 //plan9 汇编 MOVQ $123, AX //intel汇编 mov rax, 123 栈扩大、缩小 plan9中栈操作并没有push pop,而是采用sub和add SP SUBQ $0x18, SP //对SP做减法 为函数分配函数栈帧 ADDQ $0x18, SP //对SP做加法 通用寄存器 在plan9汇编里还可以直接使用amd64的通用寄存器,应用代码层面会用到的通用寄存器主要是: rax,rbx,rcx,rdx,rdi,rsi,r8~r15这14个寄存器。

    1.1K30编辑于 2022-06-29
  • 来自专栏minlearnprogramming

    Plan9:一个从0开始考虑分布式,分布appmodel的os设计

    本文关键字:plan9,Inferno,limbo,Plan 9 from User Space:plan9port 在《除了UNIX,我们真的有可选的第二开源操作系统吗?》 Plan9没有推广起来,一个原因是它的思想太过领先——在用户还没有意识到存在这样的问题的时候,就把问题解决了。 plan9的曲线回归 ----- 开发是源于平台到语言到问题的总工程,由设计贯穿,设计包括对OS的设计,OS下编程本身的设计,OS下编程语言的设计,编程方法的设计。 Inferno操作系统是Plan9的姐妹操作系统。它的思想和Plan9基本相同,都是基于文件的。但是它只有内核是C编写,其他的应用程序都是Limbo编写的。 可见plan9一开始就想彻头彻尾的自立门户,对传统OS和GNU没有任何依赖。

    1.4K50发布于 2020-09-27
  • 来自专栏技术研究和应用

    【向量检索研究系列】本地向量检索(上)

    Github地址:https://github.com/gonum/gonumfloat32的内积运行函数如下,采用的是Plan9汇编实现的。 关于Plan9汇编的介绍在这暂时不展开,网上有很多资源可参考,如:https://xargin.com/plan9-assembly/内积运算公式:图片Gonum中内积运算Plan9汇编代码如下:#include 2.3.1 Plan9汇编调用Golang是可以直接调用Plan9汇编的,但是C写的SIMD函数怎么转Plan9汇编呢? 在Github上发现一个开源的项目c2goasm,它可以将C函数汇编转成Plan9汇编,c2goasm的本质也是调用asm2plan9s工具将C的汇编转成Plan9汇编。 将SIMD内积运算的C汇编代码通过c2goasm转成Plan9汇编如下,默认会在函数名前加一个下划线。

    1.6K31编辑于 2022-09-13
  • 来自专栏码洞

    码农群英传连载(一) —— Go 语言之父 Rob Pike

    他来 Google 之前一直在贝尔实验室捣鼓它的 Plan9 操作系统,虽然几乎没人听说过世界上还有这么一个操作系统,Plan9 这个项目已经活了很多年,到现在还有不少人在继续维护,Plan9 的官方主页是 https://9p.io/plan9/。 我翻阅了官网上对 Plan9 的说明文档,里面有关 Plan9 的论文多达几十篇,这些论文中 Rob Pike 的名字署满了近一半。 这足以说明 Rob Pike 不容小嘘,他就是 Plan9 操作系统的灵魂人物。 ? 他是一个全能型程序员,从操作系统写到编译器,又从文本编辑器写到了 UI 界面。

    56630发布于 2018-12-06
  • 来自专栏minlearnprogramming

    ​一个matepc,mateos,mateapp的goblinux融合体系设计

    plan9和usermode plan9,它将分布式协议实现在kernel或rootfs,进而影响这种OS xaas下的app开发。 parallesdesk的os,windows和osx作为其subos,这样osx base就是pd的专用os了)的不断增强,接下来的二个增强就强烈涉及到了开发: 在《打造一个Applevel虚拟化,内置plan9 的rootfs:goblin(1)》中,我们提到了整合go,plan9到这个linux的思想:并提到了这样做的底层依据:整合busybox或plan9这样的live demo服务到每一个app作rootfs plan9这种协议,是天生的本地远程同步/通讯协议,可以免协议开发(因为它是demo级的,甚至不是一个lib)在本地和远程都能运行的APP,且无修改地工作在一个OS下,就如同git p2p协议一样。 它有以下几个特点: 如上所述,用go,且利用9p实现无须协议交互的本地远程p2p,写git之类的东西,因为plan9有os级的实现也有linux的userspace实现品,甚至有9p lib。

    58520发布于 2020-09-29
  • 来自专栏黑客编程

    Go语言交叉编译,跨平台执行

    ppc64lenetbsd 386 netbsd amd64 netbsd arm openbsd 386 openbsd amd64 openbsd arm plan9 386 plan9 amd64 solaris amd64 windows 386 windows amd64 windows arm windows arm64

    2.2K20编辑于 2023-03-05
  • 来自专栏平也

    Go语言交叉编译工具gox

    arm", true}, {"netbsd", "386", true}, {"netbsd", "amd64", true}, {"netbsd", "arm", true}, {"plan9 Platforms_1_4 = append(Platforms_1_3, []Platform{ {"android", "arm", false}, {"plan9", "amd64", false ]Platform{ // While not fully supported s390x is generally useful {"linux", "s390x", true}, {"plan9

    2K20发布于 2020-04-03
  • 来自专栏minlearnprogramming

    ​一个隔开hal与langsys,用户态专用OS的设想

    在《打造一个Applevel虚拟化,内置plan9的rootfs:goblin(1)》中,我们将其用到了具体APP(将plan9 rootfs集进app,treats os logic and app 这样结合我们上面谈到的《hyperkit:一个full codeable,full dev support的devops及cloud appmodel》《打造一个Applevel虚拟化,内置plan9的 在APP os层面可以专心与一门语言绑定,或专心融入一种问题,或抽象方法,如plan9 all is file的理念,变成纯粹面向domain的专用OS。

    52920发布于 2020-09-29
  • 来自专栏码农桃花源

    深入Go的底层,带你走近一群有追求的人

    夜读活动结束之后,杨大发布了由春晖大神带来的夜读分享预告:《plan9 汇编入门,带你打通应用和底层》。我得知这个消息后,非常激动! 我在公司内网上搜到了他写的plan9汇编相关文章,发布到Go夜读的github上。我提前花时间预习完了文章,整理出了遇到的问题。 周六晚上9点准时开讲,曹大的准备很充分! 硬核知识点 什么是plan9汇编 我们知道,CPU是只认二进制指令的,也就是一串的0101;人类无法记住这些二进制码,于是发明了汇编语言。汇编语言实际上是二进制指令的文本形式,它与指令可以一一对应。 Go汇编语言实际上来源于plan9汇编语言,而plan9汇编语言最初来源于Go语言作者之一的Ken Thompson为plan9系统所写的C语言编译器输出的汇编伪代码。 点击阅读原文可以看到文章里提到的所有资料,包括上期曹大plan9汇编的视频回放,不容错过! ?

    51120发布于 2019-05-21
  • 来自专栏golang算法架构leetcode技术php

    golang源码分析:sonic

    由于clang编译出来的是x86汇编,而golang编译出来的是plan9汇编。 为了在golang中调用clang编译出来的汇编,字节开发了一个工具(tools/asm2asm)将x86的汇编转换为plan9

    87731编辑于 2023-09-06
  • 来自专栏Golang语言社区

    转--【独家】鲜为人知的Google go语言若干细节

    Javascript执行引擎V8,V8采用即时编译技术和分代(generational)的stop-the-world垃圾收集机制; Rob Pike乃大名鼎鼎的人物,曾在贝尔实验室工作,是Unix操作系统、Plan9 Irrelevant,还有两本书The Unix Programming Environment和The Practice of Programming; Ken Thompson是图灵奖获得者,是Unix操作系统、Plan9

    838100发布于 2018-03-21
  • 来自专栏重归混沌

    初识Go语言

    是的,当我知道Go反汇编出来的是Plan9汇编时,我震惊了。 这就意味着,即使我能突破编译器插入代码这个障碍,我依然看不到最终执行的X86指令,我依然不知道代码最终在CPU上是如何执行的。 这我就不太能理解了,不管是不是Plan9汇编,最终只要跑在x86指令集的机器上,他们的优化思路都应该是尽可能多的使用寄存器,而不是栈。 当我想进一步寻找答案时,Plan9成了阻碍。 我很难确定,是不是在Plan9的ABI中,每个函数只有三个寄存器可用。 在从Plan9生成X86汇编时,会把栈上变量尽可能多地转移到x86寄存器上。 具体的开销,可能要等我熟悉了Plan9汇编和runtime库之后,才能破解谜题了。 ---- 再来看看Go的CSP编程,Go是通过channel来实现CSP编程的。

    56610编辑于 2022-11-11
  • 来自专栏Golang语言社区

    【Go 语言社区与】转-鲜为人知的Google go语言若干细节

    Javascript执行引擎V8,V8采用即时编译技术和分代(generational)的stop-the-world垃圾收集机制; Rob Pike乃大名鼎鼎的人物,曾在贝尔实验室工作,是Unix操作系统、Plan9 Irrelevant,还有两本书The Unix Programming Environment和The Practice of Programming; Ken Thompson是图灵奖获得者,是Unix操作系统、Plan9

    69250发布于 2018-03-20
  • 来自专栏人人都是架构师

    Go每日一库之3:go-homedir

    类 Unix 系统的实现稍微复杂一点: func dirUnix() (string, error) { homeEnv := "HOME" if runtime.GOOS == "plan9" { // On plan9, env vars are lowercase. errors.New("blank output when reading home directory") } return result, nil } 流程如下: 先读取环境变量HOME(注意 plan9

    47250编辑于 2023-09-12
  • 来自专栏golang算法架构leetcode技术php

    golang源码阅读(11)GO中各个目录的功能

    u.h ureg_amd64.h ureg_arm.h ureg_x86.h utf.h 其中,plan9目录是针对Plan 9操作系统的,从里面的文件名知道,跟include跟目录下的是一个意思。 该文件直接来源于plan9。地址:http://code.swtch.com/plan9port/src/tip/include/u.h。 所有plan9 C程序必须在开始出包含该头文件(因为其他文件引用了该文件中的类型定义) 2)ureg.h 包括:ureg_amd64.h ureg_arm.h ureg_x86.h 三种架构的定义。 plan9采用了不同的方式,一个C库由strings函数、内存操作函数、一些格式化IO程序,加上所有和这些相关的系统调用。为了使用这些功能,需要包含libc.h头文件。 该文件从Inferno和Plan9中提取出来的。

    98831编辑于 2022-08-02
  • 来自专栏码洞

    深入Go的底层,带你走近一群有追求的人

    夜读活动结束之后,杨大发布了由春晖大神带来的夜读分享预告:《plan9 汇编入门,带你打通应用和底层》。我得知这个消息后,非常激动! 我在公司内网上搜到了他写的plan9汇编相关文章,发布到Go夜读的github上。我提前花时间预习完了文章,整理出了遇到的问题。 周六晚上9点准时开讲,曹大的准备很充分! 硬核知识点 什么是plan9汇编 我们知道,CPU是只认二进制指令的,也就是一串的0101;人类无法记住这些二进制码,于是发明了汇编语言。汇编语言实际上是二进制指令的文本形式,它与指令可以一一对应。 Go汇编语言实际上来源于plan9汇编语言,而plan9汇编语言最初来源于Go语言作者之一的Ken Thompson为plan9系统所写的C语言编译器输出的汇编伪代码。 我再给分享者和参与者提一些建议吧: 对于分享者,事先做好充足的准备,可以在文章里列出主要的点,放在github里,参考春晖大神的plan9汇编讲义;最重要的一点,分享前给大家提供一份预习资料。

    88721发布于 2019-04-25
  • 来自专栏火丁笔记

    从一个data race问题学到的

    /main.go SSA 工具最方便的地方是它可以把源代码和汇编通过颜色对应起来: main 函数的 ssa 说明:Golang 中的汇编一般指 Plan9 汇编,推荐阅读「plan9 assembly

    72820编辑于 2021-12-14
  • 来自专栏老高的技术博客

    golang预定义的系统名称

    Golang syslist Golang预定义的OS列表 aix android darwin dragonfly freebsd hurd js linux nacl netbsd openbsd plan9

    1.1K10编辑于 2022-12-28
  • 来自专栏人人都是架构师

    Go每日一库之185:SagooIOT(轻量级物联网平台)

    netbsd/386 netbsd/amd64 netbsd/arm netbsd/arm64 openbsd/386 openbsd/amd64 openbsd/arm openbsd/arm64 plan9 /386 plan9/amd64 plan9/arm solaris/amd64 windows/386 windows/amd64 windows/arm 设备接入协议 设备成功连网后,还需要采用特定协议与云平台进行数据交互

    1.1K10编辑于 2025-01-18
领券