计算机系统
文章平均质量分 53
小尘_OnMyWay
身若孤鸿,志在天间。
展开
-
ICS大作业--程序人生
原创 2021-06-27 20:24:01 · 71 阅读 · 0 评论 -
系统级IO
1. IO接口接口:连接CPU和外设之间的部件,它完成CPU于外界的信息传送。还包括辅助CPU工作的外围电路,如中断控制器、DMA控制器、定时器、高速CACHE。IO接口框图:接口的十大功能:输入输出功能数据缓冲功能联络功能数据转换功能中断管理功能提供时序控制功能寻址功能可编程功能电器特征的匹配功能错误监测功能2. 端口端口的概念:1. 软件上:接口中程序员可编程读写的寄存器地址。2. 硬件上:接口电路中的寄存器等。端口的分类:1. 数据口:输入、输出的数据信息2原创 2021-06-21 15:32:38 · 192 阅读 · 0 评论 -
动态内存分配--显式空闲链表
显式空闲链表在空闲块中使用指针连接空闲块,仅仅需要关注空闲块,数据结构如下:仍然需要边界标记来进行空闲块合并。显示空闲链表的释放LIFO后进先出法:将新释放的块放置在链表的开始处(常数时间;碎片太多)地址顺序法:按地址顺序维护链表(需要搜索;碎片少于LIFO)小结与隐式空闲链表相比:分配时间从块总数的线性时间减少到空闲块数量的线性时间(当大量内存被占用时快得多)因为需要在列表中拼接块,释放和分配稍显复杂每个块需要额外两个字...原创 2021-06-14 10:31:03 · 1051 阅读 · 0 评论 -
动态内存分配--隐式空闲链表
Implicit List 隐式空闲链表对于每个块都需要知道块大小和分配状态,这样可能需要两个words,但是由于块是对齐的,比如8字节对齐,则块大小的低三位恒为0,这样就可以使用低三位来存储分配状态。在实际设计中,往往使用最低位标记已分配/未分配状态。1. 如何找到一个空闲块1. 首次适配(First fit)从头开始搜索空闲链表,选择第一个合适的空闲块可以取总块数(包括已分配和空闲块)的线性时间会在靠近链表起始处留下小空闲块的碎片(长期运行后)2. 下次适配(Next fit)和原创 2021-06-14 10:10:48 · 1241 阅读 · 0 评论 -
动态内存分配--基本概念
在程序运行时程序员使用动态内存分配器(如malloc)获得虚拟内存,动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视为一组不同大小的块(blocks)的集合来维护,每个块要么是已分配的,要么是空闲的。分配器的类型:显示分配器:要求应用显示地释放任何已分配的块隐式分配器:应用检测到已分配块不再被程序所使用,就释放这个块(GC)动态内存分配器:无法控制分配块的数量和大小立即响应malloc请求必须从空闲内存分配块必须对齐块,使得它们可以保护任何类型的数据对象只能操作或改原创 2021-06-14 09:21:03 · 269 阅读 · 0 评论 -
虚拟内存--概念
1. 地址空间物理地址:是内存单元的绝对地址,计算机的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址,例如0x0代表主存的第一个物理单元,0x15代表第16个物理单元,所有地址最终处理结果都是物理地址。在CPU实模式下,由段基址*16+段偏移就得到了物理地址。线性地址/虚拟地址:CPU保护模式下,段基址+段偏移叫做线性地址,段寄存器中存储的并不是真正的段基址,需要以段描述符作为下标,到GDT/LDT表查表获得段地址,段地址+偏移地址=线性地址。当开启分页功能后,线性原创 2021-06-13 15:50:20 · 382 阅读 · 0 评论 -
signal信号处理函数
signal()的函数声明:void (*signal(int sig, void (*func)(int)))(int)看起来十分复杂,实际上也就是设置了一个信号处理程序,对于信号码为sig的信号,设置对应的信号处理函数为func(这里func带有一个int型的参数)。一个例子:#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>void s原创 2021-06-06 17:39:47 · 565 阅读 · 0 评论 -
异常控制流--信号与非本地跳转
1. Shellshell是一个交互型应用级程序,代表用户运行其他程序。(shell执行一系列读/求值步骤。读步骤读取用户的命令行;求值步骤解析命令,代表用户运行)一个简单的shell例子:int builtin_command(char **argv){ if(!strcmp(argv[0],"quit"))/*quit command*/ exit(0); if(!strcmp(argv[0],"&"))/*Ignore singleton &*/ return 1;原创 2021-06-03 11:03:16 · 107 阅读 · 0 评论 -
异常控制流--异常与进程
1. 异常控制流控制流:处理器从加电到断电,只是简单的读取和执行一个指令序列(每次执行一条指令),这个指令序列就是处理器的控制流。改变控制流的两种机制:跳转和分支(Jumps and branches)调用和返回(Call and return)能够对(由程序变量表示的)程序状态的变化做出反应。不足之处:难以对系统状态的变化做出反应。(如磁盘或网络适配器的数据到达、除零错误、键盘输入、系统定时器超时等)为了应对这些不足之处,现代计算机系统需要针对“控制流发生突变”的情况作出反应,称为“异常原创 2021-06-02 21:59:15 · 280 阅读 · 0 评论 -
从矩阵乘法看高速缓存
矩阵乘法的例子:描述:N*N矩阵相乘矩阵元素double类型(8字节)总共O(N3)O(N^3)O(N3)个操作每个元素都要读N次每个目标中都要对N个值求和(但也可以保存在寄存器中)矩阵相乘不命中率分析:假设:块大小 = 32B矩阵的维数(N)非常大缓存不是大到足够容纳多行分析方法:看内循环的访问模式ijk型:/* ijk */for (i=0; i<n; i++) for(j=0; j<n; j++){ sum = 0.0; for(k=0;原创 2021-05-31 14:56:41 · 532 阅读 · 0 评论 -
高速缓冲器Cache
1. 高速缓存的概念根据程序运行存取的局部性原理,于是提出了高速缓存(Cache)的概念,Cache是一种更小、速度更快的存储设备。作为更大、更慢存储设备的缓存区。存储器层次结构的基本思想:对于每个k,位于第k层的更快更小的存储设备作为位于k+1层的更大更慢存储设备的缓存。根据局部性原理,程序访问第k层的数据比访问第k+1层的数据要频繁。第k+1层更大、更慢、更便宜的设备被划分成块,数据以块为传输单位在层与层间进行传输复制,第k层存储第k+1层数据块的子集。2. 缓存不命中冷(强原创 2021-05-31 13:56:37 · 383 阅读 · 0 评论 -
存储器层级结构与局部性
1. 磁盘1.磁盘的结构磁盘由盘片构成,每个盘片包含两面每面由一组称为磁道的同心圆组成每个磁道划分为一组扇区,扇区之间由间隙隔开同一半径上的所有磁道组成一个柱面2.磁盘的容量容量:磁盘上可以存储的最大位数。决定因素:记录密度(位/英寸):磁道以一英寸的段中可以放入的位数。磁道密度(道/英寸):由盘片中心出发半径上一英寸的段内可以有的磁道数。面密度(位/平方英寸):记录密度与磁道密度的乘积。分区记录:现代磁盘将所有磁道划分为若干组,组内各磁道相邻(一个扇形区域,并产生了每磁道原创 2021-05-31 13:07:49 · 256 阅读 · 0 评论 -
Y86-64指令执行组织成阶段
通常,处理一条指令包括多个操作。将它们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有指令都遵循统一的序列。每一步的具体处理取决于正在执行的指令。一条指令的处理可以划分为以下六个阶段:取指(fetch):取指阶段从内存读取指令字节,地址为程序计数器(PC)的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。它可能取出一个寄存器指示符字节,表明一个或两个寄存器操作数指示符rA和rB。还可能取出一个8字节的常数valC。译码(decode):译码阶原创 2021-05-04 16:14:28 · 487 阅读 · 0 评论 -
可执行目标文件的结构
可执行目标文件的结构:ELF头:以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序,ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息。(ELF头的大小、目标文件的类型、机器类型、节头部表的文件偏移、节头部表中条目的大小和数量)段头表(可执行文件.out才有这部分):包含各个段的信息。.text:已编译程序的机器代码。.rodata:只读数据,比如printf语句中的格式串和开关语句的跳转表。.data:已初始化的全局变量和静态C变量。.bss:未初始化的全原创 2021-05-04 10:34:26 · 1132 阅读 · 0 评论 -
静态局部变量
静态局部变量:静态局部变量在函数内定义,生命周期为整个源程序;但其作用域和局部变量相同,仅能在定义它的函数内使用。函数返回后,尽管其仍然存在,但不能被使用。当一个函数被多次调用且需要保存每次调用后的结果时,则可以采用静态局部变量。比如订票系统中对票数的操作等。...原创 2021-05-04 09:32:23 · 202 阅读 · 0 评论 -
C语言的内存分配方式
C语言中内存分配方式有三种:从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序运行期间一直存在。例如全局变量,静态变量。从栈上分配。在执行函数时,函数内部变量的存储单元都在栈上分配空间,函数执行结束时自动释放这部分空间。从堆上分配,也叫做动态内存分配。程序在运行时用malloc或new申请任意多的内存,程序员需要手动free或delete释放内存。程序运行时的内存空间:栈区:由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区:由程序原创 2021-05-04 09:22:21 · 3668 阅读 · 1 评论 -
链接
静态链接与动态链接原创 2021-04-16 22:27:09 · 91 阅读 · 0 评论 -
示例解析缓冲区溢出攻击的原理
在为C语言的数组等赋值时,可能赋值大小超出了数组的长度限制,这时超出的部分就会覆盖掉栈中其他部分的内容,从而发生缓冲区溢出。下面用一个危险的例子进行说明:在这个程序中,我们利用strcpy()函数进行赋值操作。C代码:#include <stdio.h>#include <stdlib.h>#include <string.h>void StringCopy(char *str){ char p[10]; strcpy(p,str);}vo原创 2021-04-16 19:44:14 · 1198 阅读 · 0 评论 -
解析C语言及对应的汇编指令--复杂数据类型
1. 数组C代码:#include <stdio.h>#include <stdlib.h>int main(){ //数组的初始化 int a[10] = {1,2,3,4,5}; //数组的访问 int b = a[2]; //数组的循环 for(int i=0;i<10;i++){ printf("%d\n",a[i]); } //数组的修改 a[0]=100; retu原创 2021-04-16 17:09:58 · 750 阅读 · 0 评论 -
解析C语言及对应的汇编指令--栈与函数调用
1. 栈结构在内存栈区中,%rbp指向当前栈底,%rsp指向当前栈顶;当发生函数调用时,会将下条指令返回地址压栈,并设置为新的栈底%rbp;然后给局部变量预留空间(栈顶指针%rsp上移)。2. 反汇编解析C代码:#include <stdio.h>#include <stdlib.h>int sum(int a,int b){ int sum = a + b; return sum;}int main(){ int a = 1;原创 2021-04-16 16:16:47 · 699 阅读 · 0 评论 -
解析C语言及对应的汇编指令--流程控制语句
文章目录1. 分支控制 if else2. for循环3. while循环4. do...while循环5. switch语句1. 非跳转表2. 跳转表本文主要解析C语言中的流程控制语句if else、for、while、do while、switch语句的汇编指令。操作系统:Ubuntu64位IDE: Codeblocks汇编格式:AT&T1. 分支控制 if else#include <stdio.h>#include <stdlib.h>int mai原创 2021-04-16 15:40:49 · 1426 阅读 · 0 评论 -
解析C语言及对应的汇编指令--基本赋值操作
本文通过解析C语言中一些赋值操作对应的汇编程序,来更好的理解C语言程序的机器级表示。运行环境: Ubuntu64位IDE: Codeblocks汇编格式: AT&TC语言程序:(程序在windows下执行可能会出错)#include <stdio.h>#include <stdlib.h>int main(){ int num1 = 123; int num2 = num1; float num3 = num2; dou原创 2021-04-15 17:26:25 · 3212 阅读 · 0 评论 -
intel和AT&T汇编格式区别
汇编程序具有两种标准的格式:windows下一般为intel格式;linux下一般为AT&T格式。两种汇编格式对比:intelAT&T寄存器前缀eax%eax源、目的操作数顺序mov ebx,eax (eax送给ebx)mov %eax,%ebx(eax送给ebx)常数/立即数的格式mov ebx,0d00dhmov $0xd00d, %ebx操作数长度标识mov bx, word ptr var_x(byte_ptr-1、word_原创 2021-04-14 19:21:23 · 367 阅读 · 0 评论 -
8086处理器的指令系统
8086处理器的指令系统包括六种类型:数据传送指令算术运算指令逻辑运算指令串操作指令控制转移指令处理器控制指令1.数据传送指令指令作用MOV传送PUSH、POP堆栈操作XCHG交换IN、OUT外设输入输出XLAT转换/换码/翻译LEA(Load Effective Address)、LDS、LES地址传送PUSHF/POPF、LAHF/SAHF标志传送2.算术运算指令指令作用ADD、ADC、原创 2021-04-14 18:54:54 · 796 阅读 · 0 评论 -
8086处理器的寄存器组
–原创 2021-04-14 10:53:33 · 922 阅读 · 0 评论 -
C语言的移位操作
1. C语言的移位原创 2021-04-12 19:34:51 · 9273 阅读 · 0 评论 -
浮点数的底层存储原理
原创 2021-04-06 19:45:23 · 1482 阅读 · 0 评论