执行jmp 40这个指令(进程1跳转到2040这个地址,进程2跳转到3040这个地址)。
LDT有个寄存器ldtr。
多进程切换的时候,LDT也要跟着切换,也就是LDTR要跟着修改。
进程切换时候需要切换的映射表,就是LDT。
重要的3步——
- 将程序分成多个段(是编译要做的事情)
- 内存中找一个空闲的分区
- 通过磁盘读写将程序载入进去(设备驱动要做的事)
- 将分好段的程序读入空闲内存中,然后初始化好LDT表(建立地址和内存的映射关系,i.e.映射表),将LDT和PCB关联在一起。
最后通过运行时重定位,通过取指执行,从而让程序执行起来,内存也用起来。
image.png

image.png
image.png

image.png
可变分区更合理一些

image.png
要对可变分区进行管理

image.png
下一个问题,选哪个空闲分区更合适?

image.png

实际问题中,我们不采用分区来分割内存,而是分页。所以争论最佳适配、最差适配这些是没有意义的,这些分区方法是针对于虚拟内存的,就是将程序放到虚拟内存的过程(段对应虚拟内存)。

image.png
可变分区可引发内存碎片问题,总的空闲内存的大小是比160K大的,但是160K这个连续的内存是装不进去的,想要改变需要内存紧缩,但是内存紧缩在user看来会导致死机,所以另一个方法则是将请求的160K分成120K和40K,这种分割的思想引出了分页的思想。

image.png
OS在初始化的时候(mem_map()),就将物理内存分成了页。
分页的好处是不用内存紧缩,最大的内存浪费是4K。
物理内存喜欢分页,因为这样可以减少内存浪费。
用户喜欢分段,因为程序可以被分为1段1段的。
所以要段页结合。

image.png
有段表就有页表。
段表寄存器是ldtr,页表寄存器是 cr3。
地址0x2240变成第几页和offset是MMU来搞的。
页表和PCB要关联。
注意看逻辑地址0x2240是怎么变成0x3240的。

image.png