自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 《深入理解linux内核》之内存寻址

逻辑地址:逻辑地址由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。线性地址(虚拟地址):32位环境下,是一个32位无符号整数,可以用来表示高达4GB的地址。物理地址:用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。内存控制单元(MMU)通过一种称为分段单元的硬件电路把一个逻辑地址转换成线性地址;接着,通过第二个称为分页单元的硬件电路把线性地址转换成一个物理地址。从80286开始,intel微处理器以实模式和保护模式执行地址转换。实模式

2021-01-21 13:26:27 185

原创 C++变量函数的声明定义与内存模型

变量声明:告诉编译器存在此类型的变量。变量定义:告诉编译器要创建一个变量,并给该变量分配内存空间,定义包含了声明。extern char cat; //变量声明,存在一个变量,其内存空间为1个字节。int dog; //变量声明加定义,创建一个变量,给它分配4个字节的内存空间。函数声明:告诉编译器存在此类型的变量。函数定义:告诉编译器函数的内容,实质是一堆由CPU执行的指令,定义包含了声明。类型的定义:告诉编译器创建一个数据类型,定义class、union、struct、enum以及typed

2021-01-14 16:07:15 283

原创 网络连接全过程

打开浏览器,输入网址,也可以叫作URL(Uniform Resource Locator,统一资源定位器)。http://www.xxxx.com浏览器解析URL,获取URL中协议、服务器名、数据源的路径名等信息,并根据解析出来的信息生成HTTP请求消息。然后浏览器需要向DNS服务器查询www.xxxx.com的IP地址。通过调用socket库(gethostbyname),使操作系统上的DNS客户端(DNS解析器)调用操作系统内部协议栈,协议栈通过网卡向DNS服务器发出查询消息。目标DNS服务器会

2021-01-06 16:50:07 1333 1

原创 操作系统异常控制流

处理器执行指令的地址之间的过度被称作控制转移, 这样的控制转移序列叫做处理器的控制流。现代操作系统通过使控制流发生突变来对系统状态的变化做出反应,这些突变被称作异常控制流。异常是一种形式的异常控制流。异常就是控制流中的突变,用来响应处理器状态中的某些变化。当处理器检测到有异常发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序—异常处理程序。异常处理程序运行在内核模式下。异常可以分为四类:中断、陷阱、故障和终止。中断中断是异步发生的,是

2021-01-05 13:08:21 254

原创 程序是如何链接和运行的

一、什么是链接?C/C++程序的编译可以分解为4个步骤,预处理、编译、汇编、链接。每个源文件先进行预处理,完成预编译操作,再通过编译进行一系列语法、语义分析生成汇编代码文件,之后汇编器将汇编代码转变成机器可以执行的指令,即机器语言。预处理、编译、汇编都是对独立的源文件模块进行处理,而链接的作用就是将这些独立的模块组装起来。链接过程主要包括了地址和空间分配、符号解析和重定位等。二、目标文件格式目标文件指源代码经过编译产生的能被cpu直接识别二进制代码,了解它对于认识系统背后的机理有巨大的好处。Wind

2021-01-04 15:59:41 603

原创 现代操作系统中程序为什么要分段

  现在PC平台的文件格式,主要是Windows下的PE和Linux的ELF,它们都是COFF格式的变种。COFF在目标文件里引入了段机制,不同的目标文件可以拥有不同数量及不同类型的段。  Linux已经基本弃用了段式内存管理,段基址都为0,大小为整个虚拟空间,直接把整个虚拟内存看成一整个段,那么编译后的目标文件中为什么还要分段呢。主要有以下几个原因:数据和指令被划分到两个虚拟内存区域,方便进行访问权限控制,防止程序指令被有意无意的改写。对于现代CPU来说,有着极为强大的缓存体系,一般CPU的缓存

2020-12-31 16:36:13 1805 1

原创 浅析内存管理

在早期的计算机中,程序是直接运行在物理内存上的,程序直接访问的都是物理地址。如果一个计算机同时运行多个程序,那么就会出现一个问题,如何将计算机上的物理内存同时分配给多个程序使用。  最早的方法是固定分区分配。将内存划分为几个固定大小的区域,在每个分区中只装入一个程序,这样便允许有几个程序并发运行。由于每个分区的大小固定,必然会出现内部碎片,造成存储空间的浪费。  随后出现了动态分区分配,它根据程序的实际需要,动态的为之分配内存空间。但动态分区分配算法容易产生若干个不连续的小分区,由于程序需要连续的内存分

2020-12-30 16:23:26 237

原创 汇编学习总结

地址总线:CPU通过地址总线指定存储器单元。可见地址总线能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。一根导线可以传送的稳定状态只有两种,高电平和低电平,对应1和0,10根导线就是10位二进制数据,即2的10次方。数据总线:CPU与其它器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。8根数据总线一次可以传送一个字节。16根可以传送两个字节。8088CPU的数据总线宽度为8,8086CPU的数据总线宽度为16。控制总线:CPU对外部器件的控

2020-11-26 14:35:20 165

原创 Qt爬坑笔记

信号槽在Qt中,可以通过QObject::connect函数创建一个信号槽连接。bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]第五个参数决定了槽函数触发时机。默认的参数为Qt::AutoConnection。

