计算机系统
计算机科学与技术计算机系统课程,包括计算机系统知识总结和gcc编译和gdb调试等内容
hnu哈哈
湖南大学2022届毕业本科生
展开
-
高速缓存概述
目录1.存储器的层次结构2.cache概述3.Cache的映射方式1.存储器的层次结构数据总是在相邻两层之间进行复制传送,为什么这种结构有效?程序的空间局部性和时间局部性。刚访问过的单元不久可能还会被访问,刚刚访问过单元的附近单元可能会被访问。2.cache概述程序具有访问局部性特征的原因指令:指令按序存放,地址连续,循环程序段或子程序段重复执行 数据:连续存放,数组元素重复、按序访问如何分块? 主存块和Cache之间如何映射? Cac...原创 2020-06-18 20:53:55 · 1230 阅读 · 0 评论 -
磁盘存储器
一、磁盘存储器的结构 磁表面信息读出过程: 二、磁盘驱动器以及操作过程①硬盘操作流程:所有磁道同步寻道(柱面号)选择磁头(磁头号)等待扇区到达磁头下方(扇区号)读写扇区数据②平均存取时间T =平均寻道时间+平均旋转等待时间+数据传输时间(转过一个扇区的时间,忽略不...原创 2020-06-18 09:38:26 · 1584 阅读 · 0 评论 -
主存储器组织
一、存储器的分类1.按工作性质/存取方式(1)随机存储器RAM每个单元读写时间一样,与所在位置无关(如内存):地址译码时间相同,现在的DRAM芯片采用行缓冲,因为可能跟位相关。(2)顺序存储器SAM按顺序从存储载体的始端读入/出,存取时间与位置有关(如磁带)(3)直接存储器DAM直接定位到数据块,在读写数据块时按顺序进行(如磁盘)(4)相联存储器AM CAM按内容检索到存储位置进行读写(如块表)2.按存储介质(1)半导体存储器:双极型,静态MOS型,动态MOS型原创 2020-06-17 10:19:17 · 1241 阅读 · 0 评论 -
程序的机器级表示四(数据)
一、数组1.一维数组T A[L]; type T, length L 在内存中连续分配 L*sizeof(T) 个字节 访问数组:%edx: 数组的起始地址 %eax: 数组元素下标值 要访问的数据地址为: 4*%eax + %edx 内存寻址方式: (%edx,%eax,4)2.二维数组T A[R][C]; 数据类型 T ,R 行, C 列 ...原创 2020-06-12 22:27:32 · 288 阅读 · 0 评论 -
程序的机器级表示三(过程)
过程:过程的作用:机器栈&函数调用过程栈的变化:函数的返回值的保存:寄存器使用惯例:call,leave,ret原创 2020-06-10 21:39:48 · 486 阅读 · 0 评论 -
程序的机器级表示二(控制)
实现有条件的行为:测试数据值 根据测试的结果来改变测试流/数据流1.条件码CF 最高位产生了进位,无符号操作数的溢出 SF 符号标志,操作结果为负数 ZF 零标志 OF 溢出标志 (有符号数 signed)lea/mov指令不设置条件码逻辑操作,例如 XOR,进位标志和溢出标志会设置成 0 移位操作,进位标志将设置为最后一个被移出的位,而溢出标志设置为0 INC DEC 指令会设置溢出和零标志,但是不会改变进位标志比较和测试指令:CM.原创 2020-06-10 20:10:03 · 210 阅读 · 0 评论 -
程序的机器级表示一(数据访问和操作指令)
一、程序执行条件码是CPU根据运算结果由硬件设置的位,体现当前指令执行结果的各种状态信息,是程序分支和程序循环的依据反汇编:objdump -d code.o gdb p disassemble sum x/11xb sum 查看从sum函数地址开始的11个字节二、数据类型1.IA32支持的数据类型和格式:long double实际长度为80位,但分配96位=12B(按4B对齐)基本操作:运算类指令:对寄存器或内存数据操作 传送类指...原创 2020-06-10 11:33:21 · 588 阅读 · 1 评论 -
信息的表示和处理(整数,浮点数)
一、信息的存储1.一些概念字节(8位的块):最小可寻址的存储器单位字:字长指明整数和指针数据的标称大小。字长决定虚拟地址空间大小。虚拟存储器:机器程序将存储器视为一个非常大的字节数组,数组中每个字节一个地址虚拟地址空间:概念性映像(随机访问存储器,磁盘存储器,特殊硬件、操作系统软件结合)2.寻址和字节顺序多字节的程序对象。存储为连续字节,地址为所用字节中最小的地址 小端法:低位低地址,大多数Intel兼容机 大端法:高位低地址,大多数IBM和Sun Microsystem原创 2020-06-08 20:25:53 · 644 阅读 · 0 评论 -
shlab7&8
一.任务1:1.比较trace09~10执行不同结果:①trace09:先在后台运行myspin 4,然后在前台运行myspin 5,接着休眠2s,发出TSTP信号使得前台进程挂起并成为后台进程,jobs输出结果make rtest09和make test09中都有下面的输出,myspin 4仍然在后台运行,myspin 5被stopped[1] (3448) Running ./myspin 4 &[2] (3450) Stopped ./myspin 5接着bg %.原创 2020-06-02 21:21:03 · 849 阅读 · 0 评论 -
虚拟存储器
目录1.为什么引入虚存的概念?2.物理和虚拟寻址3.地址空间4.虚拟存储器作为缓存的工具5.虚拟存储器作为存储管理的工具6.虚拟存储器作为存储器保护的工具7.地址翻译8.存储器映射1.为什么引入虚存的概念?一个系统中的进程与其他进程共享CPU和主存资源,存储器更加难以管理。 虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件、内核软件的完美交互 为每个进程提供一个大、一致的私有地址空间。能力:高效使用主存:将主存看成存储在磁盘上的地址空间的高速缓存,主存中只原创 2020-06-01 17:32:13 · 445 阅读 · 0 评论 -
shlab5&&6
1.任务1比较trace06执行不同结果,编程实现sigint handlet捕获INT响应、waitfg0等待、sigchld_ handler回 收僵死查看trace06.txt的内容以及make rtest06与make test06的输出比较:发现make test06没有相应输入命令中的INT发现在我们的main函数里面已经修改了信号SIGINT的默认行为,因此完善sigint_handler:sigint_handler:键盘输入ctrl+c时该函数处理SIG..原创 2020-05-26 19:11:11 · 1065 阅读 · 4 评论 -
buflab
这个实验利用缓冲区的溢出来进行攻击,要求我们十分熟悉函数栈以及函数调用时栈帧的变化情况综合利用反汇编后端代码和gdb调试来查看程序运行时的寄存器状态和内存里的数据,来必须能够熟练地预判栈指针的变化情况在最后的几个LEVEL更是要求我们掌握编写汇编代码要利用函数调用结束后的ret指令使得eip的值修改为函数的返回地址,以此让恶意代码获得执行权要注意当我们在执行完恶意代码以后如果要把执行权力还给原本要返回的函数,要恢复寄存器的状态原创 2020-05-24 22:04:59 · 1000 阅读 · 0 评论 -
ELF示例
原创 2020-05-21 08:30:08 · 244 阅读 · 0 评论 -
shlab3&4
1.编程实现eval()的后台作业管理功能并使用trace04验证分析:首先解析命令行参数,存入argv,parseline同时还会判断是不是在后台执行,如果是返回1,存入bg 调用builtin_cmd判断是否为内置命令,如果不是将返回eval函数,返回值为0 调用fork函数创建新的子进程,在子进程内调用execve运行命令行可执行文件,结束后退出 在父进程中如果不是后台运行程序,调用waitpid函数等待pid子进程结束,然后返回 如果是后台运行的程序,直接打印进程组jid和子进程原创 2020-05-20 21:40:13 · 1155 阅读 · 3 评论 -
链接过程概述&ELF目标文件格式
①可重定位目标文件(.o)其代码和数据可和其他可重定位文件合并为可执行文件 每个.o文件由对应的.c文件生成 每个.o文件代码和数据地址都从0开始②可执行目标文件(Linux默认为a.out , Windows中的*.exe)包含的代码和数据可以被直接复制到内存并被执行 代码和数据地址为虚拟地址空间中的地址③共享的目标文件(Linux中的*.so..原创 2020-05-17 19:32:35 · 705 阅读 · 0 评论 -
可执行文件生成概述(预处理-编译-汇编-链接)
一、预处理(cpp)1.预处理命令- $gcc -E hello.c -o hello.i- $cpp hello.c > hello.i2.处理源文件中以"#"开头的预编译指令,包括:删除"#define"并展开所定义的宏 处理所有条件预编译指令,如"#if" ,"#ifdef" ,"#endif" 等 插入头文件到"#include"处,可以递归方式进行处理 删除所有的注释"//" 和"/* */" 添加行号和文件名标识,以便编译时编译器产生调试用的行号...原创 2020-05-17 10:04:30 · 950 阅读 · 0 评论 -
链接二( 重定位)
链接二( 重定位&&动态链接)1.重定位过程可重定位文件 = 用到.o文件的集合E+定义符号的集合D将E中所有目标模块中相同的节合并: 对D中定义的符号重定位(确定新节中所有定义符号在虚拟地址空间中的地址) 对引用符号重定位(修改.text、.data节中对每个符号的引用,需要用到.rel_data、.rel_text中保存的重定位信息)①重定位信息...原创 2020-05-16 11:47:45 · 1494 阅读 · 0 评论 -
链接一(符号解析)
链接一、链接操作的步骤概述1.符号解析程序中有定义和引用的符号(包括变量和函数)。 编译器将定义的符号存放在一个符号表中。结构数组,.symtab节中。每个表项包含符号名、位置、长度等信息。 编译器将对符号的引用放在重定位节rel.text、rel.data。 链接器将每一个符号的引用与一个确定的符号定义建立关联。2.重定位多个代码段,数据段合并为一个单独的代码段和数据段 计算每个定义的符号在虚拟地址空间的绝对地址 可执行文件中的符号引用处的地址修改为重定位后的地址信息二、符号原创 2020-05-14 10:07:00 · 1382 阅读 · 0 评论 -
Shlab1&2
Shlab1&21.学会编译tsh.c,调用tsh文件traceXX.txt的功能验证方法:通过make clean和make指令来对tsh.c文件进行编译,如果没有语法错误将会如上图所示,编译成功。在tracexx.txt文件中都是一条一条已经写好的命令行语句,将会通过文件流输入的方式给予我们写好的shell代码,然后与给的tshref运行结果进行比较,如果相等则说明我们的代码是正确的。通过“make 跟踪文件”来对我们编写的tsh.c文件进行测试(如上左图),正确的标..原创 2020-05-13 14:35:39 · 1616 阅读 · 0 评论 -
异常控制流一(进程与进程的上下文切换)
一、正常控制流(1)按顺序取下一条指令执行(2)通过call,ret,jmp,jcc等指令跳转到转移目标地址处执行cpu控制流是什么?cpu所执行的指令的地址序列。二、异常控制流1.分类①内部异常(硬件层)整除0,溢出,缺页,越级,越权②外部中断(硬件层)打印机缺纸,ctrl+c,DMA结束等③进程上下文切换(操作系统层)2.程序和进程程序按某种方式形成的代码和数据的集合,静态的概念。进程程序关于某个数据集合的一次运行活动。动态的含义。不.原创 2020-05-12 16:47:07 · 940 阅读 · 0 评论 -
链接
链接1.回顾一下hello.c的编译过程:①预处理器cpp gcc -E hello.c -o hello.i (ascii码中间文件)将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码②编译器ccl gcc -S hello.i -o hello.s (ascii码汇编语言文件)“翻译”成汇编代码③汇编器as gcc -chello.s -o hello.o (可...原创 2020-05-11 21:22:12 · 366 阅读 · 0 评论 -
cachelab3
缓存实验cachelab31.M64N64、M61N67转置(s5E1b5):矩阵64x64规模,8分块处理结果:和没有分块的差别不大,没有什么改进效果。可以知道一共32组,每组一行,每行32个字节,可以存储8个整数。因此矩阵中一行每8个数占一个组,每4行填满整个cache。注意到如右上图,当矩阵规模较小的时候,分块8x8和4x4都不会出现同一个块里面有映射到相同组的方格。按8x8分块,因此每块包含竖直方向的两个格子,而且这两个格子对应数据映射到cache中同一个组。现在分析一原创 2020-05-10 19:38:12 · 944 阅读 · 0 评论 -
循环展开&k路并行&矩阵分块对程序性能的影响测试
总结:不命中率和分块大小、缓存的大小(s,b)、矩阵的规模有关原创 2020-05-07 10:26:48 · 535 阅读 · 0 评论 -
k路并行寄存器溢出&&循环展开
A.1.当三次循环展开+三个并行变量的时候有三条关键路径,每条路径之间无数据相关,可以并行执行。看上去关键路径上只有一个add,整数的add延迟为1。但是我们可以仔细分析流水线上各个操作的发射时间和延迟时间,来确定每一个操作开始的时间点。如下表: 循环次数 add开始时间 mull开始时间 ...原创 2020-04-26 21:59:57 · 566 阅读 · 0 评论 -
Cachelab2
Cachelab2Cachelab实验报告21.编写更新Lru计数值的函数代码。当某组中的某行hit或加载缓存成功时将这一行的Lru计数值赋值为最大值,而该组中其他行Lru计数值全部减一。分析:updateLruNumber通过传入的Sim_Cache* 参数获得缓存的信息。找到对应的setBits组,遍历组将hitIndex(命中)行的LruNumber设置为最大,改组其余行Lru...原创 2020-04-26 00:20:43 · 644 阅读 · 0 评论 -
CacheLAB1
cachelab-handout1.数据在内存中的地址数据在缓存中的位置这中间存在一种映射关系:把数据在内存中的地址分成三个部分:①tag:表明身份,缩小到某一个0~的地址变化范围内。②s:表明组号③b:表明偏移量,确定一个具体的地址。2.缓存中的一些术语:1.A cache is composed of:组2.A set is composed ...原创 2020-04-24 11:09:56 · 376 阅读 · 0 评论 -
提高程序性能(机器级指令流水&数据相关)
一、方法1.减少函数调用2.减少存储器访问次数3.代码转移二、CPU内部结构运算器,控制器,寄存器组合,内部总线等。一条写指令执行流程:指令的流水:(译指令不需要clk)1.指令串行执行:2.指令二级流水五级流水:如果各指令之间不存在相关性,那么它们在流水线中是可以并行执行的,这种指令间潜在的重叠就是指令级并行(Instruction-Level Paral...原创 2020-04-21 09:52:21 · 1234 阅读 · 2 评论 -
程序性能——流水线的关键路径
1.对于数据类型float:关键路径决定的CPE下界是add的延迟3,因此CPE=3。2.对于整数:加法的延迟时间是1,因此CPE=13.根据图中的流水线可以看出:①关键路径上只有一个add操作,而mul操作每个循环之间是没有数据相关的,因此,mul操作的开始只跟float乘法的发射时间有关;②它的发射时...原创 2020-04-20 23:11:08 · 920 阅读 · 0 评论 -
Vmware提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件
因为某些原因,之前VMWARE虚拟机运行的时候卡住,于是强制关机,再次打开时报错Vmware提示以独占方式锁定此配置文件失败,另一个正在运行的VMware进程可能正在使用配置文件。1.查看任务管理器,发现实际上有一台虚拟机正在运行。2.win+R键运行msconfig3.4.查看启动,发现现在VMware Tray Process被禁用重新启动计算机5....原创 2020-04-16 19:59:05 · 4023 阅读 · 0 评论 -
栈保护者Canary的实现细节
1.示例copy函数 汇编代码:失去栈保护的汇编代码:比对发现,在有栈保护的汇编代码中增加了一些指令,其中:mov %gs:0x14,%eaxmov %eax,-0xc(ebp)两句指令,是向栈中插入一个canary值。使用栈保护的copy函数栈是这样的:canary的值是随机生成的,在内存中保存有两份:①一个是保存在特殊的段内,这个段被标示为只读,不可修改。②另一个在栈...原创 2020-04-16 19:21:25 · 1650 阅读 · 0 评论 -
GCC对抗缓冲区溢出攻击
1.栈随机化①为了在系统中插入攻击代码,攻击者还要插入指向这段代码的指针。产生这个指针需要知道字符串的栈地址。②栈随机化使得程序每次运行栈的位置都有变化。不同机器运行同样的代码,栈的位置不一样。实现:程序开始时在栈上分配一个0~n字节的随机大小空间。使用分配函数 alloca 在栈上分配指定字节数量 的空间。程序不使用这段空间,但是它会导致程序每次执行时后续的栈位置发生了变化...原创 2020-04-16 08:28:00 · 539 阅读 · 0 评论 -
c语言汇编条件传送和条件转移
条件传送和条件转移 v = test-expr ? then-expr : else-expr; 条件转移:当条件满足时,程序沿着一条执行路径进行,而当条件不满足时,就走另一条路径。 if (!test-expr) goto false; v = true-expr; goto done; false: v...原创 2020-04-09 09:23:25 · 1084 阅读 · 0 评论 -
do-while while for循环的汇编级比较
目录:1.do-while循环2.while循环3.for循环1.do-while循环do body-statement while (test-expr) ; 效果:重复执行 body-statement, 对七est-expr 求值,如果求值的结果为非零, 则继续循环。可以看到, body-s 七扛 emen 七至少会执行一次。翻译成goto语句:loop: body-...原创 2020-04-09 08:40:01 · 499 阅读 · 0 评论