L21 内存分区与分页

执行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

可变分区可引发内存碎片问题,总的空闲内存的大小是比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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容