OS-李治军-L20-内存使用与分段
内存使用与分段
计算机如何工作?从内存中取址,cpu执行指令,从内存中取址,cpu执行指令......
内存使用:将程序放在内存当中,并令程序执行起来。但是让程序进入内存时,会发生一些问题,汇编指令的调转地址与物理地址必须一致,如果有两段汇编都要将程序放到0-40的地方,怎么办?这就会发生一些矛盾。
所以必须发生一些修改,将汇编内的逻辑地址重定位为实际的物理地址。
那什么时候完成重定位?一般是载入的时候完成重定位,这样更灵活,但是效率更低一些,如果是编译的时候完成重定位,那还是可能和别人发生冲突,一般只有在定死了每个程序位子的那些嵌入式系统中采用编译重定位。
现在又有一个问题,载入重定位后,程序在内存中的位置是固定不变的,但进程可能发生阻塞,并且内存不够用了,就要发生交换swap,再次换回来的时候可能原位子有有人了,就需要移动程序的位置。
所以,应该是运行重定位,在内存任何地方,程序内的地址都是不变的,都是采用逻辑地址,但需要取地址的时候,就要发生地址翻译的行为【物理地址=逻辑地址+基地址】。
另外:base是放在pcb内的。
首先找到一个空闲内存,把基地址赋予pcb,然后把程序载入,每次寻址的时候就要base+logic。
但是实际中是将整个程序放到一段内存当中吗?
一个程序往往由好多部分组成,每个段都是从0地址开始,具有各自的特点。
不是将整个程序,而是将各段分别放入内存。
此时的寻址是,采用段地址DS+偏移地址,所以要在每个pcb内放入各个段的偏移地址,以及总长等信息,这就形成了段表。
ps:操作系统OS对应的段表就是GDT(grobal descriptor table),每个进程的段表叫做LDT(local descriptor table)。