自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Ninja安装和基本使用

Ninja是一个比Make更快速的小型构建系统。其github地址为:https://ninja-build.org/Ninja源码安装构造Ninja可使用CMake或python,在此以python为例:安装re2c。下载地址:http://re2c.org/install/install.html tar -xvzf re2c-1.0.3.tar.gz cd re2c-1.0.3...

2020-04-06 14:10:16 46196 5

原创 编译优化之 - 向量化优化入门

1. 介绍2. Intel高级向量扩展3. GCC中向量化4. ICC中向量化5. AOCC/LLVM中向量化 1. 介绍什么是自动向量化?  自动向量化(automatic vectorization)是自动并行化(automatic parallelization)的一种特殊情况,它将一次处理一对的标量运算转换为一次并行处理多对的向量运算。因此向量化可以显着加速一些带循环的...

2020-03-30 16:52:25 13452 1

原创 解决virtualbox虚拟机中kali linux无法使用wlan0

在Windows10系统上安装的virtualbox虚拟机,在虚拟机中安装的Kali Linux系统看不到无线网卡信息在虚拟机设置中,选择“网络”,使用“NAT”,并选择你的网卡下载 compat-wireless。下载地址为:https://mirror2.openwrt.org/sources/解压安装tar -xjvf compat-wireless-2010-06-28.t...

2020-03-14 15:22:45 11556 11

原创 编译优化之 - 链接时优化(LTO)入门

1. 关于 LTO -flto ThinLTOLTO(Link Time Optimization)链接时优化是链接期间的程序优化,多个中间文件通过链接器合并在一起,并将它们组合为一个程序,缩减代码体积,因此链接时优化是对整个程序的分析和跨模块的优化。flto是使用lto的主要方法,是一个优化选项,禁用lto使用-fno-lto。ThinLTO是一种可扩展和增量式的新型LTO,与LTO相比...

2019-12-24 13:42:14 32424 4

原创 SPEC CPU简介和使用

前言SPEC CPU是一套行业标准的CPU密集型基准测试套件。SPEC设计了此套件,以使用实际用户应用程序开发的工作负载,在最广泛的实际硬件范围内提供计算密集型性能的比较度量。这些基准作为源代码提供,要求用户习惯使用编译器命令以及通过控制台或命令提示窗口通过命令解释器使用的其他命令,以便生成可执行二进制文件。SPEC CPU2006和SPEC CPU2017说明SPEC CPU2006...

2019-12-18 17:27:00 32509 14

原创 llvm向用户抛出warning、error信息

使用DiagnosticInfoUnsupported可以向用户抛出error信息并且终止程序,效果如同report_fatal_error、Error。

2023-07-27 15:52:21 1016

原创 QEMU安装及测试

QEMU READMEQEMU is a generic and open source machine & userspace emulator and virtualizer.QEMU官网链接:https://www.qemu.org/ ,GitHub地址:https://github.com/qemu/qemuInstall QEMUTo download and build QEMU 6.1.0:wget https://download.qemu.org/qemu-6.1.0

2021-09-02 15:05:28 8158

原创 GCC - structure/union前端解析说明

  以GCC8.2.0版本为例,介绍gcc语法解析器(parser)对声明即函数定义的解析过程以及structure/union的简单解析说明。1. GCC中声明和定义的解析过程1.1 解析入口 c_parse_file  GCC中gcc/c/c-parser.c文件主要负责解析GNU C的完整语法。其中单个源码文件的解析入口在void c_parse_file (void)函数中,函数代码如下:  先对c_parser struct进行初始化,再判断其pragma_kind。代码中的c_pars

2020-11-14 17:20:33 1004

原创 LLVM - 学习笔记一

1. 工具和库LLVM中的独立工具:opt:在IR级对程序进行优化的工具,输入必须是LLVM的bitcode,生成的输出文件必须具有相同的类型。llc:通过特定后端将LLVM bitcode转换成目标汇编或目标问价的工具。llvm-mc:能够汇编指令并生成像ELF、MachO、PE等对象格式的目标文件,也可以反汇编相同的对象,从而转存这些指令的相应汇编信息和内部LLVM机器指令数据结构。lli:LLVM IP的解释器和JIT编译器。llvm-link:将几个LLVM bitcode链接在一起,

