【我所認知的BIOS】—>虛擬存儲機制

来源:互联网 发布:qq飞车淘宝 编辑:程序博客网 时间:2024/05/16 09:56

【我所認知的BIOS—>虛擬存儲機制

By LightSeed

2009-8-1   

在文章的前面我想说,如果您对全局描述符,段选择子,保护模式等,一点概念都没有的话,那么我不建议继续往下看。因为这篇文章是建立在那些基础之上的。这样的话,我建议您看看关于保护模式的资料再继续。比如说:【我所認知的BIOS—>實模式&保護模式有比较简单地介绍。

 

1、分段管理VS分页管理

X86上的内存管理机制我们可以分为两部分,分页管理机制和分段管理机制。其实他们都是虚拟存储机制。

不管怎么说,这两种机制都是为了能够在同一个CPU上实现多任务(而且任务与任务之间不相互干扰)而做的。我想,看到这里的人肯定会问那么既然他们都是这样的目的,那么为什么要分开来说呢?他们当中有个比较明显(不一定是最重要哦)差别就是段的大小是可变的。(当然在规定的范围内)而页管理机制则每页都是相同大小的。

而且,当我们的CPU运行在保护模式的时候,(某时)必须要用到段的形式,所以说分段管理机制是不能被disable的,而分页管理机制却是可选的。虽然两种机制的存在都是为了实现多任务,程序之间不相互干扰。然而,他们却可以在单任务的时候可以用这两种机制。

不的不再一次引用一下杨季文老师的原话,(呵呵。。。因为他表达的太经典了。)

分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称为页。通过在线性地址空间的页与物理地址空间的页建立之间建立的映射表,分页管理机制实现线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就等同于物理地址空间,线性地址就等于物理地址。

分段管理机制所使用的可变大小的块,使分段管理机制比较适宜处理复杂系统的逻辑分段。存储块的大小可以根据适当的逻辑含义进行定义,而不用考虑固定大小的页所强加的人为限制。每个段可作为独立的单位处理,以简化段的保护及共享。分页机制使用的固定大小的块最适合于管理物理存储器,无论是管理内存还是外存都同样有效。分页管理机制能够有效地支持实现虚拟存储器。

2、逻辑地址,线性地址,物理地址

要说清楚虚拟存储机制,那么逻辑地址,线性地址,物理地址这三个概念又必须要详细讲讲。所以也专门列一个小节。让我们来看看他们的概念,不过在看概念之前,先看看这样一句话。(笔者:提醒您,如果您把这些都想像成保护模式下的内存我想会比较贴切。当然实模式下也是同样的,只是实模式下的段选择子已经被隐藏地很深了。)

分段管理机制可以把CPU能够访问到的内存空间分成更小的可以保护的地址空间。

 

Linear Address(线性地址):我们把上面句话中“CPU能够访问到的内存空间”叫做线性地址。[笔者:把“更小的可以保护的地址空间”叫做段(
segment
),而段又可以分成若干页。这个概念一定要牢记哦。]

Logical Address(逻辑地址):当我们要去定位自己希望定位的段(segment,不是段选择子哦)时,那么我就需要用到一个指针(pointer)。比如说08FFFFFFF0。那么这个指针就是逻辑地址。逻辑地址又叫做长指针(far pointer)。

Physical Address(物理地址):CPU要访问内存必须要通过时,要给出内存单元的地址。所有的内存单元组成在一起是一个呈线性的空间。每个空间里面存储着我们的数据,而且这每一个空间都有一个唯一的地址,我们将这个唯一的地址就称为物理地址。(笔者:这段话主要是参考《汇编语言》王爽老师着)

3、三个地址之间的联系

我列出了这三个地址的诠释,那么让我们来看看这三个地址究竟又是怎么样联系起来的呢?参见图1

 

 

1 三个地址的联系