2020-11-24 16:19:20 251

原创 Windows抓包方法-通过DLL注入拦截系统API实现

一.DLL注入为什么要注入DLL呢?因为我们想在一个进程中做我们想要做的操作。而在Windows中,系统为每个进程都虚拟出了私有的地址空间。例如指针,它指向的只是本进程的内存,这使得很难对另一个进程进行操作和控制。但是通过注入DLL,我们可以在目标进程中执行DLL中的代码,从而达到操控目标进程的效果。这里只详细说一下远程线程注入的方法,注入的方法还有很多,不再详细介绍。首先准备好需要注入的DLL,注意DLL的指令集与目标程序是否兼容。我们要通过CreateRemoteThread在目标进程创建一个

2020-11-16 17:19:47 1677

原创 Windows中C/C++字符串编码总结

字符/字符串编码在C/C++中,字符串可以用一个以0结尾的ANSI单字节字符数组来表示。问题是,某些语言文字系统的字符集有非常多的符号。但这种方法一个字节只能表示256个符号,这是远远不够的。对于多余256个字符的字符集,有两种不同的解决方案:多字节和宽字符表示法。注:ANSI即扩展的ASCII编码。不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码

2020-11-09 17:04:00 613

原创 Windows编程DLL注入之Hook(钩子)注入

消息:消息可以由系统和应用程序生成,系统会为每个输入事件产生相应的消息。例如点击鼠标,按下键盘按键等。消息又分为队列消息和非队列消息,对于非队列消息,windows会直接将其发送到窗口处理函数,而对于队列消息,windows会将其放入消息队列。消息队列:windows维护了一个系统消息队列,并且为每一个GUI线程维护一个消息队列。且只有线程第一次调用GDI函数时,系统才会为该线程创建消息队列。windows会检查系统消息队列,确定消息的目标窗口,将其放入创建这个窗口的线程的消息队列里。Hook:钩

2020-11-06 11:57:36 3275

原创 变更系统分辨率造成Qt5.4.1应用程序MessageBox显示异常。且造成QtCreator右键不可用等一系列问题的解决方案

以下为解决此问题全过程:分析原因:在QtCreator加载时,出现错误信息:QXcbConnection: Failed to initialize XRandrRandr:Resize and RotateXRandr用于Qt调整和监测系统分辨率,猜测此处初始化失败导致上述问题。添加环境变量:export QT_DEBUG_PLUGINS=1输出Qt 错误日志发现:Got keys from plugin meta data ("xcb")QFactoryLoader::QFactor

2020-11-03 17:09:48 829

原创 iptables设置端口转发后建立tcp连接的疑问处理

现有需求在不切换root的前提下使用102端口。虽然方法有很多,但由于内核版本,系统限制等因素,决定使用iptables实现。已知:客户端A的ip地址:192.168.49.128服务器B的ip地址:192.168.49.4要求A与B建立tcp连接,且双方端口都为102。linux规定普通用户下无法bind1024以下端口。于是使用iptables将B主机102端口转发至9102端口。于B主机配置规则:iptables -t nat -I PREROUTING -p tcp --dport

2020-10-20 14:10:12 738

原创 操作系统启动过程总结

总结一下操作系统启动过程。1.BIOS在计算机的主板上有一块ROM芯片,上面保存着BIOS(Basic Input Output System),也就是基本输入输出系统。BIOS首先要进行硬件自检,检查计算机是否满足运行的基本条件。之后BIOS按照设置的启动顺序把控制权转交给下一个存储设备。2.MBR从排序第一的软盘、硬盘或是可移动设备中读取启动设备的MBR(Master Boot Record)。之后计算机将MBR放入指定的位置(0x7c00)内存中加载运行,再从MBR中的程序加载磁盘的其它部分

2020-10-12 17:05:03 647

原创 编译和编码

几个概念:计算机中可见的字符都有一个二进制的机器编码与之对应。字符集可以理解为这种字符与二进制的对应关系的集合。编码是将字符转换为二进制的过程。解码与之相反。源码字符集:源码存储在计算机磁盘上所采用的编码方式。执行字符集:运行的程序中的字符在内存中存储所使用的编码方式。内部字符集:编译器内部使用的字符集。以gcc为例:-finput-charset 设置输入字符集,用于从输入的字符集转换,默认为utf8。-fexec-charset=charset 设置执行字符集。决定了字符串常量在内存中

2020-09-09 17:46:02 1683

原创 c/c++类型和变量

c/c++类型和变量c++中的数据类型分为两大类:预定义类型和自定义数据类型。预定义类型包含:整型、字符型、布尔型、浮点型、空类型,指针类型;自定义数据类型包含:数组、结构体(struct)、联合体(union)、枚举(enum)、类。编译时遇到这么一个问题。//全局变量中int x;int x;gcc编译器可以正常通过,g++却提示int x重定义。推测在c中,int x只是全局变量的声明,c++中是全局变量的声明加定义。自定义类型声明和定义对于一个结构体来说。struct A;

2020-08-28 21:51:51 239 1

空空如也

空空如也

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

TA关注的人

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