段式页式地址映射过程理解
1. 段式虚拟内存
把程序内存空间按照逻辑意义划分为多个段,每段有段名,段的长度不定(如:代码段、数据段、堆栈段)。
程序内存空间 |
---|
堆栈段 |
数据段 |
代码段 |
哪如何表示段式内存空间的一个地址呢?
虚拟地址(VA) = 段基地址(BA) + 段内偏移量(S)
在32位linux系统中,每个进程独占4G的虚拟内存空间,每个进程的内存空间都是独立的,进程是隔离的。
而进程需要运行在物理内存上,但物理内存有限,无法为每个进程都分配4G的物理内存空间。为了解决该问题,需要将进程的虚拟内存按需加载到物理内存上。
按照段式地址表示,当用到某个段时,需要将整个段加载到物理内存上,这样将占用大量的物理内存,而在小的时间片内,进程只用到了其中一小段内存空间,因此会导致物理内存利用率低。
而为了提高物理内存空间利用率,引入了页式虚拟内存。
2. 页式虚拟内存
页式虚拟内存,是将程序的内存空间分成一个个的页,每个页的大小相等。而对应的物理内存空间同样的按照同样大小的页来组织起来。进程页可以直接映射到物理内存页上。
页式内存地址表示:
虚拟内存地址(VA) = 页面基地址(BA)+ 页内偏移(S)= 页号(P) * 页大小(pSize) + 页内偏移(S)
在操作系统中如何管理进程的段和页?
3. 段的管理
在操作系统中,通过段描述符表来管理各个进程的段信息。
段描述符表是由一条条描述符来构成的。而段描述符存在哪些信息呢?
- 段描述符信息:
段描述符表分为:全局描述符表(GDT),局部描述符表(LDT),中断描述符表(IDT)。
- 段描述符表及映射过程:
由此可以知道操作系统中保存了GDT表和LDT表来管理进程的段基地址信息,而通过段选择子寄存器CS来索引到GDT/LDT表中的一条记录(段基地址),再和段内偏移量相加得到物理内存地址,从而完成虚拟地址到线性地址的映射。
在操作系统中的段式地址表示:
段选择子CS(16位) | 偏移量(虚拟地址)(32位) |