2020-11-11 16:51:10 4106

原创 LLVM9.0编写Hello pass

最近动手尝试了一下,在安装完成LLVM9.0之后,新建一个FunctionPass。以下是参考他人文档和自己实现的过程。1. 新建或修改Hello.cpp在/home/zgl/llvm-project-9.0.0/llvm/lib/Transforms/Hello目录下新建或修改Hello.cpp,代码如下:#include "llvm/ADT/Statistic.h"#include "llvm/IR/Function.h"#include "llvm/Pass.h"#include "llv

2020-10-30 16:45:45 663

原创 GCC前端处理阶段添加开关选项

1. 选项文件  GCC中的各种选项说明都是保存在以.opt为后缀的文件里,通用选项和其内部标记信息保存在gcc/common.opt中,前端相关的选项和一些警告类型选项保存在gcc/c-family/c.opt中。在.opt选项列表中,每个选项单独占用一行,注释由分号(;)开头,对空格没有严格要求。例如:2. 选项定义选项名字通常以“f”、“m”或“W”开头选项与选项之间空行分隔,选项区分大小写,且单词之间“-”连接(例如:fdefault-inline)一般以“f”、“m”开头的选项都有一

2020-10-19 20:07:35 432

原创 编译优化之 - 通用循环优化

前言  循环是程序中最常见结构,针对循环已有众多的优化技术。循环的优化分为源码上的修改和编译器的优化,编译器能自动执行许多循环优化技术,但对源代码的修改可辅助编译器就行优化处理。1. 源码上的优化1. 多重循环的“外小内大”  在多重循环中,采用迭代次数较小的循环驱动内层迭代次数较大的循环能减少内存的消耗,如下示例:for (int i = 0; i < 10000; i++) { for (int j = 0; j < 200; j++) { }}改为:for

2020-09-11 21:58:13 5211 2

原创 C++根据输入的字符串输出所有成对和三元组组合出现的频数

C++字符串的使用示例:  输入一个不区分大小写的字符串,输出所有成对和 三元组出现的组合的频数。实现代码如下:#include <iostream>#include <string>#include <map>using namespace std;string substr(const string &src, int start, int end){ string result = ""; int len = src.le

2020-08-30 11:41:55 365

原创 C/C++中使用正则表达式判断输入是否为16进制

  识别16进制的内容使用的表达式为:0[xX][[0-9a-fA-F]]+,识别10进制的内容使用的表达式为:"^[0-9]*$"。  在C++中使用正则表达式需要引入#include <regex>头文件,模式匹配使用regex_match函数。C++ 11中function template std::regex_match:C-strings (1)template <class charT, class traits> bool regex_match (co

2020-08-30 00:15:05 6894

原创 常用string.h函数实现整理

memset 、 memcpy 、 memmove 、 strcpy、 strlen 方法的实现整理。在<string.h>头文件中声明的内存管理函数原型如下:void *memcpy (void *, const void *, size_t);:从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,参数分别为:(void *dest, void *src, size_t n),将src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。void *m

2020-08-28 13:17:45 428

原创 位运算符说明和示例

0. 位运算操作符共有以下几种:& : 位与,都为1时,结果为1;否则为0。 (例:5 & 3 => 0101 & 0011 = 0001)| : 位或,都为0时,结果为0;否则为1。 (例:5 | 3 => 0101 | 0011 = 0111)^ : 异或,相同为0,不同为1。 (例:5 ^ 3 => 0101 ^ 0011 = 0110)~ : 取反,二进制数按位取反,即将0变1,1变0。<< : 左移,左移几位表示该数据乘以2的几次

2020-06-28 00:07:38 479

原创 GCC - 无效代码删除优化

前言  无效代码删除(DCE)是一种广泛使用的编译优化技术,它的目的是删除程序中不会影响程序运行的代码和变量,减少代码体积,更好地促使其它相关优化的进行,以提高程序效率,特别是在一些对资源受限的嵌入式设备上,使用无效代码删除操作来减少代码体积是非常重要的。数据流分析技术的发展,许多传统优化问题有了成熟的解决方案,无效代码删除优化也越发高效稳定。对于以下示例:#include<stdio.h>void func();void a() { int i = 0; for

