Golang入门指南


  • 首页

  • todo

  • 思考

  • life

  • food

  • OS

  • lua

  • redis

  • Golang

  • C

  • TCP/IP

  • ebpf

  • p4

  • OpenVPN

  • IPSec

  • L2TP

  • DNS

  • distributed

  • web

  • OpenWRT

  • 运维

  • Git

  • 鸟哥的私房菜

  • IT杂谈

  • 投资

  • About Me

  • 友情链接

  • FTP

  • 搜索
close

Wasm介绍之5:控制指令

时间: 2021-10-29   |   分类: wasm     |   阅读: 2760 字 ~6分钟

原文链接

img

# Wasm介绍之5:控制指令

[WebAssembly]https%3A%2F%2Fwebassembly.org%2F)(简称Wasm)控制指令一共有11条,其中unreachable指令(操作码0x00)和nop指令(操作码0x01)比较简单,不介绍。call指令(操作码0x10)已经在上一篇文章里介绍,call_indirect指令(操作码0x11)将在下一篇文章里介绍。本文重点讨论block(操作码0x02)、loop(操作码0x03)、if(操作码0x04)、br(操作码0x0C)、br_if(操作码0x0D)、br_table(操作码0x0E)和return(操作码0x0F)这7条指令。

阅读全文 »

Wasm介绍之4:函数调用

时间: 2021-10-29   |   分类: wasm     |   阅读: 1828 字 ~4分钟

原文链接

img

上一篇文章介绍了WebAssembly(简称Wasm)内存和相关指令,这篇文章将介绍变量指令和函数调用指令。

全局变量

Wasm模块可以定义或者导入全局变量。导入时,可以限定全局变量的类型和可修改性(mutability)。定义时,除了限定类型和可修改性还可以给定初始值。下面是一个WAT例子,展示了全局变量的导入和定义:

(module
  (import "env" "g1" (global $g1 i32))       ;; immutable
  (import "env" "g2" (global $g2 (mut f32))) ;; mutable

  (global $g3 (mut i32) (i32.const 123)) ;; mutable
  (global $g4 (mut i64) (i64.const 456)) ;; mutable
  (global $g5 f32 (f32.const 1.5))       ;; immutable
  (global $g6 f64 (f64.const 2.5))       ;; immutable

  (func $main
    ;; $g3 = $g1
    (global.get $g1)
    (global.set $g3)
  )
)
复制代码

变量指令一共5条,其中2条用来读写全局变量,下面分别介绍。

阅读全文 »

Wasm介绍之3:内存

时间: 2021-10-29   |   分类: wasm     |   阅读: 1923 字 ~4分钟

原文链接

1.jpg

上一篇文章介绍了WebAssembly(简称Wasm)指令集以及指令的操作码(Opcode)、立即数(Immediate Arguments)、操作数(Operands)、操作数栈(Operand Stack,简称栈)等概念,并且详细介绍了参数指令和数值指令。这篇文章将介绍Wasm内存和相关指令。

阅读全文 »

Wasm介绍之2:指令集和栈

时间: 2021-10-29   |   分类: wasm     |   阅读: 2990 字 ~6分钟

原文链接

上一篇文章介绍了WebAssembly(后文简称Wasm)二进制格式,这一篇文章将介绍Wasm指令集、操作数栈和部分指令。

Wasm指令集

和真实的机器码一样,Wasm二进制文件中的代码也由一条一条的指令构成。同样,Wasm指令也包含两部分信息:操作码(Opcode)和操作数 (Operands)。Wasm操作码固定为一个字节,因此最多能表示256条指令,这一点和Java字节码一样。Wasm1.0规范一共定义了172条指令,这些指令按功能可以分为5大类,分别是:

  • 控制指令(Control Instructions),共13条。
  • 参数指令(Parametric Instructions),共2条。
  • 变量指令(Variable Instructions),共5条。
  • 内存指令(Memory Instructions),共25条。
  • 数值指令(Numeric Instructions),共127条。

可以看到,已经定义的指令中,有超过2/3属于数值指令。为了方便人类书写和理解,Wasm规范给也给每个操作码定义了助记符(Mnemonic),比如说操作码0x41的助记符是i32.const。下面是已定义指令的操作码分布示意图:

阅读全文 »

Wasm介绍之1:二进制格式

时间: 2021-10-29   |   分类: wasm     |   阅读: 5320 字 ~11分钟

原文链接

关于WebAssembly(下文简称Wasm)的介绍已经有很多了,本文不打算再多啰嗦。本文介绍的重点是Wasm二进制格式,我们会把一个最简单的Rust程序(没错,就是Hello,World!程序)编译成Wasm二进制格式,然后以Go伪代码结合xxd命令的形式来剖析Wasm二进制格式 。下面是这个Rust程序的完整代码(如果不了解如何将Rust编译成Wasm,请看这篇文章):

#![no_std]
#![no_main]

extern "C" {
    fn print_str(ptr: *const u8, len: usize);
}

#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
    loop {}
}

#[no_mangle]
pub extern "C" fn main() {
    unsafe {
        let s = "Hello, World!\n";
        print_str(s.as_ptr(), s.len());
    }
}

Module

Wasm的顶层结构是模块(Module),每一个Wasm二进制文件对应一个模块。模块以4字节魔数开始,接着是4字节版本号,其余是模块的数据。具体的模块数据被分门别类的放在不同的段(Section)中,每个段都由唯一的段ID来标识。除了自定义段(后文会介绍)以外,其他所有的段都最多只能出现一次,且必须按照段ID递增的顺序出现。下面的伪代码(采用Go语言语法,下同)给出了模块的整体结构:

阅读全文 »

FFI

时间: 2021-10-28   |   分类: nginx     |   阅读: 4133 字 ~9分钟

原文链接

FFI 库,是 LuaJIT 中最重要的一个扩展库。它允许从纯 Lua 代码调用外部 C 函数,使用 C 数据结构。有了它,就不用再像 Lua 标准 math 库一样,编写 Lua 扩展库。把开发者从开发 Lua 扩展 C 库(语言/功能绑定库)的繁重工作中释放出来。学习完本小节对开发纯 ffi 的库是有帮助的,像 lru-resty-lrucache 中的 pureffi.lua,这个纯 ffi 库非常高效地完成了 lru 缓存策略。

阅读全文 »

linux ucontext族函数的原理及使用

时间: 2021-10-28   |   分类: c     |   阅读: 3415 字 ~7分钟

原文链接

ucontext函数族

这里的context族是偏向底层的,其实底层就是通过汇编来实现的,但是我们使用的时候就和平常使用变量和函数一样使用就行,因为大佬们已经将它们封装成C库里了的

阅读全文 »

WebAssembly完全入门了解wasm的前世今身

时间: 2021-10-20   |   分类: wasm     |   阅读: 4952 字 ~10分钟

首发于SH的全栈笔记

前言

接触WebAssembly之后,在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成功,要么就是不知所云、一脸蒙蔽。本着业务催生技术的态度,这边文章就诞生了。前部分主要是对WebAssembly的背景做一些介绍,WebAssembly是怎么出现的,优势在哪儿。如果想直接开始撸代码试试效果,可以直接跳到最后一个板块。

阅读全文 »
40 41 42 43 44 45 46 47 48

日志
分类
标签
RSS 订阅
GitHub
© 2009 - 2025
粤ICP备2021068940号-1 粤公网安备44011302003059
0%