王道操作系统学习笔记,心得
1. 什么是内存,内存的作用
内存的作用:储存数据。
程序执行前,需要先将程序放到内存中才能被CPU处理。之所以这样,是因为CPU的速度和硬盘(外存)的速度差异太大,中间的这层内存就是为了缓和这样的矛盾。
在多道程序环境下,系统中会有多个程序并发执行,也就是说会有多个程序的数据需要同时放到内存中。为了区分各个程序的数据存放的位置,就需要对内存进行编址。
2. 逻辑地址到物理地址
一个程序经过编译链接后生成的指令操作地址是逻辑地址,逻辑地址的起始位置是0。
但是这个程序运行时需要被装载到内存上,这时这个程序的被装载的位置不一定时从0开始,程序在内存的地址称为物理地址,所以这就涉及到了从逻辑地址转化到物理地址的方法了。
绝对重装:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
绝对重装的灵活性比较差,只适用于单道程序的环境。
静态重定位(可重定位装入):编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入内存时一次完成的)。
特点:
- 作业在装入内存时,内存必须将这个作业需要的空间开辟好,如果没有足够的空间,不进行装入。
- 程序运行期间不能再移动,也不能再申请其他空间。
动态重定位(动态运行时装入):编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
特点:
- 采用动态重定位时允许程序在内存中发生移动。
- 可将程序分配到不连续的存储区中,在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
3. 编译链接
源文件经过编译转化为机器指令,一些机器指令经过链接生成可执行程序(装入模块)链接后将生成完整的逻辑地址。
在链接的过程中有三种链接方式
- 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
- 装入时动态链接:编译好后先不链接,当程序被装入内存时进行链接(边装入边链接)。
- 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。(需要什么模块就链接什么模块)
4. 操作系统内存管理的基本概念
操作系统对内存的管理包括四部分:
- 内存的分配和回收
- 内存空间的扩展:虚拟内存。操作系统需要从逻辑上对内存空间进行扩充
- 地址转化:为了使编程方便,从逻辑地址到物理地址的过程应该由操作系统负责。(三种装入方式)
- 内存保护:保证在内存的进程之间数据不会相互干扰。
内存保护的常见方式:
- 在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
- 采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。