操作系统学习笔记(六):地址空间和地址生成

从我们写的代码到最后在总线上出现的物理地址,有一个转换的过程,在学习具体的转换算法之前,我们需要学习地址生成的过程。生成过程中并不是所有地址都允许访问的,因此还需要对地址的合法性进行检查。

地址空间定义:

计算机地址空间有两种,物理地址空间和逻辑地址空间。物理地址空间就是硬件支持的真实地址空间,这是受硬件支持的,比如32位的系统,就是从0到4G-1的位置。逻辑地址空间就是在CPU中运行的进程看到的地址,这个地址是从物理地址空间中分配的一段或几段子空间。这两者之间的转换方法后面再讲。

操作系统学习笔记(六):地址空间和地址生成_第1张图片

地址生成及处理过程:

整体可以分为如下几个步骤,ALU需要逻辑地址中的内容(读或写),MMU对逻辑地址进行转换,转换为物理地址,CPU控制逻辑给总线发送物理地址请求。内存发送物理地址的内容给CPU或者将CPU给的数据存储到物理地址。操作系统做的是简历逻辑地址LA和物理地址PA之间的映射。

逻辑地址生成:

生成过程如下图。比如最开始是高级语言写了一段代码,其中有一个函数foo();首先要进行编译,编译为机器能够识别的汇编语言;之后进行汇编,将函数名从字符串变为地址75;而这个函数可能是某个函数库中的成员,而函数库的位置程序是不知道的,这就需要链接,将需要的文件拼接起来,此时可能在原先的代码前面插入了一段代码,比如地址偏移了100,此时函数地址变为了175;最后需要进行程序加载即重定位,因为这段程序不一定是从逻辑地址的0位开始的,比如是从1000开始的,那么函数地址成为1175。经历了这么多步骤之后,生成的1175才是我们需要的逻辑地址。

操作系统学习笔记(六):地址空间和地址生成_第2张图片

那么逻辑地址是在什么时间生成的呢:

1. 编译时。假定起始地址已知,也就是我知道我的程序要放在哪,那么编译时就可以生成逻辑地址。但是当起始地址改变时,比如修改了代码,必须重新编译。老旧的功能机买来之后不允许下载软件,这种情况下地址通常就是写死的。

2. 加载时。当你修改了代码或者安装了各种新的软件,写程序时是无法知道新的代码存储在什么地址的。也就是编译时起始位置未知时,编译器需生成可重定位的代码,等到加载时重定位,生成绝对地址。通常在可执行文件的前面有一个重定位表,加载的时候改成绝对地址,程序就可以跑了。

3. 执行时。执行到这条指令之前一直使用相对地址,当执行到这一条指令的时候,才可以去知道它确切访问的地址。这种情况出现在使用虚拟存储的系统里。优点就是在程序执行过程中就可以将代码移动,而前面两种生成时机都不可以。但是需要地址转化硬件支持,相对较麻烦。

地址检查:

CPU执行到某条指令,得到它的逻辑地址,首先根据逻辑地址判断所在它的偏移量是否在所在段(比如数据段)的长度之内,如果超出了段长度,认为是非法请求,否则认为是合法的。此时加上段基址得到物理地址,进行访问。在这个过程中操作系统要做的就是设置段起始地址和最大逻辑地址空间(段长度)。

你可能感兴趣的:(操作系统学习:清华大学学堂在线)