自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 electron调用基于napi的addon踩坑

  最近写一个东西,界面基于electron,需要使用一些底层功能,所以将底层功能写成addon供electron调用。本人喜欢用vs开发,因为有些复杂的工程用node-gyp这种配置比较麻烦,所以研究了下vs写的addon。  首先确定electron的node版本:electron版本列表  然后确定该node使用的napi版本:node使用的napi版本  只要lib中napi的版本对...

2020-03-12 23:47:17 1631

原创 LLVM-Analysis-LoopInfo

  LLVM中对循环的识别是十分的简单。他是一种类似于Tarjan的可规约流图识别(《Testing flow graph reducibility》),不同的是LLVM是基于dom-tree的遍历,这有点像区域分析。因为这个原因,LoopInfo这个模块是没法找到不可规约结构的,因为不可规约循环的循环头不支配循环体。其实这点也可以理解,不可规约循环本来就少见,LLVM也不是什么高性能计算编译器。...

2019-07-27 10:31:48 1949 3

原创 LLVM-TransformUtils-Mem2Reg

  众所周知LLVM IR其实在clang的codegen后并不是strict-SSA结构,因为这时候局部变量表现为alloca指令,同时对局部变量通过load和store进行读写操作,这会导致局部变量可能会存在多个def(多个store指令),而SSA要求每个变量只能有一个def。这时LLVM会通过标准的SSA构造算法来将原始IR转换成minimal-SSA并最终转换成prune-SSA,这一切...

2019-07-25 06:57:56 2577

原创 支配关系以及流图中的循环(一)

  支配树这个结构在后端优化中有很重要的作用,尤其是SSA格式的程序中,高效的支配树生成尤其重要。  我们说对于一个图G=(V,E,entry),节点m支配节点n当且仅当从流图入口entry到n的所有路径都经过m,记做:m dom n。所有支配n的节点组成一个集合叫做支配集,记做dom(n)。所有节点均支配自己,即∀\forall∀n∈\in∈V,n dom n。如果存在节点x,y,z...

2019-04-04 13:53:06 3319 1

