自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 资源 (4)
  • 论坛 (35)
  • 收藏
  • 关注

原创 setcontext getcontext makecontext swapcontext

Linux上下文切换以及协程 上下文切换,听起来虚无缥缈,什么是上下文,切换又是指的是什么?其实上下文就可以理解为一个进程所运行的相关的寄存器值,即包括sp/bp/pc等值,换句话说,一个上下文,就是包括了能够恢复进程运行所需要的所有必要的东西。所谓的切换, 那是多进程的操作系统必要的功能,一个CPU能够运行多个进程(看起来),那么必然要在多个进程之间不停的切换,A切换到B时,必...

2017-12-03 10:02:48 2023 1

原创 TLS/SSL 协议详解 (30) SSL中的RSA、DHE、ECDHE、ECDH流程与区别

我的TLS实现:https://github.com/mrpre/atls/大家可以参考,代码里面的逻辑较清晰。 我的SSL专栏见:https://blog.csdn.net/mrpre/article/category/9270159描述了TLS的各方面。 本文是对前面系列章节关于非对称算法在SSL中运用的总结和细化,但也可以作为详解SSL中RSA、ECDHE非对...

2017-09-19 08:50:16 40908 26

原创 TLS/SSL 协议详解 (28) TLS 1.0、TLS 1.1、TLS 1.2之间的区别

TLS 1.0 RFC http://www.ietf.org/rfc/rfc2246.txtTLS 1.1 RFC http://www.ietf.org/rfc/rfc4346.txtTLS 1.2 RFC http://www.ietf.org/rfc/rfc5246.txt TLS 1.3 见:https://blog.csdn.net/mrpre/article/deta...

2017-09-14 11:32:26 111007 2

原创 DH算法原理

 DH算法原理   DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。 本篇分为几个部分,第一个部分介绍一下密钥交换的场景;第二部分介绍一下DH算法的的步骤,以及由该算法引出的一些问题;第三部分开始讲数学原理。数学...

2016-09-21 15:59:40 23230 12

原创 关于UDP接收icmp端口不可达(port unreachable)

本篇分为3部分1:报文格式2:产生的原因3:linux协议栈如何处理4:应用层如何获取  1:报文如下,10.30.13.1往10.30.16.10的80端口发送了一个UDP报文,80端口其实监听的是TCP。服务器回复了一个类型为端口不可达的ICMP,ICMP数据部分就是请求UDP ip层及其以上的数据。 2:原因   首先原因就是接收udp报文...

2015-02-03 17:18:34 70664 12

原创 Redis cluster 原理

Redis cluster 原理Redis cluster 设计文档可见:https://redis.io/topics/cluster-spec#configuration-handling-propagation-and-failovers相关资料https://chanjarster.github.io/post/redis-cluster-config-propagation/在当前Redis6.0的版本中,可以使用 redis-cli --cluster create命令来规划一个集群,

2020-10-28 17:47:45 15

原创 redis 模块编程中 key value的生命周期

RedisModule_OpenKey本节探讨下 RedisModule_OpenKey 中 key-value 何时释放。首先 的数据结构如下struct RedisModuleKey { .... robj *key; robj *value; ....}我们关心的是 RedisModuleKey 本身以及 其中 的 key和value值的生命周期RedisModuleKey 本身 通过 RedisModule_OpenKey申请,模块内存管理自动将

2020-07-27 15:56:46 71

原创 Golang 对分片 append 是否会共享数据

Golang 对分片 append 是否会共享数据Golang 官方对 slice 的说明见文章:https://blog.golang.org/slices-intro 大部分特别是前半部分,写的非常详细,但是最后关于append相关部分,就让人感觉浅尝辄止了。首先,先写结论:append 返回的slice对象,有可能会共享入参slice的底层(意味着对返回对象slice的赋值会影响入参slice)也可能不共享入参slice的底层。先给几个例子例1:package mainimport (

2020-07-21 13:38:50 71

