3.18内存使用与分段
date | comments | categories | tags | permalink | title | |||
---|---|---|---|---|---|---|---|---|
2020/3/2 |
true |
|
|
3.18 |
内存使用与分段 |
程序的运行时要把程序从磁盘读入到内存中。但是究竟应该放到内存的哪个位置呢?使用物理地址,很明显不方便。
这时就引入了重定位的概念——修改程序中的地址,也就是说是使用相对地址。
什么时候完成重定位?
1、编译时重定位,程序只能放在固定的位置,常见与嵌入式设备。
2、载入时重定位,程序载入内存之后,就不能移动了。
如果我们载入程序之后还能移动,才能真正方便的使用。
一个重要概念:交换(swap) 闲置的进程可以换到磁盘,需要运行时候换回内存。此时程序在内存中的位置就会发生变化。
为了解决这个问题,最好能在程序之后还能后再内存中移动。
所以最适合重定位的时机应该是运行时:
当程序被载入内存后,会产生一个对应进程的PCB,该程序的基地址保存在PCB中,如此就可以通过基址加偏移地址的方式定位程序位置。
具体过程如下图所示
程序是分段载入内存的,一般情况下包括,代码段,数据段,全局变量初始化区还有一个未初始化区(bss),堆区,栈区。这些内容分开放在不同的位置,并将它们的地址生成一个LDT,然后将LDT放入GDT表中同时放在PCB中。
进程切换的时候通过PCB找到对应进程的各个段的基地址.