美文网首页
存储系统—虚拟地址

存储系统—虚拟地址

作者: 上古数记 | 来源:发表于2023-04-13 21:55 被阅读0次

    整个存储系统,从高速缓存,到主存,再到外存涉及到的虚拟存储,正如下图总图所示。对存储系统的考查都是紧紧围绕这幅图进行的。与以往离散繁多的课本不同的是,这里希望从系统整体入手,抽丝剥茧,拉出一条逻辑主线,又紧密联系存储系统的每个部分,划出真题重点,进而尝试搭建一个具有足够准确率的应试答题模型。

    这幅图中,我想第一个要理解到位的是:逻辑地址是什么?

    逻辑地址的出现追溯到可执行代码装入内存时,必须进行地址重定位,通过地址转换将逻辑地址转换为物理地址。而可执行代码装入内存其实就是在创建进程了。所以整个解答思路大概就变成了理解什么是程序和进程?然后源程序转换为进程前需要经过编译、链接和装入,这个过程中是如何催生出逻辑地址这个工具的?

    那么究竟什么是程序?什么是进程?这个问题可以从思考这一组概念入手。指令、数据、程序、进程。

    程序=数据结构+算法。我觉得这个说法是正确的。而网上很多说法是程序是由指令和数据组成,我觉得这个说法是错误的。理由很简单,就是数据结构不等于数据,而是数据类型。而指令更加不等同于算法,算法是必须要实现某一功能的。指令,比如加法指令,减法指令,指示计算机执行某种操作的命令,是接近原子性的概念。

    程序段+数据段+PCB进程控制块=进程,创建PCB就是创建了一个进程。进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。进程与程序之间不是一一对应的。同一程序运行于若干不同的数据集合上,它将属于若干个不同的进程;而一个进程可以执行多个程序。创建进程首先要将程序和数据装入内存。

    试想自己用C语言写了一个C文件高级语言程序,里面自然包括结构体、函数算法和变量数据,这也就是说C文件包含着只读代码段和读/写数据段。这个C文件也叫做用户源程序。那么,源程序要最终变为在内存中执行的目标程序exe文件。通常需要编译、链接、装入。可以搜一下这三个动词的解释。编译后是源程序编译成若干目标模块,每个目标模块从0开始编址。链接是将各个目标模块和和它们需要的库函数链接在一起,链接成一个完整的可执行目标程序exe,构成统一的从0号单元开始编址的逻辑地址空间,也叫虚拟地址空间。可执行文件是存放在硬盘上的,也就是在外存里。现在,可执行文件要从外存调入内存。装入程序进行地址重定位,通过地址转换将逻辑地址转换为物理地址,将可执行代码从外存装入内存,这是由操作系统通过内存管理部件MMU完成的。至此,一个源程序或者说进程的只读代码段和读/写数据段就装入了内存。

    当一个程序调入内存时就构成了进程的内存映像。记住,每个进程都有一个单独的内存空间。这是通过内存保护实现的,也就是采用重定位寄存器(又称基地址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护的。下图给出了内存中的一个进程。注意,其中“从可执行文件装入是数据及代码”这部分才是刚刚编有逻辑地址的部分。这里要强调一点,程序代码和数据在主存中分开存储。这么做,好处有很多,1、程序代码只读,数据读写,防止程序的指令被有意或无意地改写。2、提高程序的局部性,提高CPU的缓存命中率。3、最为重要的是:代码段是可以共享的,数据段是私有的,当运行多个程序的副本时,只需要保存一份代码段部分,这样可以大量节省内存空间。

    我的理解是,编逻辑地址就是为了给个序号去标记源程序文件中原有的代码。为了保持源程序内部代码的本身的逻辑有序,需要通过地址让它们内部有序,这样装进外部内存时,无论如何装在内存的哪个物理空间,通过序号和排序都能保持住整个代码功能。进程在运行时,看到和使用的地址都是逻辑地址,也故而总图3.28中一开始说CPU给出虚拟地址VA。

    相关文章

      网友评论

          本文标题:存储系统—虚拟地址

          本文链接:https://www.haomeiwen.com/subject/splzddtx.html