原创 wpcap过滤器后端代码解读

  wpcap是windows平台下著名的数据包嗅探库,在linux下叫libpcap,数据包嗅探软件wireshark就是用来这个库,其中实现了十分高效的数据包过滤算法。很久以前就想看一下他具体的过滤机制,不过那时候没看懂。这两天看到一篇文章提到了winpcap的中间码是SSA格式的,所以又提起兴趣看了一下,发现很多地方都已经能看懂了。(好像新下的源码比以前多了很多注释?很多源码可能维护者也没看...

2019-03-26 14:10:56 523

原创 llvm中的Tarjan强连通分量算法

  llvm中的强连通算法使用的也是Tarjan算法,与我自己实现的那种粗糙的算法不同,llvm使用栈代替递归实现dfs,一方面防止栈空间不足的问题,另一方面借助这个栈,可以记住当前遍历的状态,从而实现了强连通分量上的迭代器。总之实现的十分的优雅。  代码文件在include\llvm\ADT\SCCIterator.h中。  现在我们来看一下具体实现。  首先定义了两个静态成员函数begi...

2019-03-23 11:36:45 335

原创 流图中的强联通分量

在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。  网上关于强联通分量的理论与分析十分的多,这里不再赘...

2019-03-22 17:01:41 310

原创 对流图的遍历

  正常的图遍历有DFS和BFS,CFG作为图的一种自然也是如此,不过在CFG中,BFS的应用貌似并不多。1,深度优先生成树,树边,前向边,后向边,横边。  在DFS的过程中,按照如下规则标记图中的所有边:存在一条边从一个节点指向其后代,并且之前没有被标记过,则将该边标记为树边(tree edge)。存在一条边从一个节点指向其祖先或自身,将改边标记为后向边(back edge)。存在...

2019-03-22 10:51:56 511

原创 流图的分类与识别

源代码的结构在编译器中往往会在某个环节被转换成CFG,不同的控制语句会生成形形色色的控制流结构,而在后端转换的过程中又会生成许多前端语法无法描述的结构出来,在控制流分析的过程中需要去识别这些结构。这篇文章简单的介绍一些基本结构。1,基本块(basic block)。基本块是一个执行时连续的语句序列,往往最后会跟一个终结语句,比如跳转,条件跳转或者返回,除了最后一个语句外没有任何的分支或跳转命令。...

2019-03-21 12:37:43 852

原创 Win32下的非侵入式协程实现

关于协程和libco 本项目Github地址   协程实现异步其实就是用同步的业务逻辑代码,但内部却执行异步等待并进行调度,既保证的代码的可读性,又能实现异步的高并发。在Windows编程中,往往会有大量阻塞的IO操作,比如这段代码: CHAR buf[4096]; DWORD Size; LONG Offset = 0; SIZE_T CSize; ...

2018-04-15 20:54:06 360

原创 程序性能优化手段-实际代码案例1

  在前两篇中,分别介绍了通过数据分片和避免伪共享两种方法来增加程序性能。现在来看一个实际的代码案例。   在Windows内核中,有一些带CacheAware的函数,包括RundownProtection和PushLock系列的函数。顾名思义,这些函数是进行了Cache友好的优化,其中包括了对多核进行数据分片以及CacheLine大小对齐的内存块。   我们来看一下这些函数是如何工作的吧,这...

2018-03-30 07:34:21 1192

原创 程序性能优化手段-避免伪共享

  当分配数个变量或者定义数个全局变量时,这些不同用途的变量很可能会被分配到很近的地址空间上,会导致CPU在读取时,他们会处在同一个Cache line中。如果这时一个CPU上的线程在操作其中一个变量,而另一个CPU上的线程在读另一个变量,将导致读线程CPU不得不和写线程CPU进行一次缓存同步后才能将数据读取出来,这会导致增加缓存开销和总线开销,降低程序效率。这就是并发编程中常碰到的False s...

2018-03-28 21:47:24 652

原创 程序性能优化手段-共享数据的拆分

  很多情况下,多个线程需要对一块内存进行大量的写操作,肯定是需要同步机制的支持的。即使是简单的加减法也需要原子锁的同步支持,其他情况下可能还需要其他更重量级锁的支持。   除此之外,不同的CPU对同一块内存的写操作也会造成CPU之间的缓存同步,这会大大加重总线负担从而影响程序的效率。详细内容可以参考这篇   这种情况下,可以对这块共享内存进行拆分,既每一个CPU都维护自己的一块内存,这个内存...

2018-03-27 22:04:06 240

原创 ELAM驱动程序(优先启动反病毒驱动程序)

WDK中ELAM驱动示例 从MSDN中摘抄的关于这种驱动的简介。链接 简介  从Windows8起,微软为反病毒软件增加的新的驱动类型:Early-Lunch Anti-Malware驱动(ELAM驱动)。这种驱动启动的比其他boot类型的驱动更加早并且提供了回调向ELAM驱动通知正在被加载的普通boot型驱动,以让反病毒软件有机会在boot型驱动加载前检测并决定是否加载这些驱动。 ...

2018-02-18 21:32:41 2075

原创 Windows内核对象头部结构

在Windows中,内核对象由三部分组成,其中第一部分是由数个不确定的结构组成,第二部分就是结构头OBJECT_HEADER,第三部分则是对象体。后两部分容易确定,OBJECT_HEADER后48个字节就是对象体。第一部分则是完全隐藏起来的机制,而且Win7系统中OBJECT_HEADER里也没有了前面几个结构的偏移信息,所以需要具体研究一下这个字段的生成机制。 这个结构肯定是在ObCreateO

2017-09-19 11:53:00 1227

原创 Redis源码学习(2):事件循环

Redis中的事件循环是他的ae模块(advance eventloop?),这是个简单的事件循环模块,自身实现了事件循环框架和时间事件逻辑,而具体事件处理则根据不同的系统编译不同的模块。ae主要由这几个模块组成:ae.cae.hae_epoll.cae_evport.cae_kqueue.cae_select.c可以看出来,ae实现了epoll,evport,kqueue和selec

2017-07-25 10:29:35 462

原创 Redis源码学习(1):adlist

redis中的adlist是一个简单的无环双向链表,主要逻辑在这两个文件中实现:adlist.hadlist.c结构也很简单,数据结构中最基本的结构。 添加节点代码:if (after) { node->prev = old_node; node->next = old_node->next; if (list->tail == old_node) {

2017-07-24 20:43:37 275

原创 IA32e下分页的开启:概述

内存分布 IA32e下的地址用64位来表示,但CPU只使用了其中的前52位,即4PB的最大物理内存寻址空间,而开启分页后,CPU只使用其中48位,即256TB的最大虚拟内存寻址空间,而到了Windows,则更是只使用了其中44位,即只用16TB的虚拟内存寻址空间,其中0000000000000000-000007FFFFFFFFFF是用户层地址空间,而FFFFF80000000000-FFFFF

2016-11-20 22:07:48 1769

原创 EDK2编译与OVMF编译

新版EDK修正了许多bug并且已经支持VS2015,这里就是在VS2015的环境下操作的。 首先下载EDK2 EDK2官方下载 这里下载的EDK2一开始式没有Win32编译环境的,需要自己编译: 打开CMD,定位到EDK2的BaseTools下,输入get_vsvars,执行完后输入vsvars32执行,这两部主要是配置VS编译环境。 除此之外要想编译还需要安装PYTHON27以及cx_F

2016-10-13 13:54:44 7311 1

原创 UEFI下Windows引导过程

引导文件 在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是,BIOS下引导文件是winload.exe,UEFI下引导文件式winload.efi,两者都是pecoff格式的,但UEFI用的是各种固件接口,而BIOS使用的是中断。有时还会有一个MSR分区,不过这

2016-10-13 13:25:32 25366 1

原创 基于Protobuf和Libuv实现RPC

公司要把产品转架构,虽然和我们驱动开发没什么关系,但还是抱着看热闹的心态研究了下和架构相关的一些问题。这阶段主要研究了下RPC这个东西。 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络

2016-08-23 17:03:11 3728

原创 PE文件操作-简单的加壳实现

处于一些原因,需要对PE文件进行加壳。所谓加壳就是有某种编码算法对原始文件数据进行编码,并使原始文件内容成为数据部分,而嵌进文件的解密代码成为主体。在loader加载加壳文件后,会将控制权交给解码程序,解码程序在完成解码后,再把控制权交给原始代码。 这个加壳程序是学习之用,所以只实现了最简单的可逆变换-异或运算。对文件操作用了内存映射文件,所以直接操作内存即可。 先说一下思路:对原始PE文件编码

2016-08-14 16:34:54 3635

原创 PE文件操作-动态加载

有时会有这样的需求,要把一个dll加载到进程空间或者对付地址空间随机化技术,这就需要自己实现一个PELoader。在PE文件中,许多数据在内存中的位置已经以RVA的形式在链接时给出,我们只需要根据节表的描述准确的按位置加载,大部分程序就可以正确运行了,但有几个类型的数据还是需要loader来调整的:IAT 在PE文件中,调用静态链接的DLL例程一般都是以call ds:[xxxxxxxxh]的

2016-08-14 12:34:18 1795

原创 PE文件操作-末尾添加节

有时候为了某些原因,需要在PE末尾添加节,比如加壳,补丁等等,需要对PE文件进行扩展。 在末尾添加节是最简单的方式,只需要做如下修改:修改FILE_HEADER中的节数目字段修改OPTIONAL_HEADER中映像大小字段在节描述符数组中添加新描述符在文件末尾添加新节数据首先找到文件最后一个节并计算出PE范围内的文件结尾,这里的末尾是指PE描述范围内的文件结尾,即最后一个节的结束:

2016-08-08 20:30:55 3188 1

原创 64位下的相对指令地址

寻找64位系统某符号特征码时发现他的MOV指令用的是相对地址,之前32位下从来没听说MOV还能用相对地址,故查阅了下Intel指令手册。 在MOV指令介绍下找到如下介绍: In 64-bit mode, the instruction’s default operation size is 32 bits. Use of the REX.R prefix permits access to a

2016-07-17 08:27:46 2315 2

原创 VC++并行编程学习(一)

并行模式库 (PPL) 提供命令式编程模型,以促进开发并发应用程序的可扩展性和易用性。 PPL 构建在并发运行时的计划和资源管理组件上。 通过提供并行作用于数据的泛型安全算法和容器,提高应用程序代码与基础线程机制之间的抽象级别。 使用 PPL 还可以开发通过为共享状态提供替代方案实现缩放的应用程序。 PPL 提供以下功能: 任务并行:基于 Windows 线程池来并行执行多个工作项

2016-07-16 15:25:56 3120

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除