【操作系统复习】ch3 内存基础
内存基础
- 内存存储数据与指令,如果想让数据交给cpu进行处理,需要将数据放入内存。
- 内存一般按字/字节进行编址
- 指令一般包含操作码以及若干参数,有些参数是存储在内存当中的,表明的就是内存的地址
- 逻辑地址:在程序编译链接之后生成的可执行文件里的指令中表明的地址是逻辑地址,而这个逻辑地址,是相对于进程的起始地址。也就是编译链接后逻辑认为这些指令与数据放在一片连续的空间中,这个逻辑空间也会按照字/字节进行编址,其中指令里面表明的地址就是这个变量在逻辑空间的地址
- 物理地址:内存的客观编址的地址。因为程序只有装入内存才能够运行。而进行编译链接后的可执行文件中的地址只是逻辑地址,CPU运行需要知道数据的物理地址。所以操作系统需要提供进程的逻辑地址到物理地址的映射机制
装入方式
上述已经说明,逻辑地址在载入内存时候需要进行到物理地址的映射。
装入方式:
- 绝对装入
在编译的时候,如果知道程序将要放到内存的具体位置,就可以将逻辑地址替换为绝对地址。灵活性非常差,一般只能单道程序环境。而且换一台电脑就没法用了。 - 静态重定位
在程序装入内存进行地址转换,将所有的逻辑地址加/减上一个数。缺点是必须为这个进程第一次就分配全部的内存空间。而且在装入内存之后不能调整进程在内存中的位置 - 动态重定位
在程序运行的再进行逻辑地址到物理地址的映射。装入内存时候并不将逻辑地址转换为物理地址,只有在该指令运行的时候,将逻辑地址转换为物理地址。这个方法需要一个寄存器。这个寄存器里面存装入内存的初始地址,然后逻辑地址加上这个寄存器的值就可以得到物理地址。
优点:可以将程序分配到不连续的存储区,可以动态分配内存空间等。
链接
整体的程序需要经历编译再链接再装入这个过程。
一般在编写程序都是按照模块进行编写,模块内部的程序的逻辑地址就是模块内的逻辑地址。那么如果有好几个程序模块需要组装起来就需要就该这些模块的逻辑地址。相当于这几个分散的逻辑空间要组合成一个更大的逻辑空间。每个逻辑地址需要修改为这个新的逻辑空间的地址。
链接也有三种方法:
- 静态链接:在程序运行之前就跟库函数链接成一个完整执行文件,之后不再拆分
- 装入时动态链接:将各个目标模块装入内存时候,边装入边链接
- 运行时动态链接:在程序执行需要用到这个模块时,才对他调入内存进行链接