ASM

如何在C或C++代码中嵌入ARM汇编代码

大兔子大兔子 提交于 2020-08-13 20:36:37
转载自: http://blog.csdn.net/roland_sun/article/details/42921131 大家知道,用C或者C++等高级语言编写的程序,会被编译器编译成最终的机器指令。这中间,编译器会对代码自动进行优化。但是,这种优化往往不一定非常高效。 所以,出于性能优化的目的,对非常关键的代码,任然需要直接用汇编指令编写。 并且在C和C++中,是无法直接对寄存器进行操作的,如果要实现的功能需要频繁与底层硬件打交道,也需要用汇编指令编写。 GCC编译器支持直接在C或者C++代码中,嵌入ARM汇编代码。其基本格式非常简单,大致如下: [cpp] view plain copy __asm__ [__volatile__] ( assembler template : [output operand list] /* optional */ : [input operand list] /* optional */ : [clobbered register list] /* optional */ ); 首先是关键字“__asm__”,其实也可以写成“asm”。但是“asm”并不是所有版本的GCC编译器都支持的,而且有可能和程序中别的地方定义的变量或函数名冲突,所以用“__asm__”的话,兼容性会好一点。 下面是“__volatile__”关键字,这个是可选的

Istio 网关之南北向流量管理

天涯浪子 提交于 2020-08-13 12:39:49
作者 | 王夕宁 阿里巴巴高级技术专家 参与阿里巴巴云原生公众号文末留言互动,有机会获得赠书福利! 本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书,文章介绍将集群外部的客户端连接到集群内运行的服务,以及如何从集群内的服务访问集群外部的任何服务,即通常所说的南北向流量管理。其中介绍了 Istio 在南北向流量方面的路由控制能力,引出 Istio 网关的概念及其工作原理。 本文文末汇集并整理了近期 Istio 的相关问题并特邀王夕宁老师进行解答,希望能够对大家有所帮助~ Istio 网关 网络社区中有一个术语 Ingress,是指入口请求到集群内服务的流量管理。Ingress 指的是源自本地网络之外的流量,指向本地集群网络中的端点。此流量首先路由到公开的入口点,以便通过执行一些本地网络的规则和策略来确认哪些流量被允许进入。如果流量未通过这些入口点,则无法与集群内的任何服务连接。如果入口点允许流量进入,则将其代理到本地网络中的合适节点。Istio 对入口流量的管理是由 Istio 网关进行的。 Istio 网关的工作原理 传统上,Kubernetes 使用 Ingress 控制器来处理从外部进入集群的流量。使用 Istio 时,情况不再如此。Istio 网关用新的 Gateway 资源和 VirtualServices 资源来控制入口流量

基于阿里云服务网格的 GRPC 服务部署实践

雨燕双飞 提交于 2020-08-13 06:59:32
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 继MicroServices之后,ServiceMesh是又一个推动软件工业的革命性技术。其服务治理的方法论,不仅改变了技术实现的方式,也将深入影响社会分工。 运行于数据平面的用户服务与治理服务的各种规则彻底解耦。运行于控制平面的规则定义组件,将流量控制的具体规则推送给运行于数据平面的proxy,proxy通过对用户服务的ingress和egress的实际控制,最终实现服务治理。 原本需要服务开发者编程实现的服务发现、容错、灰度、流量复制等能力,被ServiceMesh非侵入的方式实现。此外,ServiceMesh还提供了访问控制、认证授权等功能,进一步减轻了用户服务的开发成本。 阿里云提供的服务网格是基于容器服务之上的托管版ServiceMesh,在提供完整的ServiceMesh能力的同时(ASM还在底层横向拉通了阿里云云原生的各种能力,不在本篇讲述范围),免去了用户搭建和运维ServiceMesh平台istio的繁琐工作。本篇将分享如何将我们自己的GRPC服务,托管到阿里云的服务网格中。 1. grpc服务 grpc协议相比http而言,既具备http跨操作系统和编程语言的好处,又提供了基于流的通信优势。而且,grpc逐渐成为工业界的标准

