![](https://img-blog.csdnimg.cn/20210424214651820.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入理解计算机系统CSAPP笔记
csapp
kelianlee
这个作者很懒,什么都没留下…
展开
-
重新认识fork
重新认识fork 当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。为了给这个进程创建虚拟内存,它创建了当前进程的mm_struct,区域结构和页表的原样副本。它将两个进程中的每个页都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时复制。当fork在新进程返回时,新进程现在的虚拟内存刚好和调用fork时存在的虚拟内存相同。当这两个进程中的任一个进程进行写操作时,写时复制机制就会创建新的页面。(如图所示,当进程1调用fork创建进程2时候,他们的虚..原创 2021-02-04 22:05:06 · 204 阅读 · 0 评论 -
直接映射高速缓存中的冲突不命中
冲突不命中在真实的程序中很常见。当程序访问大小为2的幂的数组时,直接映射高速缓存会通常发生冲突不命中。float dotpord(float x[8],float y[8])//x与y向量的内积{ float sum = 0.0; int i; for(i = 0;i < 8;i++) sum+=x[i]*y[i]; return sum;}假设浮点数是4个字节,x被加载到从地址0开始的32字节的内存中,而y紧跟x之后,从地址32开始。这会原创 2021-01-22 18:49:03 · 2296 阅读 · 3 评论 -
第4章 流水线
流水线通过在组合逻辑后加入流水线寄存器实现流水线,有了流水线能在一个时钟周期中发射一条指令并完成一条指令流水线的断流叫做流水线冒险主要有1)数据冒险2)控制冒险数据冒险数据冒险是指下一条流水线用到上一条指令写入的数据,也就是写后读。处理方法用暂停来避免数据冒险 用转发来避免数据冒险:不写入寄存器,直接将结果作为下一条指令的输入控制冒险例如ret返回指令和call跳转指令会是流水线产生控制冒险处理方法暂停避免在第3个周期执行ret的时候我们在DEM三个阶段插入原创 2021-01-17 23:40:54 · 438 阅读 · 0 评论 -
内存越界引用和缓存区溢出
内存越界引用和缓存区溢出void echo(){ char buf[8]; gets(buf); puts(buf);}栈区如上图所示,echo会在栈顶区域分配8字节大小给buf,当输入的字节数量0-7时,不会对栈造成破坏,当输入9-23字节时,由于是空区域,所以也不会造成破坏,但是当输入>24字节时,会修改返回地址数据,对整个栈区造成破坏。对抗缓冲区溢出攻击 栈随机化 程序每次运行,就栈的地址都采用随机化处理。 栈破坏检测(金丝雀)原创 2021-01-12 18:49:07 · 377 阅读 · 0 评论 -
第三章 过程
过程 过程的调用底层实现上是用栈结构,当过程p调用过程q时,我们先将p入栈,再将q入栈,q执行结束之后将q出栈,然后在将p出栈。调用不同的过程,实质上修改的是程序计数器(PC,从高地址向低地址增长)的值,从底层汇编上看,采用的是call命令。 转移控制 当过程p调用过程q,q执行结束之后如何继续执行p之后的机器指令,我们称之为转移控制。实现原理是在p执行call汇编调用q时候,我们首先将call指令的下一条指令入栈,也就是图中的返回地...原创 2021-01-11 21:45:47 · 219 阅读 · 0 评论