2020-06-25 21:07:28 2587

原创 GCC添加开关选项控制新建的gimple pass

前言  GCC中包含了从-O0到-O3以及-Og,-Os和-Ofast各种级别的优化,并提供了上百多个可独立控制的优化标志。每个优化级别都启用了优化标志的子集,并在启用调试信息生成对可执行代码没有任何影响。但是确定何时运行pass是一个复杂的过程,每一个pass都有一个门函数(gate function), 它根据优化级别和标志来决定是否运行该pass。  GCC中如何添加一个优化pass的操作,可以参考《GCC - GIMPLE IR 学习一》。如何通过优化选项控制我新添加的优化pass?在回答这个问

2020-06-23 15:31:53 1311

原创 汇编学习 - 汇编分类和mov、call指令

汇编分类  汇编语言种类大致可以分为:8086汇编(16bit)、x86汇编(32bit)、x64汇编(64bit)以及嵌入式汇编等。根据书写格式的不同可将汇编分为:Intel汇编和AT&T汇编。GCC编译器中默认使用的是AT&T汇编,两种格式的差异如下:寻址方式的差异如下:寄存器  寄存器是cpu中的数据存储区域,cpu会先将内存中的数据存储到寄存器,再对寄存器中的数据进行运算。不同种类的汇编码中,寄存器也是不一样的,以最常用的几个通用寄存器为例:在64 bit汇编下的rax、

2020-06-03 19:51:40 4692

原创 SourceTree+git结合gitee实现代码管理

  为方便代码托管和协同开发,往往使用到Git,SVN等工具。在Windows和macOS上可使用git配合SourceTree来对Github或Gitee的远端代码进行管理。1.安装工具先安装git,下载地址为:https://git-scm.com/downloads。下载安装SourceTree,地址为:https://www.sourcetreeapp.com。  git安装只需要一直点击下一步安装完成就行,SourceTree安装时需要连接服务器登录账号,可以创建一个新账号或者使用已有

2020-05-27 12:25:28 5104

原创 struct的内存对齐

  结构体字节对齐能减少内存占用,提高内存访问效率。不论在x86或ARM处理器上C的每种类型存储都会要求内存对齐,除char以外。结构体中不能包含结构体本身,但可以包含指针。由于平台原因对齐大小不同,可能同一个结构体得到的大小会不同,但一般的对齐规则如下:chars可以从任何字节地址开始,2字节shorts必须从偶数地址开始,4字节的ints或floats必须从被4整除的地址开始,而8字节的l...

2020-05-02 17:11:53 708

原创 AMD AOCC安装

AOCC是AMD的一款商用编译器,也称为AMD Optimizing C/C++ Compiler,官网地址为:https://developer.amd.com/amd-aocc/ 。目前的最新版是AOCC 2.1版本,它基于LLVM 9.0版本,它针对AMD系列17h处理器进行了调整;对部分AMD的机型进行了优化;优化了AMD LibM等库;LLVM链接器(lld)作为默认链接器,不再需要G...

2020-05-01 20:44:40 4540 1

原创 LLVM 9.0 Clang、Flang及工具的详细安装过程

  LLVM 10.0.0是当前的最新版,从2020/3/24开始提供下载,在此记录的是LLVM 9.0.0版本的安装,其发布时间是2019/9/19,前端clang版本是9.0.0。由于安装的时候属于最新版本,前端只能安装Clang,为了安装Flang前端,遇到太多的问题,踩了太多的坑,以至于当时我们两个人搞了好几天才安装上,在此记录一下安装过程和注意事项,并且感谢当时和我一起安装软件的师兄!...

2020-04-28 00:36:15 5900 3

