装载的两种方式:曾经使用的覆盖装入,现在使用的页映射,都是动态装入,
覆盖装入:将模块按照它们之间的依赖关系组织成树状结构。本质上还是想节约内存,将没有依赖的模块可以覆盖在同一块内存。
页映射:每一个进程立起来的时候分配的空间其实只是先建立一个映射关系,在虚拟地址中根据分区算法等“拿到自己的段”,建立页表,建立对应的页项,此时仍然没有拿到物理内存。等到执行到相应的代码时,发现该页没有影射到物理页,发生页错误,再从文件中读入相应内容到内存,这就真的拿到了内存。
每个进程都有自己的页表段表,进程的段表和页表肯定放在进程的“身份证”--PCB中。
进程的段表:每个进程的段表就是LDT表,LDT段表的基址可以放在特定的寄存器中。
进程的页表:每个进程都有自己的页表,页表的基址依然放在特定的积存器中。
程序分段:段号+偏移:CS+IP给出的是虚拟地址,在保护模式下,CS中放的就是段选择子而非物理地址。
分页的存在,是为了解决内存分区的效率问题。操作系统初始化的时候,会将内存打散成一页一页的。
操作系统的段表就是GDT表,每个进程的段表就是LDT表。
在没有分段的视角下:
编译时重定位:将内存地址提前写死。
载入时重定位:更灵活,但是换入换出后,失效
运行时重定位:base 放在pcb 中,换入换出,pcb 更新base。
标签:可执行文件,LDT,时重,装载,内存,页表,进程,段表 From: https://www.cnblogs.com/wuyun--wy/p/16989541.html