原创 Redis源码分析之PSYNC同步

Redis master-slave 同步源码分析(1)slave 流程分析(2)master 流程分析Slave 分析当Redis 启动后,会每隔 1s 调用 replicationCron (通过 redis自带的serverCron后台线程),即无论是单机、还是Master、还是Slave都会调用这个函数。我们先来讨论下作为Slave的情况下,replicationCron 函数运行逻辑。作为slave,这个函数的功能应该能猜到,就是和Master保持连接、握手、接受Master存量数据+

2020-07-10 14:29:16 113

原创 LLVM - 生成局部变量

接上面一篇:https://wonderful.blog.csdn.net/article/details/106902005上面一篇实现了如下函数,但是 都是对入参a的操作 double myfor(double a) { for(i = 0; i < a; i++) { a = a + 1 } return a }本例中,我们希望实现是局部变量的加减,然后return,如下 double myvar(double a) { do

2020-06-22 15:18:28 213

原创 LLVM - 生成for循环

1、生成函数2、使用Phi表达式实现for循环3、本例中,KaleidoscopeJIT源码位于./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.hPhi的概念可参考https://stackoverflow.com/questions/11485531/what-exactly-phi-instruction-does-and-how-to-use-it-in-llvm本例中,生成的llvm ir如下:define do

2020-06-22 15:08:04 171

原创 LLVM - 生成 if-else 以及 PH

1、生成函数2、函数有4个basic block,一个entry,一个 if-then 另一个 if-else,最后一个是因为需要使用ph,所以创建一个merge。3、创建ph来处理if-else,相关概念 http://en.wikipedia.org/wiki/Static_single_assignment_form4、使用jit运行5、本例中KaleidoscopeJIT源码在./llvm-8.0.1.src/examples/Kaleidoscope/include/Kaleidoscop

2020-06-22 14:55:44 68

原创 LLVM - 生成加法

本例中KaleidoscopeJIT在 ./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.中1、LLVM生成函数2、LVVM生成加法3、LLVM jit运行#include <sys/time.h>#include "./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.h"#include "llvm/ADT/APFloat.h"#i

2020-06-22 13:57:04 108

原创 Redis源码分析之HSET流程与ziplist

本篇分析Redis 如何处理hset指令数据结构首先,hset不同于set,set是存储在dict,即redis字典里面,毕竟set只是简单的kv类型数据。 hset存储的是复杂的数据结构,使用了压缩表ziplist,例如hset mykey name abc id 123其中 mykey 为 key,abc为field,123为 value 。首先,需要说明的是,如果想了解ziplist内存的布局,完全可以看ziplist.c 文件开头的那些注释,这个是非常官方的解释,也非常详细。名为myk

2020-06-19 17:27:18 126

原创 kprobe 的 3 种使用

知识背景:会编写基础内核模块kprobe用处:用来跟踪、记录、打桩。最常见的使用就是需要打印内核函数的执行流程,比如排查问题时、或者学习内核流程时需要用到。准备工作:找一份和自己linux系统相同版本的源码(方法自行Google,ubuntu、centos、redhat各自有各自方法)内核模块跟踪指定函数官方文档:https://www.kernel.org/doc/Documentation/kprobes.txt在 内核源码目录samples/kprobes/有几个kprobe模块例子,.

2020-06-17 10:22:56 159

原创 通过splice完成socket代理零拷贝

spilce 的应用通常,一个反向代理服务器,需要做转发处理,例如流量模型如下:client -> proxy -> server客户端和 proxy建立socket,然后proxy和server建立socket下面这个程序逻辑非常简单,从fd获取数据,将数据转发到fd2。为了让 fd对应的socket有待读数据,这里访问了1.1.1.1,它是我启动的server。#define _GNU_SOURCE#include <unistd.h>#include &lt

2020-06-12 17:27:28 140

原创 Redis源码分析之SET流程

本篇分析Redis 如何处理set指令Client客户端解析用户输入、构造指令redisFormatSdsCommandArgv()redisAppendCommandArgv()cliSendCommand()issueCommandRepeat()repl()例如用户输入 set abcd 2,则构造的指令就是*3\r\n$3\r\nset\r\n$4\r\nabcd\r\n$1\r\n2\r\n,*后面表示指令+参数的个数,$后面表示当前参数的长度,然后紧跟参数值。Server服

2020-06-12 10:32:56 65

原创 Redis源码分析之SDS

Redis源码分析之SDSredis使用的sds源码,由另一个git库管理,独立于redis之外,可以独立看待:https://github.com/antirez/sds ,其好处,再其主页上说的很清楚了,本文是用来分析sds的内存结构,知道内存结构,也就能很好的理解sds的一些操作的原理。sds被用来描述Redis中的“字符串”,也是redis中最为简单的数据结构之一。本文就来分析 sds...

2020-06-08 14:57:11 80

原创 Nginx 的子请求(subrequest)原理分析

Nginx 的子请求(subrequest)原理分析Nginx 的子请求设计其依托于自身的access阶段,实现了对指定url发起旁路请求的功能,通常用来鉴权、镜像等功能。当然还有其他用法这里不一一赘述,通常用户使用的接口有如内置auth_request接口或者lua的capture接口。这两个对外的接口,都使用了Nginx的ngx_http_subrequest函数。本文就稍微梳理下其子请求流...

2020-03-03 15:58:42 443

原创 进程间文件描述符传递原理

