码迷,mamicode.com
首页 > 其他好文 > 详细

操作系统之内存管理(一)

时间:2016-05-13 02:16:01      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

1 操作系统想要管理内存,首先得利用内存。那么如何利用内存呢,在我们程序要执行的时候,我们需要将程序装载到内存中,pc指向开始地址,并且让cpu取址执行,于是我们就利用上了内存。


2那么我们首先考虑一下如何将程序装载到内存中,操作系统会找寻一段空闲的区域,让我们的程序装载进去,而在我们编写的程序中,如call 40,40是一个相对地址,相对于这个程序的偏移量,但是装载到空闲内存的时候,我们又是如何得知,这个40变为多少了呢?这就引出了重定向的概念。如下图,我们希望到内存的时候,call 40变为call 1040 

技术分享 


3 要完成从40到1040的功能,是 重定位完成的功能,而完成重定位 下面有俩种方法,一种是编译的时候就确定了重定位的地址,第二种是载入的时候确定重定位的地址。那么各自有什么特定呢?

3.1 编译的时候重定位:如果在编译的时候就要完成重定位,那么编译一完成,我们就已经确定了装入内存时候的地址,因此只能放在内存中固定的位置,(无法保证该程序调如内存的时候,你编译时候重定位的那段地址是空闲的,不灵活)

3.2 载入的时候重定位:如果是载入的时候重定位,可以保证第一次找到空闲位置,不会出问题,但是在我们现代pc中,进程会经常交换(在内存和外存间),那么第二次的时候,如果再用第一次重定位的地址执行,就会出问题。所以说载入时重定位,程序一旦载入内存就不能动了。这也是不合理的。如下图,第一次进程一睡眠到外存,和唤醒时候进程调入内存的时候,进程一已经不在同一内存了。

技术分享


4 通过第3点,编译时重定位与载入时重定位都是不好使的。于是引出了运行时重定位的概念。

在运行每条时才完成重定位,每个进程都有自己的基地址,存放在PCB(进程描叙符)中,执行指令的第一步先从PCB中取出这个基地址,每执行一条指令都要从逻辑地址算出物理地址(物理地址,内存中实际地址)。如下图:

技术分享


每条指令都要重定位一次,那么效率高吗?是高的,因为这完全是硬件完成!于是解决了我们的问题,一个程序载入内存的时候,首先找到空闲的位置,马上将基地址写入pcb中,每执行一条指令的时候,从pcb中查找基地址(实际上是pcb中的一个进程段表,后面会说到),再加上相对偏移量,就能正确的找到要执行指令的地址。从而完成指令的执行。


5 本节中最后一个问题:一个程序载入内存的时候是将整个程序载入到连续的内存中吗?

答案是否定的。操作系统是允许内存分段载入,这样可以提高内存效率。例如,如果只能整段程序载入,在找寻空闲内存的时候,不一定有连续的一段大的内存可供程序载入,往往实际情况内存中有多个零碎的内存片段,如果能够运行程序分段载入,明显利用效率就会高很多。

分段也能够更有效的管理程序,一段程序中,主程序main代码是只读的,而数据段是可写的(在汇编的时候,我们学过分段,数据段,代码段,堆栈段,便于管理,那么计算机怎么知道那个地方是那个段,因为段的概念是我们人赋予的,计算机是通过当前地址是ss:指向还是ds 指向,看段指针是数据段,还是堆栈段来判断该区域是哪个段)


6 LDT与GDT的引出

从5看出,程序载入内存是分段载入的,如何定位具体指令,通过<段号,段内偏移>,在段中,我们的起始都是从0开始的,这个时候我们一个程序分为不同段载入内存执行的时候,要记录的就不是一个基地址了,而是所有段的基地址,那么这些段的基地址存放在哪里呢?LDT表(进程段表)就出来了,我们记录在LDT中,每次运行,都去LDT表查找基地址,然后加上偏移量,就能正确的定位到具体指令,每个进程都有自己的LDT,这很显然。LDT表保留在PCB中,必须的PCB掌握了进程的所有信息。进程切换或者交换,PCB是跟着切换交换,能够正常保证切换回来和交换回来基地址查找的正确(下图中根据你是哪个段能够立即查找到对应的基地址)技术分享

7 那么GDT是什么呢?

全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。

技术分享

操作系统之内存管理(一)

标签:

原文地址:http://blog.csdn.net/yizhen_acmer/article/details/51345757

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!