原创 GCC - GIMPLE IR学习之pass

  源码经过GCC前端的词法/语法、语义分析之后,生成AST/GENERIC,再转换为前端语言无关的中间表示GIMPLE,之后GCC再对GIMPLE进行GIMPLE低级化、构建cfg等一系列处理,这一系列操作称为GCC Pass(处理过程)。每个pass完成一种处理,其输出结果作为下一个pass的输入。在此以gcc-8.2.0的源码为例说明。GCC中所有的pass组织在passes.def链表中...

2020-04-26 00:36:02 1748

原创 编译优化之 - 预取优化入门

前言  预取是在处理器实际需要之前,将指令或数据从较慢的内存中提取到较快的cache中,来最大程度地减少cache未命中的延迟。预取器通常能预测下一个使用的缓存行,将他们载入缓存,但是也容易出错导致缓存污染,并给内存子系统带来额外的压力。在高性能处理器中,处理高速缓存未命中或延迟以及正确管理内存带宽,预取是比较有用的方法。在分布式共享内存(DSM)系统中,远程内存访问比本地访问花费更长的时间,因...

2020-04-25 13:49:12 4966 2

原创 使GCC变得可调试

默认安装的GCC使用的是-O2 -g,在对GCC进行调试的时候很多变量已经被优化掉了,跟踪不了。如下所示:(gdb) p *namevalue has been optimized out为了使GCC变得可调试,需要做以下修改:进入编译GCC的目录,即执行../configure CFLAGS="-g3 -gdwarf-2 -O0" CXXFLAGS="-g3 -gdwarf-2 -...

2020-04-24 12:24:03 961

原创 jemalloc安装和使用

前言  jemalloc是一个内存分配器,最开始出现在FreeBSD上的libc中,FreeBSD最早使用phkmalloc,但它不是在多处理器系统且支持多线程的情况下设计的,为了解决多处理器系统和多线程应用程序的可扩展性瓶颈,由此诞生jemalloc,它是Jason Evans 2005年进行开发的,因此叫"je"。在2007年的时候为了改善Firefox在3.0版中的内存使用情况,使用jem...

2020-04-13 16:21:24 23127 2

原创 GCC - 添加ipa pass

关于ipa的介绍和基本使用,在之前的博客中:编译优化之 - 过程间优化(IPA/IPO)入门。这里主要是记录一下gcc-8.2.0版本中新建一个ipa pass的过程。进入gcc-8.2.0/gcc目录,新建ipa-test.c文件。代码可参考ipa-*.c那些pass中的过程进行修改,在此参考ipa-hsa.c文件,其代码较少。拷贝头文件到ipa-test.c#include "conf...

2020-04-12 21:13:51 744

原创 GCC - GIMPLE IR 学习一

前言  GIMPLE是从AST/GENERIC转换而来的三地址表示形式,它是一种与前端语言无关的中间表示,引入了临时变量来保存中间值。GIMPLE的生成分为高级GIMPLE(High-Level GIMPLE)和低级GIMPLE(Low-Level GIMPLE)两个阶段。  AST/GENERIC为树形结构,其节点属性较多,包含详细的功能信息,但由于其与前端语言相关缺乏通用性、结构复杂不是线...

2020-04-11 19:40:21 5376 2

原创 java中几种常用连接池的基本使用

使用数据库连接池主要是避免多次重复的资源申请、释放造成GC频繁。这里是主要关于java中dbcp2、alibaba druid、HikariCP这三种常用连接池的基本使用。其他一些不常用的像c3p0、Vibur等就不做介绍了。数据库基础连接关于JDBC(Java Database Connectivity)不做介绍,其示例如下:// db.propertiesdriver=com.mysq...

2020-04-08 23:49:57 3530 1

原创 C/C++中常用的pragma指令

pragma指令用于指定特定于计算机或操作系统的编译器功能。其语法为:#pragma token-stringC和C ++编译器可识别的token-string有以下:1 标记的仅C++支持。更多指令说明及使用请见:https://docs.microsoft.com/en-us/cpp/preprocessor/pragma-directives-and-the-pragma-keyw...

2020-04-04 17:26:34 888

原创 Tomcat配置通过域名访问