asm 数组的双向传递

試著忘記壹切 提交于 2020-08-13 03:28:40
asm目前测试中比js大概能快 1.2 - 1.5倍左右 c/c++ 能快1.7 - 2.3 倍左右 asm的最大优势还是书写可以使用类似ts的语法, 比go和c系更加方便, 学习和改造已有工具的成本不大 但是性能还是问题, 这点性能并不足以有动力去做改造.... 还是有点慢.......且配套设施和工具就远不如go和c了 index.ts // The entry file of your WebAssembly module. /** Creates a new array and returns it to JavaScript. */ export function createArray(length: i32): Int32Array { return new Int32Array(length); } /** Randomizes the specified array's values. */ export function randomizeArray(arr: Int32Array): void { for (let i = 0, k = arr.length; i < k; ++i) { let value = i32((Math.random() * 2.0 - 1.0) * i32.MAX_VALUE); unchecked((arr[i] = value

优化屏障和内存屏障

萝らか妹 提交于 2020-08-12 18:33:58
转自: http://blog.chinaunix.net/u3/93713/showart_2061476.html 优化屏障和内存屏障 优化屏障 编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行。然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器的重排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。 Linux用宏barrier实现优化屏障,gcc编译器的优化屏障宏定义列出如下(在include/linux/compiler-gcc.h中): #define barrier() __asm__ __volatile__("": : :"memory") 上述定义中,“__asm__”表示插入了汇编语言程序,“__volatile__”表示阻止编译器对该值进行优化,确保变量使用了用户定义的精确地址,而不是装有同一信息的一些别名。“memory”表示指令修改了内存单元。 内存屏障 软件可通过读写屏障强制内存访问次序。读写屏障像一堵墙,所有在设置读写屏障之前发起的内存访问,必须先于在设置屏障之后发起的内存访问之前完成,确保内存访问按程序的顺序完成。 读写屏障通过处理器构架的特殊指令mfence(内存屏障)、lfence(读屏障)和sfence(写屏障)完成,见《x86

通过字节码分析Java中自动装箱和拆箱是如何实现的

↘锁芯ラ 提交于 2020-08-12 16:37:59
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用。 这里的primitive type就是Java里面的基本类型,所有的基本类型都有一个与之对应的类。例如,Integer类对应基本类型int。 通常,这些类称为包装器(wrapper)。这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean(前6个类派生于公共的超类Number)。 对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器类还是final,因此不能定义它们的子类。 自动装箱是指通过类型转换(隐式或显式)从值类型中获取引用类型,这部分工作是编译器帮我们来完成的。 我们看一个常见的例子,比如我们创建一个int类型的ArrayList(因为ArrayList的泛型是不允许基本类型的,这里只能使用它们包装类),我们给ArrayList添加元素,再从里面获取元素,一般是这么写的: // int类型的自动装箱和拆箱 ArrayList<Integer>

如何对AD和Exchange进行安全加固满足护网需要?

扶醉桌前 提交于 2020-08-12 11:28:15
自2017年WannaCry病毒席卷全球之后,持续演变,挖矿及勒索病毒数量两年暴涨1500%,现已成为网络安全的最大威胁,而勒索金额也从以往的以万为单位飙升到百万美元级别。 AD域由于存在着大量的特权账号、应用服务账号、用户账号,是******最多的对象之一。 Exchange邮件系统作为日常办公所需,存放有大量办公及业务邮件数据,容易被***并泄露邮件数据,或者受钓鱼邮件影响导致信息安全事件,是被******勒索最多的对象之一。 在国家级的护网行动(红蓝***演练)中,AD域如果被***成功,是扣分最多的一项内容之一。 …… 本文将着重介绍嘉为公司基于AD(Active Directory)纵深防御体系建立的“工具+安全加固服务”的AD域安全加固模式,通过建立安全检测平台,并从AD应用安全、操作系统安全、网络访问安全等方面,全面提升AD域环境的整体安全性能。另外同样基于纵深防御体系建立的 Exchange方案,提升了企业邮件系统(Exchange)的安全性。 企业信息安全体系构成 企业信息整体安全体系由6大部分构成,分别是: 基础架构安全(ISP) 身份和访问控制管理(IAM) 信息安全管理体系(ISMS) 安全运维管理平台(SMP) 数据和文件安全管理(DSM) 应用安全管理(ASM) 这6个部分构成了完整的企业安全信息体系,可以说一切的安全加固服务都应成为此体系的一个部分。

