本文主要介绍C语言中的函数调用约定,通过汇编代码结合实时观察栈的变化情况,直观地了解函数调用的过程。本文只讨论x86/64架构、Linux/GCC环境下的情况,不过其他环境在整体思想上应该是类似的,都需要处理这些问题。

阅读全文 »

平常我们的程序基本都是运行在操作系统之上,很少有机会直接在裸机上运行程序。现代操作系统需要支持多任务环境的工作方式,这要求CPU在硬件上提供支持。以Intel处理器为例,从80286/80386开始,CPU开始支持工作在保护模式,为多任务环境提供保护机制。

操作系统为我们提供了保护和抽象,这方便了开发和使用,但是同时也对学习者了解计算机底层工作原理造成了一定的障碍。本文通过编码实践王爽老师《汇编语言》中的课程设计2,与寄存器、内存、显存、中断、外设等进行了近距离的亲密接触,通过这次实践也算是入门汇编了吧。

阅读全文 »

本文不会介绍基本的VIM使用方法,如果你对VIM的几种模式、基本的编辑、移动和选取等还不了解,推荐你先看一下这篇简明 VIM 练级攻略,写得还是不错的,基本上最常用的命令都有了。如果你不是vim重度用户的话,知道这些命令已经足够。只能说vim的水太深,根据自身情况在编辑效率和学习成本之间做个平衡吧。

阅读全文 »

mmap是一个用户空间很常用的系统调用,无论是分配内存、读写大文件、链接动态库文件,还是多进程间共享内存,都可以看到其身影。本文首先介绍了进程地址空间和mmap,然后分析了内核代码以了解其实现,最后通过一个简单的demo驱动示例,加深对mmap的理解。

阅读全文 »

前面已经支持了几种不同的方式添加断点,但是必须事先在代码中添加断点,在使用上不是那么灵活方便。本文将支持动态增删断点,只需要开一开始引入调试库即可,后续可以在调试过程中动态的添加和删除断点。事不宜迟,我们直接进入正题。

阅读全文 »

本文主要分享一个在压测Nginx反向代理服务过程中碰到的连接异常断开问题,包括问题的定位与复现,最后由这个实际问题引申聊一下Nginx的连接管理。

阅读全文 »

之前写过一篇关于SSL协议的文章,主要介绍了加密学的基础,并从整体上对SSL协议做了介绍。由于篇幅原因,SSL握手的详细流程没有深入介绍。本文将拆解握手流程,在消息级别对握手进行详细地介绍。还没有加密学基本概念的、或者不清楚SSL协议的基本情况的建议先看一下前面一篇的内容。另外,本文主要是针对TLSv1.2和GMVPN的情况,对于TLSv1.3暂不涉及。

阅读全文 »

前段时间在做一些测试的时候接触到了Linux tc,因为需要对数据包添加延迟,用到了tc中的netem。添加简单的延迟非常简单,像这样一条命令就搞定了:$ tc qdisc add dev eth0 root netem delay 1s,你甚至不需要完全理解命令中参数的含义。但是当你想做一些更加特殊的限制的时候,(比如只对某个特定的ip端口添加延迟、或者只对入站的流量添加延迟),事情就变得有些棘手了,简单的百度貌似已经满足不了要求了。你不得不了解TC中的一些基本概念,以及tc[2]命令中相关参数的含义。

本文正是带你了解这些TC中的基本概念,并通过一个实际例子,将这些概念与tc命令联系起来。

阅读全文 »

在前一篇中我们支持了通过函数名称来添加断点,我们同时也提到了在Lua中一个函数的名称的并不是确定的。准确的说,Lua中的函数并没有名称,所谓名称其实是保存这个函数值的变量的名称。

于是通过函数名称添加断点就造成了一定的不确定性,因为函数被调用时并不一定是以这个名字被调用的。另外,多个不同的函数也可能以相同的名字进行调用。

所以为了解决这个问题,本篇我们将继续扩展断点的设置接口,支持通过包名来添加断点。因为包名相对更具确定性,配合行号可以进行精确定位。

阅读全文 »

我们之前已经支持了通过函数来添加断点,并且已经支持了行号的检查和自动修正。但是通过函数来添加断点有一些限制,如果在当前的位置无法访问目标函数,那我们就无法对其添加断点。

于是,本篇我们将扩展断点设置的接口,支持通过函数名称添加断点,以突破这个限制。

阅读全文 »