存储器(非重要)

DRAM(动态存储器)和SRAM(静态存储器)的对比

DRAM和SRAM的区别

分类

  • RAM: Random Access Memory
    • SRAM
    • DRAM
    • SDRAM,DDR SDRAM
  • ROM: Read Only Memory

    • PROM,EPROM,EEPROM
  • Flash memory(SSD)

    • Nor
    • NAND
  • Disk(磁盘)

  • Tape(磁带)

GCC包含的几个工具

  • CC1 : 预处理器和编译器
  • as : 汇编器
  • collect2 : 链接器

程序装入、执行的过程

一般要经历预处理、编译、链接、重定位、装入。

链接

链接的本质

重定位

重定位分为静态重定位和动态重定位。

装入

流程

  1. ELF头魔数检验
  2. 找到段表项
  3. 根据段表项解析出各个段应当被加载到的虚地址,在文件中的偏移。
  4. 正式加载每一段,分配物理页面,并按虚地址映射。
  5. 用0填充内存和文件大小不匹配的区域
  6. 改PC为入口地址
  7. 开始执行

我们只需要了解bss段,data段和text段。
bss:用来存放程序中未初始化的全局变量的一块内存区域。bss是英文Block Started by Symbol的简称。bss段属于静态内存分配。
data:数据段(data segment)用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
text:代码段(code segment/text segment)用来存放程序执行代码的一块内存区域。

  1. text和data段都在可执行文件中,由系统从可执行文件中加载,而bss段不在可执行文件中,由系统初始化。 (一般为0)
  2. 一个装入内存的可执行程序,除了bss、data和text段外,还需构建一个栈(stack)和一个堆(heap)
  3. 你可以认为一个程序就是由bss、data和text段组成的

栈和堆

  • 栈:存放局部变量,函数压栈(静态)
  • 堆:存放malloc等分配的内容(动态增缩)

整体细节

  • 程序的入口点一般不是main函数,在此之前要做一些准备才能跳转到main函数。
  • 一个segment在文件中的大小是小于等于其在内存中的大小。
  • 如果在文件中的大小小于在内存中的大小,那么在载入内存时通过补零使其达到其在内存中应有的大小。
  • 代码段和数据段都在segment中

ELF文件

ELF
这个连接将程序头表/段头表讲的很清楚,注意的是他以64位为基础。ELF 文件解析 3-段
这个连接将节头表讲的很清楚,注意的是他以64位为基础。ELF 文件解析 1-节

记住几个结构体的名字:
Elf32_Ehdr 是ELF文件头的数据结构。
Elf32_Shdr 是节头表表项的数据结构。
Elf32_Phdr 是段头表表项的数据结构。

存储管理

基石

  1. 地址独立:程序发出的地址与物理地址无关
  2. 地址保护:一个程序不能访问另一个程序的地址空间

    解决的问题

    分配和回收

    分配

    三种方式

    直接指定、静态分配、动态分配。

    直接指定

    用实际物理地址进行分配

    静态分配

    均从逻辑地址的0地址开始,链接装入时才能确认在物理内存中的地址

    动态分配

    同样是装入时确认在物理内存中的地址,但可以动态控制程序的大小

内存管理

单道程序比较简单、采用直接指定的方式。

多道程序

空间分配

分区式分配:把内存分为一些大小相等或不等的分区(partition),每个应用程序占用一个或几个分区。操作系统占用其中一个分区。

可以支持多个程序并发,但难以进行共享。

划分分区的方法

固定式分区

定义

把内存划分为若干个固定大小的连续分区。

分配方式
  • 单队列分配:无论大小,统一排队等待分配
    单一队列
  • 多队列分配:根据分区的大小,开多个队列针对各个分区进行分
    多队列
    总结
  • 优点:易于实现,开销小
  • 缺点:内碎片造成浪费,分区数目固定,限制了并发程序数目
  • 数据结构: 分区表,记录分区大小和使用情况

可变式分区

定义

分区的边界可以移动,即分区的大小可变。

分配算法
  • 首次适应:每个空白区按其在存储空间中地址递增的顺序连在一起,在为作业分配存储区域时,从这个空白区域链的始端开始查找,选择第一个足以满足请求的空白块。
  • 下次适应:把存储空间中空白区构成一个循环链,每次为存储请求查找合适的分区时,总是从上次查找结束的地方开始,只要找到一个足够大的空白区,就将它划分后分配出去。
  • 最佳适应算法:为一个作业选择分区时,总是寻找其大小最接近于作业所要求的存储区域。
  • 最坏适应算法:为作业选择存储区域时,总是寻找最大的空白区
  • 快速适应算法:把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。分配时根据索引直接查表,取下合适的空闲区链表首项即可。
  • 伙伴系统:分区均为2的n次幂,对于一个分配请求,向上取整找最合适的,如果没有,就将大的拆成两个最合适的,一个挂在表中,一个分配,这两个成为伙伴,只有两个同时空闲,就会向上重新合并成大的,直到合不了位置。
碎片
  • 内碎片:指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片。
  • 外碎片:指系统中无法利用的小的空闲分区。如分区与分区之间存在的碎片。这些不连续的区间就是外部碎片。动态分区管理会产生外部碎片,可以通过紧凑进行进行缓解,通过多重分区分配进行缓解。

    一个作业往往由相对独立的程序段和数据段组成,将这些片断分别装入到存储空间中不同的区域内的分配方式。

分区保护

  1. 界限寄存器:上下界寄存器方法、基址、限长寄存器方法。
  2. 存储保护键方法:给存储块配锁,访问前看锁和钥匙是否匹配。

内存扩展

覆盖

定义

把一个程序划分为一系列功能相对独立的程序段,让执行时不要求同时装入内存的程序段组成一组(称为覆盖段) ,共享主存的同一个区域,这种内存扩充技术就是覆盖。

工作主体

程序员指明覆盖结构,操作系统完成。

图示

覆盖

交换

定义

广义的说,所谓交换就是把暂时不用的某个(或某些)程序及其数据的部分或全部从主存移到辅存中去,以便腾出必要的存储空间;接着把指定程序或数据从辅存读到相应的主存中,并将控制转给它,让其在系统上运行。

工作主体

操作系统独立完成。

图示

交换

区别

  • 覆盖可减少一个程序运行所需的空间。交换可让整个程序暂存于外存中,让出内存空间。
  • 覆盖是由程序员实现的,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。交换技术不要求程序员给出程序段之间的覆盖结构。
  • 覆盖技术主要对同一个作业或程序进行。交换主要在作业或程序间之间进行。