代理模式

旧巷老猫 提交于 2020-08-12 06:45:12
一 代理模式简介 代理(Proxy)是一种设计模式 提供了对目标对象另外的访问方式 代理对象代理目标对象 达到增强目标对象功能的目的 二 静态代理 需要定义接口或者父类 代理对象与目标对象一起实现相同接口或者继承相同父类 优点: 在不修改目标对象的功能前提下 对目标功能扩展 缺点: 因为代理对象需要与目标对象一起实现相同接口或者继承相同父类 所以会有很多代理类 导致类太多 同时 如果接口增加方法 代理对象与目标对象都要维护 1. 接口 /** * 接口 * Created by Hy on 2020/7/10. */ public interface IUserService { void insertUser(); String deleteUser( int id); } 2. 目标对象 /** * 目标对象 * Created by Hy on 2020/7/10. */ public class UserService implements IUserService { @Override public void insertUser() { System.out.println( "insert ok" ); } @Override public String deleteUser( int id) { System.out.println( "delete... ...

CGLIB动态代理机制,各个方面都有写到

孤街醉人 提交于 2020-08-12 03:14:57
CGLIB库介绍 代理提供了一个可扩展的机制来控制被代理对象的访问,其实说白了就是在对象访问的时候加了一层封装。JDK从1.3版本起就提供了一个动态代理,它使用起来非常简单,但是有个明显的缺点:需要目标对象实现一个或多个接口。假如你想代理没有接口的类呢?可以使用CGLIB库。 CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和dynaop)提供方法拦截。Hibernate作为最流行的ORM工具也同样使用CGLIB库来代理单端关联(集合懒加载除外,它使用另外一种机制)。EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。 在实现内部,CGLIB库使用了ASM这一个轻量但高性能的字节码操作框架来转化字节码,产生新类。除了CGLIB,像Groovy和BeanShell这样的脚本语言同样使用ASM来生成Java字节码。ASM使用了一个类似于SAX分析器的机制来达到高性能。我们不建议直接使用ASM,因为这样需要对JVM非常了解,包括类文件格式和指令集。 上图展示了CGLIB库相关框架以及语言之间的关系。另外提醒下,类似于Spring AOP和Hibernate这些框架它们经常同时使用CGLIB和JDK动态代理来满足各自需要

Java openrasp学习记录(一)

早过忘川 提交于 2020-08-11 20:04:57
前言 最近一直在做学校实验室安排的项目,太惨了,没多少时间学习新知识,不过rasp还是要挤挤时间学的,先从小例子的分析开始,了解rasp的基本设计思路,后面详细阅读openrasp的源码进行学习!欢迎在学习相关知识的师傅找我交流!如本文有所错误请指出~ 例子1 https://github.com/anbai-inc/javaweb-expression 一个hook ognl、spel、MVEL表达式注入的例子 用的是asm5进行字节码修改 采用premain进行插桩,重写transform方法 expClassList是要hook的类,这里定义在MethodHookDesc 这里判断hook点通过类名,具体其中的方法名,以及方法的描述符 其中expClassList中定义了具体要hook的类,就mvel、ognl、spel三种 匹配到以上三种类后即重写visitMethod方法,匹配具体要hook的方法名和方法描述符,如果匹配到了,则重写MethodVisitor的visitCode方法,进行字节码修改,这里因为是表达式注入,因此这里涉及到string类型的表达式,因此获取传到hook函数处的表达式字符串压入操作数栈,并通过调用expression方法弹出该值进行检测, 这里要涉及到操作数栈和局部变量表,因此要清楚原本的方法帧中局部变量表下标索引几代表的是输入的表达式: