heap of windows
FreeList原理双向链表管理系统,指针数组的每一位没有上限
Lookside原理单向链表管理系统,数组的每一位最多存储四个堆快
调试FreeList12345678910111213141516171819202122// 调试源码#include <windows.h>main(){ HLOCAL h1,h2,h3,h4,h5,h6; HANDLE hp; hp = HeapCreate(0,0x1000,0x10000); __asm int 3 h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,3); h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,5); h3 = HeapAlloc(hp,HEAP_ZERO_MEMORY,6); h4 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); h5 = HeapAlloc(hp,HEAP_ZERO_MEMORY,19); h6 = HeapAlloc(hp,HEAP_ZERO_MEMORY,24); //free block and preven ...
范型算法
常用函数12345678910#include <algorithm>// 标准STL函数find(first, last, val);count(first, last, val);fill(first, last, init);replacd(first, last, n, p);copy(first1, last1, first2);unique(first, last);transform(first, last, func);
12sort(first1, last1);stable_sort(first, last);
1234#include <numeric>accumulate(first, last, init);equal(first1, last1, first2);
back_inserter使用back_inserter函数返回一个类似与动态迭代器的东西。比如,如果使用普通迭代器,在使用fill函数时,如果容器没有值,将会返回一个未知错误
123456std::vecter<int> vi;// 错误,因为容 ...
容器
容器种类
vector 可变大小数组
list 双向链表
forward_list 单向链表
deque 双向队列
array 固定大小数组
string 数组字符串,与vector类系
每一种容器都有自身的优缺点,下面总结下
数组类容器:vector array string 这一类容器的优点是支持随机访问,访问速度比较快,但是要执行插入或者删除操作时效率低
链表类:list forward_list 这一类数组的优缺点与之相反,不支持随机访问,如果想访问特定数据只能遍历,但是在执行插入和删除时比较方便
队列类:deque 双向队列,支持随机访问,在队尾或者队首删除或者插入元素时效率较快
特别的需要注意array容器是固定大小数组,和vector不同的是array不能再次添加或者删除元素也就是不能使用insert和erase方法
容器操作两个重要方法swap123456// 函数原型swap(c1, c2);// 容器自带方法也有swapc1.swap(c2);// 容器之间直接拷贝c1 = c2
作用是交换两个容器之间的元素,使用swap方法比拷贝速度要快,我的理解 ...
IO
IO大致分为三类,标准io,文件io,stringio。下面一张大图表示这几种io的继承方式,常用的三种io流都继承于ios基类
IO的条件状态这些IO条件状态用于在执行IO操作时判断当前IO的状态如何从而采取相应的措施
1234strm::badbit // 流已崩溃strm::failbit // IO操作失败strm::eofbit // 用于指出已经到达流的末尾strm::goodbit // 用于指出流末尾处于错误状态
基础IO对象的成员如下
123456789strm s; // s为一个IO对象s.eof() // 如果流的eof位置位,返回trues.good() // 流处于有效状态返回trues.bad() // 流badbit置位返回trues.fail() // 流failbit位置位返回trues.clear() // 将流的所有位复位,状态位为有效s.clear(flags) // 指定流的特定位复位s.setstate(flags) // 指定流的特定位置位s.rdstate() // 返回流的当前状态,类型为ios::state
标准IO1234# ...
链接
编译器驱动程序过程以c语言为例子
首先将头文件预处理等展开,将.c文件转化为.i文件,.i文件就是头文件展开过后的文件
编译器驱动将.i文件转化为.s的ASCII码的汇编文件
将.s的汇编文件编译成.o的二进制目标文件
由链接器将.o文件链接,形成二进制可执行文件
GOT与PLT首先说下这两个单词的全称。
plt 全称为过程链接表,英文单词为Procedure Linkage Table
got全称为全局偏移量表,英文名称为Global Offset Table
got表的前三项存放的都是固定的东西。got[0]和got[1]包含动态链接器在解析函数地址时会使用的地址,got[3]存放ld-linux.so的模块入口点,其他位置就存放需要动态绑定的函数。如下图所示
plt表前两项是特殊的,plt[0]跳转到动态链接器中,plt[1]调用__libc_start_main函数。
用一个测试文件先看看情况,代码如下。编译命令为gcc -g -o init.c init
1234567891011#include <stdio.h>#include <mallo ...
cache lab
前言这章从看视频到看书再到做lab用了小一个星期的时间,做得怀疑智商,cachelab中的PartB部分只能勉强搞懂,还得看网上大佬的思路,算了不少草稿才勉强将miss次数给算出来,看到后面还有更难的lab已经开始害怕了。由于时间问题,这个lab没有研究到满分(及格都够呛)
实验文件介绍1234567891011121314151617├── cachelab.c├── cachelab.h├── csim.c├── csim-ref├── driver.py├── Makefile├── README├── test-csim├── test-trans.c├── tracegen.c├── traces│ ├── dave.trace│ ├── long.trace│ ├── trans.trace│ ├── yi2.trace│ └── yi.trace└── trans.c
csim.c和trans.c文件,前一个文件是需要我们实现一个缓存模拟器,第二个是实现矩阵转置
test-csim文件:测试我们写的缓存模拟器
csim-ref:我们所写的缓存模拟器样 ...
attack lab
这是csapp实验室的第三个lab,关于c语言中栈溢出的实验,需要通过所给的文件和实验文档使用栈溢出的手法来实现对程序流程的控制
官方实验文档地址:http://csapp.cs.cmu.edu/3e/attacklab.pdf
文件目录结构1234567├── attacklab.pdf├── cookie.txt├── ctarget├── farm.c├── hex2raw├── README.txt└── rtarget
ctarget和rtarget两个存在漏洞的文件,hex2raw是exploit转化文件,具体用法为(这些在pdf中都有讲到),不在过多赘述
12# hex2raw使用方式linux>./hex2raw < payload.txt
ctarget通用的test函数,用于接收用户输入
123456void test(){ int val; val = getbuf(); printf("No exploit. Getbuf returned 0x%x\n", val);}
level-1 ...
Y86-64处理器体系结构
Y86-64指令体系结构Y86-64可以看作是cisc和risc二者的合集,它既是可变长度指令集,又是load/store体系指令2
这里总的来说就是教学如何将汇编指令转化为机器码以及将机器码转化为汇编指令
关于硬件编程和机器编程这里只是简单的介绍下二者的关系与区别以及我的理解
大二学了关于数字电路(虽然没怎么学懂)和计算机组成原理(根本没有学)的知识,了解了计算机中的CPU组成原理:从微观来说就是几个基础的门组成,这些东西统称为电路,电路信号输入在输出成想要的值,这种电路没有存储能力。在计算机中信息都是保存在寄存器中的,记录下书中写的,大概有两种寄存器
时钟寄存器
随机访问寄存器(简称内存)
Y86-64顺序实现简单来说,处理器处理机器码需要一个成熟,通用的框架,无论是复杂指令集还是简单指令集,一条指令的机器码都要能够快速准确的识别,Y86-64处理器的实现首先需要SEQ处理器
SEQ处理器的框架为
取指
解析指令操作码,如果有寄存器等一并解析并且保存,而后pc+n保存在临时变量中
译码
如果指令会改变寄存器值或者需要用到寄存器值,通过取指操作获取的寄存器文件编号来获取 ...
浮点数转换问题与操作指令
一直对于计算机的浮点数操作原理以及指令很模糊,特别是关于浮点数操作的汇编指令以及寄存器方面的知识,这里记录下(所使用的标准是IEEE754)
关于浮点数在内存中的存储下面的图是32位浮点数与64位浮点数在内存中的存储形式,和计算公式
如果exp全为1就代表无限大或者NaN(not a number),如果exp全为0代表非规格化
随后在引入一个概念Bias,计算公式为:Bias = 2k-1-1,其中k等于exp所占的二进制位数(32位的浮点数占8位,64位的浮点数占11位)32位的Bisa=127,64位的Bisa=1023
浮点数在内存中的存储分为三段:
符号位S
阶码E
尾数M
理清E,exp,Biased三者的关系三者的计算公式为E = exp - Biased(特别的,如果exp等于0,则公式变为E = 1 - Biased)
一定要注意阶码E不会直接存在内存中,而是通过上面的计算将阶码E转化为exp存放在内存中
举两个例子将数12345转化为浮点数的16进制形式(用32位为例子)
首先将12345转化为二进制数形式
112345 = (11000000111001) ...
git命令学习
记录下git常用命令
在创建仓库后如何推送到github123456git initgit add README.mdgit commit -m "first commit"git branch -M maingit remote add origin https://github.com/<your github name>/<your resp name>.gitgit push -u origin main #第一次推送使用命令
1234567git pull #更新仓库#这两个命令建议在推送一类文件时使用一次git add <file name>git commit -m "xxxxx" git push
git常用命令初始化仓库
1git init
修改或者添加文件后进行的操作
12git add <file name>git commit -m "xxxxx"
查看提交日志,查看提交日志可以跟很多参数
1git log
版本回退
12git reset ...