- 博客(31)
- 收藏
- 关注
转载 从Java虚拟机看Java类和对象的初始化
类变量的初始化类变量是之类中的static变量,在Java程序运行时它存储于方法区中,可以被认为是类信息(java.lang.Class对象)的一部分。《Java编程思想》中描述了static变量的初始化时机:创建类的第一个对象时,或者是访问static域或者static方法时。上述语句是有依据的,在Java虚拟机规范中严格规定了有且只有5种情况必须立即对类进行初始化:1)遇到ne...
2018-08-11 10:45:07
690
原创 理解Raft协议
什么是分布式一致性首先假设我们服务器系统中只有一个结点(node),这个结点可以是一个数据库服务器存储着单一的值,有一个客户端向这个服务器发送了一个值,这个值可以很容易就满足一致性。但是,如果我们的服务器部署在集群上,有多个结点,每次对这些服务器发起的操作,都需要使他们的结果达成一致,看起来像是一台机器一样,这就是分布式一致性问题。Raft就是一种实现分布式一致性的协议 结点的状态...
2018-07-07 17:43:52
539
原创 Ubuntu编译Android源码
博主是在Ubuntu16.04下编译Android 6.0.1的源码。首先需要获取到Android源码,有很多种方式,大家可以自行google。博主是在网上分享的一个百度云链接中下载的,方便省事,需要链接的可以私信我或者给我留言。Android 6.0.1源码目录如下图编译Android需要安装OpenJDK 7。博主之前系统中有安装Java官网的JDK,最后发现并不能编译。下载OpenJDK的方...
2018-06-18 16:35:40
663
原创 Java—线程按顺序执行
1.第一种方法:Thread.join() public static void main(String[] args) { final Thread t1 = new Thread(new Runnable() { @Override public void run() { System.ou...
2018-06-17 10:27:44
921
原创 Linux查看动态库.so导出函数列表
有两种方式:1.使用objdump命令。例如:objdump -tT xxx.so2.使用nm命令(个人觉得使用nm方式查看更方便。)例如 nm -D xxx.so(-D或-dynamic选项表示:显示动态符号。该选项仅对于动态库有意义)得到的结果中以T开头的就是导出函数实例:自己生成一个只包含test_b函数的动态库libtest.so使用awk命令筛选出第二列为-T的行...
2018-06-12 11:29:21
47920
原创 Linux内核实现PE加载器——Longene源码分析
Longene是一个源自中国的自由、开源的操作系统项目,目的是要把Linux的内核扩充成一个既支持Linux应用、也支持Windows应用,既支持Linux设备驱动、也支持Windows设备驱动的兼容内核;使用户可以直接在Linux操作系统上高效运行Windows应用。2006年发布了其第一个版本,但是自2014年以来,项目开发已停止,2018年5月其官网无法访问。这里就不多做介绍了,直接开始从源...
2018-06-06 10:38:00
1137
原创 Windows10安装运行Docker
首先需要开启Win10的Hype-V。在设置中搜索“启用或关闭Windows功能”选中Hyper-V选项然后在 https://www.docker.com/get-docker 安装Toolbox点击左边图标,然后跳转到Download界面后,下载Windows版本安装完成后桌面会出现鲸鱼的图标,任务栏会自动启动白色鲸鱼的图标 注册ID后登陆,然后就可以在cmd中执行do...
2018-05-22 21:01:23
785
原创 热部署插件JRebel安装使用
IntelliJ IDEA实现热部署一搬有三种方法:1.JRebel插件2.Maven项目的springloaded依赖3.Maven项目的springdevtool依赖博主觉得还是第一种方法比较好用。下面来看一下如何配置JRebel实现项目热部署在Settings/Plugins中搜索JRebel下载安装后,会提示重启IDE,然后需要激活JRebel翻墙后用facebook登陆来激活。可以看到I...
2018-05-21 19:49:53
273
原创 epoll详解
首先要知道,select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步非阻塞I/O,因为他们都需要在读写事件就绪后自己负责进行读写,而异步I/O则无需自己负责进行读写,内核来完成,然后会收到内核的信号,进程就会知...
2018-05-17 23:08:43
436
原创 Linux动态链接器
我开始以为动态链接器ld-linux.so.x是linux内核的一部分,其实这种想法是错误的。分析完ELF可执行文件在内核中加载启动的源码后,可以参考博主的这两篇博客Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程Linux加载启动可执行程序的过程(二)解释器完成动态链接我们可以知道,识别二进制映像以及文件映射到进程虚拟地址空间这个过程确实是在内核中完成的,但是动态链接的过程,需要...
2018-05-16 11:03:57
4079
原创 Windows安装Redis
博主是在Win10下安装Redis且安装了Redis桌面管理客户端。Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 D盘,解压后,可以将文件夹重新命名为redis下载地址:https://github.com/MicrosoftArchive/redis/releases通过cmd切换到该目录下,并且启动服务端...
2018-05-14 22:58:11
811
原创 Netty4——Handler执行顺序
Netty4中, I / O事件由ChannelInboundHandler或ChannelOutboundHandler处理,并通过调用ChannelHandlerContext中定义的事件传播方法(如ChannelHandlerContext.fireChannelRead(Object)和ChannelHandlerContext.write(Object))转发给其最接近的处理程序。补充说...
2018-05-13 17:26:32
1662
原创 WebSocket协议讲解
WebSocket是什么Wiki上是这样介绍的:WebSocket是一种在单个TCP连接上进行全双工通讯的协议。这里做个补充:是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只...
2018-05-12 11:12:04
479
原创 Wine中PE格式文件的加载(四):DLL的装入和连接
在加载完PE可执行文件后,回到kernel32的入口函数__wine_kernel_init中,接下来调用了函数LdrInitializeThunk。dll的装入和连接过程主要是该函数实现的。函数部分代码如下图所示: 先用main_exe_file判断主模块是否已经被建立了,这是在wine_process_init函数中被赋值的一个句柄类型。get_moderf的作用正如注释所说,是为可执行文件分...
2018-05-04 15:03:32
2293
原创 TCP Keepalive机制与应用层心跳Heartbeat
TCP长连接中可能出现的问题1. 很多防火墙路由器等对于空闲socket自动关闭2. 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制.于是,就有了心跳(HeartBeat)机制。心跳机制的两种实现方案目前而言,有两种方式实现TCP的保活(业内现状是IM方面几乎都采用第一种)1. 应用层协议自己实现的心跳机制很多应用层协议都有HeartBeat机...
2018-04-27 20:06:20
3971
2
原创 理解TCP长连接(Keepalive)
TCP Keepalive的起源TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,且...
2018-04-27 17:59:32
61659
原创 理解Socket
Socket的概念什么是Socket?很多博客总结的不到位。这里做一个全面的解释。基本原理的角度来看,Socket起源于Unix,Unix/Linux基本哲学之一就是“一切皆文件”,Socket是一种"打开—读/写—关闭"模式的实现,可以被认为是服务器和客户端各自维护的一种特殊文件,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。进程通信的角度来看,Sock...
2018-04-27 15:30:39
275
原创 Linux加载启动可执行程序的过程(二)解释器完成动态链接
接着上一篇博客。前面的工作都是在内核完成的,接下来会回到用户空间。第一步,解释器(也可以叫动态链接器)首先检查可执行程序所依赖的共享库,并在需要的时候对其进行加载。ELF 文件有一个特别的节区: .dynamic,它存放了和动态链接相关的很多信息,例如动态链接器通过它找到该文件使用的动态链接库。不过,该信息并未包含动态链接库的绝对路径,但解释器通过 LD_LIBRARY_PATH 参数可以找到(它...
2018-04-25 17:12:29
3390
1
原创 Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程
linux内核启动时将ELF格式注册到内核可支持的文件格式链表中,也就是通过register_binfmt 函数将定义的elf_format结构体添加到链表中。该结构体如下:当我们执行一个可执行程序的时候, 内核会list_for_each_entry遍历所有注册的linux_binfmt对象, 对其调用load_binrary方法来尝试加载, 直到加载成功为止。上面代码可以看倒,ELF中加载程序...
2018-04-25 17:07:12
6475
原创 剑指offer算法题汇总(java版)
1.二维数组中的查找题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目思路读取矩阵最右上角的元素,也就是第一行最后一列的元素开始遍历判断 public boolean Find(int target, int [][] array) { if(arr...
2018-04-21 17:40:00
563
原创 必考算法总结(java版)
树的遍历先序遍历递归版本 public static void preorderTraversal(List<Integer> list,TreeNode root){ if(root==null) return; list.add(root.value); preorderTraversal1(list,r...
2018-04-21 13:44:42
286
原创 Wine中PE格式文件的加载(三):PE格式文件的加载
前面分析到ntdll中加载了kernel32,然后调用了kernel32的初始化函数__wine_kernel_init。该函数的实现在dlls/kernel32/process.c中。内容较多,就不完整截图了首先函数开始获取了需要加载的windows应用的路径名,这个就是在开始执行的命令的微信的绝对路径,在wine中一般为“/home/username/.wine/drive_c/Program...
2018-04-16 10:46:16
1340
原创 Wine中PE格式文件的加载(二):Wineserver初始化过程
Wineserver的初始化过程就在thread_init函数中进行的。具体分析thread_init函数(在ntdll/thread.c中)1. 创建了TEB,PEB等数据结构。2. 通过server_init_process()与服务进程建立socket连接。在此过程中,如果连接失败就说明服务进程尚不存在,此时要通过start_server()先fork()一个子进程,让其执行...
2018-04-16 10:41:04
1827
原创 Wine中PE格式文件的加载(一):Wine初始化过程
首先了解下Wine初始化过程。我们执行”wine WeChat.exe”命令,发生的过程是怎么样的?接下来从wine源码一步步分析函数调用过程。在loader/目录下的源码编译,由main.c生成了“wine”Linux可执行文件;preloader.c生成了“pre-loader”Linux可执行文件。假设在终端通过命令“wine WeChat.exe”启动微信;该过程涉及preloader,...
2018-04-16 10:38:59
3227
原创 linux系统调用过程理解
用户可以通过两种方式使用系统调用:第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。(如write,read,kill,mkdir等函数)第二种方式是使用_syscall宏。2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:_syscall0(type,name) _syscall1(type,na...
2018-04-08 20:36:33
388
转载 Linux进程管理与调度
日期内核版本架构作者GitHub优快云2016-07-21Linux-4.6X86 & armgatiemeLinuxDeviceDriversLinux进程管理与调度1 项目链接项目描述KernelInKernel一个运行在linux上的小巧内核, 修改了linux-kernel的start_kernel以启动我们自己的内核, 基于jserv/kernel-in-kernel(基于li...
2018-03-21 20:54:35
213
转载 Linux实现热补丁
热补丁是什么热补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速、低成本修复产品软件版本缺陷的方式。通过电子邮件或者其他途径来通知用户有关热补丁的消息,一般在软件供应商的网站上可以免费下载补丁程序。和升级软件版本相比,热补丁的主要优势是不会使设备当前正在运行的业务中断,即在不重启设备的情况下,可以对设备当前软件版本的缺陷进行修复。Linux热补丁实现如果要修改一个已经
2018-01-18 19:05:52
6104
原创 Linux编写内核模块及文件读写
sysfs是什么sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。该文件系统的目录层次结构严格按照内核的数据结构组织。除了二进制文件外(只有特殊场合才使用),sysfs文件内容均以ASCII格式保存,且一个文件只保存一个数据,另外,一个文件不可大于一个内存页(通常为4096字节)。项目要求将char数组保存到属性文件,下面将介绍如何完成。Linux内核模块是什
2018-01-18 15:44:55
13991
原创 Linux udev识别移动设备
udev是什么udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。udev系统由三个部分组成:libudev函数库,可以用来获取设备的信息,/usr/include/libudev.h。udev
2018-01-18 15:39:06
7328
原创 OLLVM分析
一、LLVM是什么LLVM最初是Low Level Virtual Machine的缩写,定位是一个,但是是比较底层的虚拟机。然而LLVM本身并不是一个完整的编译器,LLVM是一个编译器基础架构(infrastructure),把很多编译器需要的功能以可调用的模块形式实现出来并包装成库,供其他编译器实现者可以根据自己的需要选择使用或者扩展。主要聚焦于编译器后端功能,如代码生成、代码优化、JIT等。...
2018-01-10 17:32:46
7761
原创 ADVobfuscator开源项目分析
一、代码混淆的定义代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行二、ADVobfuscator简介ADVobfuscator演示如何使用C ++ 11/14语言在编译时生成混淆代码,而无需使用任何外部工具,也无需修改编译器。 所提出的技术仅仅依靠ISO标准化的C ++ 11/14。 它还展示了如何引入某种形式的随机性来...
2018-01-08 20:05:29
1834
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人