本机以apache-tomcat-8.5.53进行配置为例,演示实现部署war包能通过域名访问。进入apache-tomcat-8.5.51/conf目录,打开server.xml修改以下几个地方:若未配置图像界面程序,进入tomcat/bin目录中,运行命令行service.bat install配置将war包放入apache-tomcat-8.5.53\webapps目录下面,...

2020-04-04 15:00:14 4039

原创 Android中几种常用图片加载库的使用

常用的Android图片加载库有:Glide、Picasso、Fresco、Universal-Image-Loader。其github地址如下:Universal-Image-Loader:https://github.com/nostra13/Android-Universal-Image-LoaderFresco:https://github.com/facebook/frescoP...

2020-04-03 20:52:04 2798

原创 Android Bitmap的加载与缓存

  Android中图片资源非常的耗内存,当图片超过一定大小时就会出现OOM(Out Of Memory)异常。关于图片的加载优化,主要有采样压缩、缓存策略、异步加载等。1. Bitmap加载方式Bitmap有四种加载方式:BitmapFactory.decodeStream():以文件流方式BitmapFactory.decodeResource():以资源ID方式BitmapFac...

2020-04-03 20:50:12 602

原创 Linux服务器传输文件

1. Linux与windows传输文件sz,rz命令(推荐)它是Linux/Unix同Windows进行ZModem文件传输的命令行工具。若服务器上没有该命令可使用apt(yum) install lrzsz安装。从服务器发送单文件到Windows:sz filename //例如:sz test.cpp上传单文件到服务器:rz //在提示框中选择文件即可上传sc...

2020-04-03 11:40:06 274

原创 C++ 固有的不可移植特性

部分不可移植的特性  为了支持底层编程,C++定义了一些固有的不可移植的特性,即因机器而异的特性,当将含有不可移植特性的程序从一台机器转移到另一台机器上时,通常需要重新编写该程序。1 位域  类可以将其非静态数据成员定义成位域,在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域。位域在内存中的布局是与机器相关的且位域的类型必须是整型或枚举类...

2020-03-27 18:20:11 348

原创 编译优化之 - 常量传播入门

1. 介绍  常量传播是现代的编译器中使用最广泛的优化方法之一,它通常应用于高级中间表示(IR)。它解决了在运行时静态检测表达式是否总是求值为唯一常数的问题,如果在调用过程时知道哪些变量将具有常量值,以及这些值将是什么,则编译器可以在编译时期简化常数。常量传播在优化中的几种用途:能在编译时求值的表达式不需要在执行时才求值。如果这样的表达式在循环内,则只需要在编译时进行一次求值而节省执行时间...

2020-03-19 19:34:25 6581

原创 Android中Cmake和NDK的使用

目录 CMake及NDK简介1. CMake使用1.1 创建NDK项目1.2 常用语法1.3 cmake编译动态库2. JNI交互2.1 静态注册实现Java调用JNI方法2.2 动态注册实现Java调用JNI方法2.3 JNI访问Java构造方法3. JNI引用类型管理4. 常见异常处理 CMake及NDK简介  CMake是一个开源的跨平台自动化建构工具,...

2020-03-17 18:00:18 1878

原创 无线渗透 - wifiphisher钓取用户凭证

  当我们在机场,火车站等公共场所接入免费WiFi时,很可能我们的账号、密码、邮件等信息会被别人劫持,造成个人信息的泄露。这里我们使用钓鱼工具Wifiphisher进行演示如何获取用户凭证。  Wifiphisher可以用于对连接的客户端发起受害者自定义的网络钓鱼攻击,以捕获凭据(例如,从第三方登录页面或WPA / WPA2预共享密钥)或用恶意软件感染受害者站点。wifiphisher会劫持请求...

2020-03-16 17:22:44 1601

原创 Apache mina使用入门

Apache mina是一个基于NIO(非阻塞IO)模型的网络应用框架。详细资料和下载地址为:http://mina.apache.org/远程客户端通过IoService建立连接得到session,session将数据传送到IoFilterChain进行过滤,最后客户端在IoHandle中进行数据操作,其工作原理如图所示:此处记录的是Android中Apache mina于服务器建立的...

2020-03-12 16:32:53 2553 2

空空如也

空空如也

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

TA关注的人

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