让我来详细解释一下上面这个图,先看蓝颜色框框中,分别标注了Logical AddressLinear Address SpacePhysical Address Space。在Logical Address中,segment selectorindex的作用。(如果您记得不太清了,烦请您到《实模式与保护模式》这篇文章中去看看,我是怎么诠释的。或者去查一查programming的第三章。)经过计算可以定位所要访问的空间在Linear Address Space中的具体位置。我们先把分页管理机制抛开,那么Linear Address Space就和Physical Address Space直接挂钩了。

4、关于分页管理

4.1分页管理机制的概述

列出了上面三个概念的具体解释了以后,让我们继续深入。(本来不想把分页存储机制牵扯进来,可是后来发觉单单讲分段存储机制是说不清楚的。J

在我们写进入保护模式程序的时候,肯定还记得的,在段描述符中我们必须在相应的位上填上段的属性。(比如说:代码段的属性是只读的,数据段的属性是可读写的等等)那么这就有效地保护了各个段,并且段与段之间相互分离。

不得不提到分页管理机制,正如图1所示,当我们的逻辑地址经过计算到了线性地址了以后,(假如说我们的分页管理机制打开了,相关的寄存器会有标记的。)线性地址中的各位与分页机制翻译的具体定义见图2。不管他们中间是怎么过来的,不过我们的页也肯定是可以准确定位到我们的物理地址的。(怎么去定位,这里不是重点故不细讲,重点是怎么实现虚拟存储的。^.^

 

2 线性地址翻译成页

假如我们的分页机制是没有打开的,那么我们的线性地址就直接和物理地址映射。但是在我们的多任务计算机系统中往往都是线性地址要远远大于我们普通的物理地址。(笔者:您知道这是为什么么?一定要理解它的定义哦。)这个机制其实是因为我们虚拟了很多的线性地址(笔者:因为CPU确实是可以访问到的)。而虚拟出来的这些线性地址要想和物理定址对应起来,那么CPU的分页管理机制就派上了用场。

关于这些个虚拟的这些线性地址,就是我们平时口中比较常说的虚拟内存了。(笔者:这里是我个人的理解,不知道对不,不对的话还望知道的前辈指点。)

4.2分页管理机制的具体操作

当我们使用分页管理机制的时候(做了那么多的铺垫,终于讲到你了。>.<),段(segment)被分成了若干个页,而且这些页的空间是相等的,典型的就是每个页是4Kbytes。这些页是被放在了物理内存中,或者是放在了我们的硬盘上,并且会在相应的地方(其实就是page directorypage table)留下自己的踪迹。(方便需要访问这个页的时候去找到它。)当我们的任务(task)或者程序(program)要准备访问一个地址的时候,CPU就会通过上面提到的相应的地方去把线性地址翻译成物理地址。假如目前要访问的地址所在的页就在当前的内存中,这个好说,找到相应的页访问就ok了。我们可以来看看图3的示意图。当前在物理内存中的页前面都被做了标记“1当前没有在物理内存中的页都做了标记“0他们就被存储在硬盘中了。

 

 

3 页的存储方式

糟糕的是,很多时候我们要访问的页却不是在物理内存中的。这个时候CPU就会产生一个错误的提醒来告知CPU本身。(CPU小子,你要找的页目前不在内存MM那里,你看看是不是放假去了,在硬盘外婆那里?)然后CPU就会通过一系列地操作把存储在其他地方的页调到物理内存中来,当然后面的就执行了呗。不过这个虚拟存储机制究竟体现在哪里的虚拟呢?就在这个段选择子(segment selector)上!它才是重点。我们回味一下,《實模式&保護模式》中就有讲,我们回味一下,见图4是段选择子的定义。

 

4 段选择子的定义

从图3中我们可以清楚地看到,index其实就是该段在全局描述符表中的index,也是就是该段在其的位置。这个index一共有13bits,那么理想上来看我们可以再全局描述符中可以定义213  个段,而我们的每一个段最大又可以定义(4Gbytes = 232)的段界限,那么通过这种方法,其实我们的CPU就可以访问到213 * 232 就等246 bytes64 T bytes)的空间了,(因为CPU能够访问的到,所以也是线性地址了哦。这句话也是对网友 gssxd说的,通过这种虚拟存储方式就可以让32CPU访问到64 T bytes的空间了。不知道您理解了么?)

5、虚拟存储机制的类比

说实话,我觉得上面这段话,连我自己写的时候都觉得有点拗口,让人迷糊。但是上面的话,是从书面上讲必须要这样说才符合CPU的访问。但是我天生喜欢比较简单地用比喻的方式来表达我的想法。这次也不例外,实在太难说清楚了,所以就打个比方。这个比方就某高中来说吧。(当然为了方便叙述数据不一定是真的哈^^

5.1假设条件

①某高中目前有10个教室可以供学生上课,(类比于物理地址空间Physical Address Space

②由于每个教室可以容纳50个学生同时上课(类比于页 Page,页的容量是50个人)。那么这10个教室就可以供500个学生同时上课了(物理地址空间Physical Address Space的总大小为500)。

③但是这所高中的全部学生却有5000个(嗯,确实是所不小的中学,这5000就类比于Linear Address Space,很显然在这种情况下线性地址可比物理地址大多了。)

④这个高中的教务处真懒,只会到上课的教室去找人。

5.2教务处怎么运营

5.2.1教务处于CPU的一一类比

经过四个条件的约束,显而易见5000个学生是不能同时在10间教室里上课的。没有办法,教务处(类比于CPU)就安排这样的上课方法,学校把5000个学生以班级分开,每个班级50人(这样恰好可以再一件教室里上课呢)。每个班级都必须要到教务处这里来登记一下,你目前是在上课么?(类比于Pagedirectory)。也很显然,如果在教室上课的教务处一查登记记录就知道了。而不上课的班级就给我统统到操场(类比于硬盘很大的外围空间)以班级为单位(方便要上课的时候一起去教室^^)去看火箭队和湖人队的季后赛直播。

经过以上的安排,那么教务处就可以很轻松地安排这些学生的“上课”地方了了。那我们就来模拟一下这个操作的过程。

5.2.2教务处怎么寻找到一个同学?

教务处(CPU)需要找某个班级中的某个同学,那么首先他就去查在登记记录上他所在的班级是在上课呢?还是在操场呢?如果是在教室,那么他就直接去教室找到他,开处分也好,奖励也好随便他了。假如他所在的班级不在操场,对不起,你们这个班级都给我统统到指定教室等到我,同时之前在教室上课的班级到操场上去放松。如此这般。。。每一个班级教务处可以找到学校里的每一个学生了。

5.2.3得出总结提炼精华

最后我们反过来想想这个教务处一共可以管理多少个学生呢?那么我们就要看他的记录本(全局描述符)的大小了。虽然没有5000个位置同时给这么多学生上课,但是教务处却可以找其他地方的位置来虚拟是教室的位置,来让其他同学都在那里“上课”,这就是虚拟存储机制的精髓。到这里不知道您明白我想要表达的意思了么?


教务处管理学生的总数=记录本里班级的个数*每个班级的学生数

                           =100*50

                           =5000 

有了上面的公式,我们反过来理解CPU能够访问到的所有地址就应该是

 

CPU能够访问到的所有地址=段选择子个数*每个段的最大界限

                                =213 * 232

                                =246 bytes64 Tbytes

 

 

 

 

备注,为什么上面没有写是页的个数,是因为每个段可以分成若干个页,所以我就用段来说明了。这样的话公式就会比较简便。

6、结束

通过这种虚拟的存储方式,CPU就可以更有效地发挥它的效能,不仅如此这还对安全机制又上了一个台阶。虚拟存储机制的好处真的是太多了。关于段与段之间的安全,等等这里就不是讨论的重点了。到这里关于虚拟存储机制的理解就暂时告一段落了,里面加入了一下我自己的元素,如果您觉得比喻或者理解不恰当的地方还希望您向我提出宝贵的意见,我会进一步完善。谢谢!

 

原创粉丝点击