进程间文件描述符传递原理进程中文件的管理以及fork每个进程的文件描述符是独立的,即一个进程打开的文件描述符是记录在进程对象上的(task_struct)。task_struct { files_struct *files;}files_struct { struct fdtable __rcu *fdt;}fdtable { struct file _...

2019-06-06 13:36:13 814

原创 raw socket 使用 BPF 过滤报文

raw socket 使用 BPF 过滤报文抓包使用 raw socket 进行网络底层抓包,想必大家都清楚(仔细想想tcpdump原理)。这里不赘述,网上许多资料。注意,网卡需要开启混杂模式、其次程序需要管理员权限。#include <stdlib.h>#include <stdio.h>#include <sys/socket.h>#inclu...

2019-05-07 11:04:05 1448

原创 tcp_tw_reuse对客户端的作用

tcp_tw_reuse对客户端的作用客户端频繁建立连接然后主动关闭连接,会产生大量TIME_WAIT,此时,如何快速利用TIME_WAIT呢?必须满足下面所有条件:客户端:/proc/sys/net/ipv4/tcp_tw_reuse 为 1/proc/sys/net/ipv4/tcp_timestamps 为 1 TIME_WAIT socket 生存时间超过1秒服务端:...

2019-04-16 10:48:56 1418

原创 Nginx 作为反向代理(proxy)时的一些buffer指令

Nginx 作为反向代理(ptoxy)时的一些buffer指令Nginx处理请求的行为Nginx 只要配置的proxy_pass 都会无条件执行 ngx_http_read_client_request_body尝试去读 client 的 body。请求不携带body常见于 GET/HEAD方法。此时,在ngx_http_read_client_request_body判断Content...

2019-02-28 16:42:25 1823

原创 MQTT v5 (MQTT 5.0) 新特性介绍

MQTT v5 (MQTT 5.0) 的新功能项目中逐步完成了 MQTT 5.0的开发,这里介绍下MQTT 5.0 的一些新特性MQTT 5.0 规范见:http://docs.oasis-open.org/mqtt/mqtt/v5.0/cos01/mqtt-v5.0-cos01.html#_Toc514847900格式首先,协议上,增加了一个 Property字段,正是这个字段,使得 M...

2019-02-14 13:21:02 7019 5

原创 Nginx 假性内存泄露

Nginx 假性内存泄露Nginx在使用中,发现其使用的VSZ和RSS都在不断变大,查看新增的代码,没有找到内存泄露的地方,ngx_palloc和ngx_pfree都是对称调用的。Nginx 内存池机制使用Nginx开发过的都知道,在Nginx里面普遍使用ngx_palloc/ngx_pnalloc申请内存,其中入参有一个pool,它是从ngx_create_pool获得的一个对象,改函数入...

2018-12-27 10:37:58 1675 3

原创 隐藏动态库so中的符号(函数名)

隐藏动态库so中的符号(函数名)正常的lib库生成1.cint func1(){ return 1;}2.cextern int func1(void);int func2(){ return func1();}编译成动态库 libfunc.so:gcc -shared -fPIC -o libfunc.so 1.c 2.c查看符号:$nm libf...

2018-11-29 19:35:50 5715

原创 通过代码获取Linux nameserver(域名服务器ip)

通过代码获取Linux 域名服务器ip/etc/resolv.conf首先,/etc/resolv.conf定义了机器的域名服务器ip,例如nameserver 1.1.1.1nameserver 2.2.2.2表示DNS服务器地址有2个。当然,你可以人肉解析改配置文件,这个是没问题的,如果你代码没有BUG的话。glibc 对配置文件的处理#ifdef _LIBC if (M...

2018-11-16 19:10:54 2455

原创 调用malloc时发生了什么(3) - 缺页中断

页表的创建kmalloc内存使用了umapped内存,直接对地址偏移即可寻址物理内存,这里不考虑。考虑用户态内存和vmalloc,都用到了虚拟内存,即需要通过页表查询的方式查询都物理内存。例如 用户态通过brk申请了一块内存,后续访问这块内存的0x00007F88F16A4690这块地址会发生什么?首先,X64内核是4级页表,根据X64对线性地址的划分,可以计算出0x00007F88F16...

2018-11-02 18:12:47 779

原创 大页内存 初始化

大页内存 初始化hstates所有的大页均放在 hstates 的全局变量中。mm/hugetlb.cstruct hstate hstates[HUGE_MAX_HSTATE];每个 hstates 数组的元素,均表示一种大小的page,其中 HUGE_MAX_HSTATE的值为2,这也就解释了为什么hugepage目前只支持2个pagesize。当前系统有多少个类型 的hugepa...

2018-11-02 16:41:37 667

原创 Linux 大页内存 的使用

Hugepage 大页内存 的使用系统启用大页内存下述操作,需要重启机器。不建议 通过 设置 echo 1G &amp;amp;amp;gt; /proc/sys/vm/nr_hugepages的方式设置,因为系统不一定成功。设置大页内存的PAGESIZECentos 下(其他发行版本自行Google)grubby --update-kernel=ALL --args=&amp;amp;quot;hugepagesz=1G defau...

2018-10-31 16:49:39 3767

原创 perf 统计缺页中断 和TLB miss

perf 统计 内存相关eventperf 可探测 的所有 event ,均可以使用命令perf list获得。本文举几个和内存相关的性能的几个event例子探测 进程 的缺页中断数(page fault)perf stat -e faults ./mem能够统计 ./mem 执行 周期内,引发的 缺页中断数。Performance counter stats for './mem':...

2018-10-30 10:00:48 2135

原创 socket源码分析之accept

socket源码分析之accept()基于 kernel 3.10 之前有分析过TCP accept()的实现,但是太过于沉浸于代码本身,没有结合应用去分析accept()函数。 我们要解决如下几个问题: 1:accept()函数的实现,包括从全队列中取出sock。 2:accept()函数如何如何被唤醒 3:accept()函数如何解决惊群 4:多个进程accept(),...

2018-09-12 09:02:04 1726

原创 TCP选项分析 之 SO_REUSEADDR

TCP选项分析 之 SO_REUSEADDR首先 从工程角度考虑如下问题问题: 1:Server 进行 bind(),listen(),accept(),然后进行等待Client连接。 2:Client 进行 连接。即,Server的accept()返回client_fd 3:Server 程序退出(异常退出,或者)。但是和客户端的连接依旧存在。 4:Server 重启程序,但...

2018-09-12 08:59:56 399

原创 MQTT协议 几个重要的属性

MQTT 特性MQTT协议其实还是挺简单的,从为数不多的项目中,简单的总结了下MQTT协议某些字段的特性 1:will(遗言)包括 Will topic 、will message 、 will Qos、will retain。 一个Client异常断开连接的时候或者Server处理失败的时候,Server会把Client的will信息,当做Publish处理,Publish的to...

2018-09-08 18:21:36 4390

翻译 MQTT 3.1.1 规范

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html2 MQTT Control Packet format1.2 Structure of an MQTT Control PacketMQTT协议靠交换不用的控制帧来工作,这节描述了这些帧的格式。 一个MQTT控制帧总是有3部分组成,如图2.1 ...

2018-09-08 18:00:33 770

原创 TLS 1.3 协议详解

TLS 1.3 握手流程详解需要的背景知识: (1):对 TLS 1.2 协议有一定程度的了解,包括秘钥交换、会话复用等。第一节 TLS 1.3 的握手概述协议分析的第一步就是看报文。TLS 1.3的报文,有个特点,就是通过抓包发现,只能看到明文的Client Hello和Server Hello,其余的握手报文均被加密。1-RTT如图: 图1 条件:无条...

2018-08-09 10:46:08 17861 16

原创 签名算法中rsa_pss_pss_*和rsa_pss_rsae_*的区别

rsa_pss_pss_* 和 rsa_pss_rsae_* 的区别对于签名来说首先,对于签名来说,没区别。都是使用PSS流程进行签名。对于公钥来说有区别说先,加签方需要判断自己的 public key 什么类型,如果 public key是rsaEncryption类型,则用rsa_pss_rsae_表示对应私钥的签名算法OID; 如果自己的public key是 id...

2018-07-19 16:44:19 1076

原创 SSL_write 发生了什么

SSL_write 发生了什么以前在设计协议栈的时候,非常随意,因为包括下层的TCP到上层的应用处理,都是自己设计的,怎么样不麻烦这么约定。然而,如果将自己的协议栈放在通用平台,那么问题就显得比较微妙了,不是因为协议栈本身自己的实现的难度,而是使用协议栈的方式多样化导致接口设计需要变得非常复杂。一个简单的SSL_write流程,其实核心内容很简单: 1:分段(如果必要的话) 2:每段算...

2018-07-16 09:26:24 5484

原创 Nginx源码分析之 HTTP阶段

typedef enum { /*最开始的阶段,貌似Nginx原生没有该阶段的handler*/ NGX_HTTP_POST_READ_PHASE = 0, /*配置在server块的rewrite指令,则会处理hander,否则,handler进去直接return*/ NGX_HTTP_SERVER_REWRITE_PHASE, /*根据URI进行lo...

2018-07-11 15:40:35 334

原创 Nginx源码分析之 配置结构1

个人认为,Nginx的配置结构复杂至极,比Nginx其他模块的都复杂,想要彻底搞清楚,还需要下功夫。下面是个人的一些理解。if (cmd-&amp;amp;amp;gt;type &amp;amp;amp;amp; NGX_DIRECT_CONF) { /*&amp;amp;quot;daemon&amp;amp;quot; &amp;amp;quot;worker_processes&amp;amp;quot;等指令为NGX_DIRECT_CON

2018-07-10 15:01:09 173

qt显示网页代码

qt网络 qt html

2012-03-01

C++ Primer Plus 第五版 中文版

在此不再赘述此书的好处了。想必大家早已耳闻。这是最新的第五版中文版PDF

2012-02-06

程序按钮图标

可视化编程常用的按钮图标,提供下载。百种华丽的图标,可以用做编程时按钮的设计。挺好使的。好用请评论哦。

2012-02-06

QT学习之路(最适合初学者)

这是完整版的,只要你有C++基础就好,其他的都由这个文档教你。

2012-02-02

Mrpre的留言板

发表于 2020-01-02 最后回复 2020-01-02

有用mac 编译内核的吗?

发表于 2015-09-21 最后回复 2019-07-19

openssl源码在哪个阶段加密数据

发表于 2014-08-06 最后回复 2019-07-19

【推荐】求教材推荐,C++GUI Qt4还是Qt高级编程好,当然其他的呢

发表于 2012-02-23 最后回复 2018-01-08

博客的积分变成了0

发表于 2017-12-04 最后回复 2017-12-07

如何公布一个漏洞

发表于 2016-06-22 最后回复 2016-07-16

【网络编程】为什么我的FD_ISSET一直返回

发表于 2014-06-14 最后回复 2014-08-06

openssl中SSL_CTX_new在哪里定义的?

发表于 2014-07-14 最后回复 2014-08-06

求推荐一个数据结构

发表于 2014-04-09 最后回复 2014-06-19

暑假找实习好难

发表于 2013-07-07 最后回复 2014-04-09

在这个板块问个技术问题

发表于 2013-08-05 最后回复 2014-04-09

关于网络端口号的问题

发表于 2013-08-10 最后回复 2014-04-09

快毕业了,找不到工作,泪

发表于 2013-10-16 最后回复 2014-04-09

关于网络字节序的问题

发表于 2013-11-28 最后回复 2014-04-09

应届生,怎么找嵌入式的工作

发表于 2013-10-03 最后回复 2014-04-09

【论坛】老用户了,申请删贴。

发表于 2013-05-29 最后回复 2013-12-06

多线程编程中的问题

发表于 2013-07-30 最后回复 2013-08-04

想删贴,怎么找管理员啊

发表于 2013-05-28 最后回复 2013-05-29

arm怎么学

发表于 2013-03-24 最后回复 2013-05-28

关于高端内存区的疑惑

发表于 2013-05-20 最后回复 2013-05-28

。。新手,我就想简单的画一条线,但是为什么不显示呢

发表于 2012-01-24 最后回复 2012-11-23

新建的时候,该选择Qwidget还是Qdialog还是Qmainwindow,该怎么选择

发表于 2012-01-24 最后回复 2012-11-23

QT菜单栏的一个问题,addToolBar(tr("&Mile"))中的Mile显示在哪,我没找到

发表于 2012-01-27 最后回复 2012-11-23

QT入门得多久,什么程度才算入门

发表于 2012-01-28 最后回复 2012-11-23

在构造函数中用resize(500,500),为什么窗口没有变化

发表于 2012-02-02 最后回复 2012-11-23

我见过的最适合初学者的Qt学习教程

发表于 2012-02-02 最后回复 2012-11-23

ubuntu下Qt,新建了一个Qt GUI Application,为什么我运行后,是一个手机的图样

发表于 2012-02-07 最后回复 2012-11-23

看一下这6行代码,为什么不能显示

发表于 2012-02-07 最后回复 2012-11-23

【求助】用TextBrowser,但是不能显示内容啊

发表于 2012-02-20 最后回复 2012-11-23

第二遍问 这个问题了。。为什么没人回答

发表于 2012-03-01 最后回复 2012-11-23

账_号 莫名的被 冻_结了

发表于 2012-08-06 最后回复 2012-08-14

【资源】C++ Primer Plus 第五版 中文版

发表于 2012-02-06 最后回复 2012-08-06

惊闻诺基亚解散了Qt小组,倍感无助

发表于 2012-07-13 最后回复 2012-07-23

vb中,我的listbox里面有路径名,怎么去除

发表于 2012-06-30 最后回复 2012-07-02

用qt做嵌入式的还多不多

发表于 2012-02-07 最后回复 2012-02-19

空空如也

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

TA关注的人 TA的粉丝

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